for (unsigned i = 0; i < ZINK_SHADER_COUNT; i++)
init_push_binding(&bindings[i], i, vktype);
init_push_binding(&compute_binding, PIPE_SHADER_COMPUTE, vktype);
+ /* fbfetch */
+ bindings[ZINK_SHADER_COUNT].binding = ZINK_FBFETCH_BINDING;
+ bindings[ZINK_SHADER_COUNT].descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
+ bindings[ZINK_SHADER_COUNT].descriptorCount = 1;
+ bindings[ZINK_SHADER_COUNT].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
+ bindings[ZINK_SHADER_COUNT].pImmutableSamplers = NULL;
enum zink_descriptor_type dsl_type = screen->descriptor_mode == ZINK_DESCRIPTOR_MODE_LAZY &&
screen->info.have_KHR_push_descriptor ? ZINK_DESCRIPTOR_TYPES : ZINK_DESCRIPTOR_TYPE_UBO;
dsls[0] = create_layout(ctx, dsl_type, bindings, ARRAY_SIZE(bindings), &layout_keys[0]);
return false;
}
struct zink_screen *screen = zink_screen(ctx->base.screen);
- VkDescriptorPoolSize sizes;
- sizes.type = screen->descriptor_mode == ZINK_DESCRIPTOR_MODE_LAZY ? VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
- sizes.descriptorCount = ZINK_SHADER_COUNT * ZINK_DEFAULT_MAX_DESCS;
- ctx->dd->push_pool[0] = descriptor_pool_get(ctx, 0, ctx->dd->push_layout_keys[0], &sizes, 1);
- sizes.descriptorCount = ZINK_DEFAULT_MAX_DESCS;
- ctx->dd->push_pool[1] = descriptor_pool_get(ctx, 0, ctx->dd->push_layout_keys[1], &sizes, 1);
+ VkDescriptorPoolSize sizes[2];
+ sizes[0].type = screen->descriptor_mode == ZINK_DESCRIPTOR_MODE_LAZY ? VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
+ sizes[0].descriptorCount = ZINK_SHADER_COUNT * ZINK_DEFAULT_MAX_DESCS;
+ sizes[1].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
+ sizes[1].descriptorCount = ZINK_DEFAULT_MAX_DESCS;
+ ctx->dd->push_pool[0] = descriptor_pool_get(ctx, 0, ctx->dd->push_layout_keys[0], sizes, 2);
+ sizes[0].descriptorCount = ZINK_DEFAULT_MAX_DESCS;
+ ctx->dd->push_pool[1] = descriptor_pool_get(ctx, 0, ctx->dd->push_layout_keys[1], sizes, 1);
return ctx->dd->push_pool[0] && ctx->dd->push_pool[1];
}
wd->dstBinding = shader ? shader->bindings[type][idx].binding : idx;
wd->dstArrayElement = 0;
wd->descriptorCount = shader ? shader->bindings[type][idx].size : 1;
- wd->descriptorType = shader ? shader->bindings[type][idx].type : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
+ wd->descriptorType = shader ? shader->bindings[type][idx].type :
+ idx == ZINK_FBFETCH_BINDING ? VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
wd->dstSet = zds->desc_set;
return num_wds + 1;
}
bool is_compute, bool cache_hit, uint32_t *dynamic_offsets)
{
struct zink_screen *screen = zink_screen(ctx->base.screen);
- VkWriteDescriptorSet wds[ZINK_SHADER_COUNT];
+ VkWriteDescriptorSet wds[ZINK_SHADER_COUNT + 1];
VkDescriptorBufferInfo buffer_infos[ZINK_SHADER_COUNT];
struct zink_shader **stages;
+ bool fbfetch = false;
unsigned num_stages = is_compute ? 1 : ZINK_SHADER_COUNT;
struct zink_program *pg = is_compute ? &ctx->curr_compute->base : &ctx->curr_program->base;
wds[i].pBufferInfo = &buffer_infos[i];
}
}
+ if (unlikely(!cache_hit && !is_compute && ctx->fbfetch_outputs)) {
+ struct zink_resource *res = zink_resource(ctx->fb_state.cbufs[0]->texture);
+ init_write_descriptor(NULL, zds, 0, MESA_SHADER_STAGES, &wds[ZINK_SHADER_COUNT], 0);
+ desc_set_res_add(zds, res, ZINK_SHADER_COUNT, cache_hit);
+ wds[ZINK_SHADER_COUNT].pImageInfo = &ctx->di.fbfetch;
+ fbfetch = true;
+ }
if (!cache_hit)
- vkUpdateDescriptorSets(screen->dev, num_stages, wds, 0, NULL);
+ vkUpdateDescriptorSets(screen->dev, num_stages + !!fbfetch, wds, 0, NULL);
return num_stages;
}
struct zink_descriptor_data_lazy {
struct zink_descriptor_data base;
- VkDescriptorUpdateTemplateEntry push_entries[PIPE_SHADER_TYPES];
+ VkDescriptorUpdateTemplateEntry push_entries[PIPE_SHADER_TYPES]; //gfx+fbfetch
+ VkDescriptorUpdateTemplateEntry compute_push_entry;
bool push_state_changed[2]; //gfx, compute
uint8_t state_changed[2]; //gfx, compute
};
VkDescriptorUpdateTemplateEntry entries[ZINK_DESCRIPTOR_TYPES][PIPE_SHADER_TYPES * 32];
unsigned num_bindings[ZINK_DESCRIPTOR_TYPES] = {0};
uint8_t has_bindings = 0;
+ unsigned push_count = 0;
struct zink_shader **stages;
if (pg->is_compute)
stages = &((struct zink_compute_program*)pg)->shader;
- else
+ else {
stages = ((struct zink_gfx_program*)pg)->shaders;
+ if (stages[PIPE_SHADER_FRAGMENT]->nir->info.fs.uses_fbfetch_output)
+ push_count = 1;
+ }
if (!pg->dd)
pg->dd = (void*)rzalloc(pg, struct zink_program_descriptor_data);
if (!pg->dd)
return false;
- unsigned push_count = 0;
unsigned entry_idx[ZINK_DESCRIPTOR_TYPES] = {0};
unsigned num_shaders = pg->is_compute ? 1 : ZINK_SHADER_COUNT;
/* number of descriptors in template */
unsigned wd_count[ZINK_DESCRIPTOR_TYPES + 1];
if (push_count)
- wd_count[0] = pg->is_compute ? 1 : ZINK_SHADER_COUNT;
+ wd_count[0] = pg->is_compute ? 1 : (ZINK_SHADER_COUNT + 1);
for (unsigned i = 0; i < ZINK_DESCRIPTOR_TYPES; i++)
wd_count[i + 1] = pg->dd->layout_key[i] ? pg->dd->layout_key[i]->num_descriptors : 0;
VkDescriptorUpdateTemplateEntry *push_entries[2] = {
dd_lazy(ctx)->push_entries,
- &dd_lazy(ctx)->push_entries[PIPE_SHADER_COMPUTE],
+ &dd_lazy(ctx)->compute_push_entry,
};
for (unsigned i = 0; i < pg->num_dsl; i++) {
bool is_push = i == 0;
create_push_pool(struct zink_screen *screen, struct zink_batch_descriptor_data_lazy *bdd, bool is_compute)
{
struct zink_descriptor_pool *pool = rzalloc(bdd, struct zink_descriptor_pool);
- VkDescriptorPoolSize sizes;
- sizes.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ VkDescriptorPoolSize sizes[2];
+ sizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
if (is_compute)
- sizes.descriptorCount = ZINK_DEFAULT_MAX_DESCS;
- else
- sizes.descriptorCount = ZINK_SHADER_COUNT * ZINK_DEFAULT_MAX_DESCS;
- pool->pool = create_pool(screen, 1, &sizes, 0);
+ sizes[0].descriptorCount = ZINK_DEFAULT_MAX_DESCS;
+ else {
+ sizes[0].descriptorCount = ZINK_SHADER_COUNT * ZINK_DEFAULT_MAX_DESCS;
+ sizes[1].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
+ sizes[1].descriptorCount = ZINK_DEFAULT_MAX_DESCS;
+ }
+ pool->pool = create_pool(screen, 1 + !is_compute, sizes, 0);
return pool;
}
if (screen->descriptor_mode == ZINK_DESCRIPTOR_MODE_NOTEMPLATES)
printf("ZINK: CACHED/NOTEMPLATES DESCRIPTORS\n");
else if (screen->info.have_KHR_descriptor_update_template) {
- for (unsigned i = 0; i < PIPE_SHADER_TYPES; i++) {
+ for (unsigned i = 0; i < ZINK_SHADER_COUNT; i++) {
VkDescriptorUpdateTemplateEntry *entry = &dd_lazy(ctx)->push_entries[i];
init_push_template_entry(entry, i);
}
+ init_push_template_entry(&dd_lazy(ctx)->compute_push_entry, PIPE_SHADER_COMPUTE);
+ VkDescriptorUpdateTemplateEntry *entry = &dd_lazy(ctx)->push_entries[ZINK_SHADER_COUNT]; //fbfetch
+ entry->dstBinding = ZINK_FBFETCH_BINDING;
+ entry->descriptorCount = 1;
+ entry->descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
+ entry->offset = offsetof(struct zink_context, di.fbfetch);
+ entry->stride = sizeof(VkDescriptorImageInfo);
if (screen->descriptor_mode == ZINK_DESCRIPTOR_MODE_LAZY)
printf("ZINK: USING LAZY DESCRIPTORS\n");
}