.disable_viewport = true,
.use_rectlist = true
},
- &device->clear_state.pipeline);
+ &device->meta_state.clear.pipeline);
anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_SHADER, fs);
-
- anv_CreateDynamicRasterState((VkDevice) device,
- &(VkDynamicRsStateCreateInfo) {
- .sType = VK_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO,
- },
- &device->clear_state.rs_state);
-
- anv_CreateDynamicColorBlendState((VkDevice) device,
- &(VkDynamicCbStateCreateInfo) {
- .sType = VK_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO
- },
- &device->clear_state.cb_state);
-
}
#define NUM_VB_USED 2
struct anv_saved_state {
- struct anv_bindings bindings;
- struct anv_bindings *old_bindings;
+ struct anv_vertex_binding old_vertex_bindings[NUM_VB_USED];
+ struct anv_descriptor_set *old_descriptor_set0;
struct anv_pipeline *old_pipeline;
VkDynamicCbState cb_state;
};
anv_cmd_buffer_save(struct anv_cmd_buffer *cmd_buffer,
struct anv_saved_state *state)
{
- state->old_bindings = cmd_buffer->bindings;
- cmd_buffer->bindings = &state->bindings;
state->old_pipeline = cmd_buffer->pipeline;
+ state->old_descriptor_set0 = cmd_buffer->descriptors[0].set;
+ memcpy(state->old_vertex_bindings, cmd_buffer->vertex_bindings,
+ sizeof(state->old_vertex_bindings));
}
static void
anv_cmd_buffer_restore(struct anv_cmd_buffer *cmd_buffer,
const struct anv_saved_state *state)
{
- cmd_buffer->bindings = state->old_bindings;
cmd_buffer->pipeline = state->old_pipeline;
+ cmd_buffer->descriptors[0].set = state->old_descriptor_set0;
+ memcpy(cmd_buffer->vertex_bindings, state->old_vertex_bindings,
+ sizeof(state->old_vertex_bindings));
cmd_buffer->vb_dirty |= (1 << NUM_VB_USED) - 1;
- cmd_buffer->dirty |= ANV_CMD_BUFFER_PIPELINE_DIRTY |
- ANV_CMD_BUFFER_DESCRIPTOR_SET_DIRTY;
-}
-
-static void
-anv_cmd_buffer_copy_render_targets(struct anv_cmd_buffer *cmd_buffer,
- struct anv_saved_state *state)
-{
- struct anv_framebuffer *fb = cmd_buffer->framebuffer;
- struct anv_bindings *old_bindings = state->old_bindings;
- struct anv_bindings *bindings = cmd_buffer->bindings;
-
- for (uint32_t i = 0; i < fb->color_attachment_count; i++) {
- bindings->descriptors[VK_SHADER_STAGE_FRAGMENT].surfaces[i] =
- old_bindings->descriptors[VK_SHADER_STAGE_FRAGMENT].surfaces[i];
- }
-
- cmd_buffer->dirty |= ANV_CMD_BUFFER_DESCRIPTOR_SET_DIRTY;
+ cmd_buffer->dirty |= ANV_CMD_BUFFER_PIPELINE_DIRTY;
+ cmd_buffer->descriptors_dirty |= VK_SHADER_STAGE_VERTEX_BIT;
}
struct vue_header {
};
anv_cmd_buffer_save(cmd_buffer, &saved_state);
- anv_cmd_buffer_copy_render_targets(cmd_buffer, &saved_state);
anv_CmdBindVertexBuffers((VkCmdBuffer) cmd_buffer, 0, 2,
(VkBuffer[]) {
sizeof(vertex_data)
});
- if ((VkPipeline) cmd_buffer->pipeline != device->clear_state.pipeline)
+ if ((VkPipeline) cmd_buffer->pipeline != device->meta_state.clear.pipeline)
anv_CmdBindPipeline((VkCmdBuffer) cmd_buffer,
- VK_PIPELINE_BIND_POINT_GRAPHICS, device->clear_state.pipeline);
+ VK_PIPELINE_BIND_POINT_GRAPHICS,
+ device->meta_state.clear.pipeline);
/* We don't need anything here, only set if not already set. */
if (cmd_buffer->rs_state == NULL)
anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
VK_STATE_BIND_POINT_RASTER,
- device->clear_state.rs_state);
+ device->meta_state.shared.rs_state);
if (cmd_buffer->vp_state == NULL)
anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
VK_STATE_BIND_POINT_VIEWPORT,
cmd_buffer->framebuffer->vp_state);
+ if (cmd_buffer->ds_state == NULL)
+ anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
+ VK_STATE_BIND_POINT_DEPTH_STENCIL,
+ device->meta_state.shared.ds_state);
+
+ if (cmd_buffer->cb_state == NULL)
+ anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
+ VK_STATE_BIND_POINT_COLOR_BLEND,
+ device->meta_state.shared.cb_state);
+
anv_CmdDraw((VkCmdBuffer) cmd_buffer, 0, 3, 0, pass->num_clear_layers);
/* Restore API state */
}
};
anv_CreateDescriptorSetLayout((VkDevice) device, &ds_layout_info,
- &device->blit_state.ds_layout);
+ &device->meta_state.blit.ds_layout);
- VkPipelineLayoutCreateInfo pipeline_layout_info = {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
- .descriptorSetCount = 1,
- .pSetLayouts = &device->blit_state.ds_layout,
- };
-
- VkPipelineLayout pipeline_layout;
- anv_CreatePipelineLayout((VkDevice) device, &pipeline_layout_info,
- &pipeline_layout);
+ anv_CreatePipelineLayout((VkDevice) device,
+ &(VkPipelineLayoutCreateInfo) {
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
+ .descriptorSetCount = 1,
+ .pSetLayouts = &device->meta_state.blit.ds_layout,
+ },
+ &device->meta_state.blit.pipeline_layout);
VkPipelineRsStateCreateInfo rs_create_info = {
.sType = VK_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
.pNext = &cb_create_info,
.flags = 0,
- .layout = pipeline_layout,
+ .layout = device->meta_state.blit.pipeline_layout,
};
anv_pipeline_create((VkDevice) device, &pipeline_info,
.disable_vs = true,
.use_rectlist = true
},
- &device->blit_state.pipeline);
+ &device->meta_state.blit.pipeline);
anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_SHADER, vs);
anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_SHADER, fs);
-
- anv_CreateDynamicRasterState((VkDevice) device,
- &(VkDynamicRsStateCreateInfo) {
- .sType = VK_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO,
- },
- &device->blit_state.rs_state);
}
static void
anv_cmd_buffer_save(cmd_buffer, saved_state);
- if ((VkPipeline) cmd_buffer->pipeline != device->blit_state.pipeline)
+ if ((VkPipeline) cmd_buffer->pipeline != device->meta_state.blit.pipeline)
anv_CmdBindPipeline((VkCmdBuffer) cmd_buffer,
VK_PIPELINE_BIND_POINT_GRAPHICS,
- device->blit_state.pipeline);
+ device->meta_state.blit.pipeline);
/* We don't need anything here, only set if not already set. */
if (cmd_buffer->rs_state == NULL)
anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
VK_STATE_BIND_POINT_RASTER,
- device->blit_state.rs_state);
+ device->meta_state.shared.rs_state);
+ if (cmd_buffer->ds_state == NULL)
+ anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
+ VK_STATE_BIND_POINT_DEPTH_STENCIL,
+ device->meta_state.shared.ds_state);
saved_state->cb_state = (VkDynamicCbState) cmd_buffer->cb_state;
anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
VK_STATE_BIND_POINT_COLOR_BLEND,
- device->blit_state.cb_state);
+ device->meta_state.shared.cb_state);
}
struct blit_region {
VkDescriptorSet set;
anv_AllocDescriptorSets((VkDevice) device, 0 /* pool */,
VK_DESCRIPTOR_SET_USAGE_ONE_SHOT,
- 1, &device->blit_state.ds_layout, &set, &count);
+ 1, &device->meta_state.blit.ds_layout, &set, &count);
anv_UpdateDescriptors((VkDevice) device, set, 1,
(const void * []) {
&(VkUpdateImages) {
anv_CmdDraw((VkCmdBuffer) cmd_buffer, 0, 3, 0, 1);
anv_CmdEndRenderPass((VkCmdBuffer) cmd_buffer, pass);
+
+ /* At the point where we emit the draw call, all data from the
+ * descriptor sets, etc. has been used. We are free to delete it.
+ */
+ anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_DESCRIPTOR_SET, set);
+ anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_FRAMEBUFFER,
+ (VkFramebuffer) fb);
+ anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_RENDER_PASS, pass);
}
static void
&dest_view,
(VkOffset3D) { 0, 0, 0 },
(VkExtent3D) { width, height, 1 });
+
+ anv_DestroyObject(vk_device, VK_OBJECT_TYPE_IMAGE, (VkImage) src_image);
+ anv_DestroyObject(vk_device, VK_OBJECT_TYPE_IMAGE, (VkImage) dest_image);
}
void anv_CmdCopyBuffer(
&dest_view,
pRegions[r].imageOffset,
pRegions[r].imageExtent);
+
+ anv_DestroyObject(vk_device, VK_OBJECT_TYPE_IMAGE, (VkImage) src_image);
}
meta_finish_blit(cmd_buffer, &saved_state);
&dest_view,
(VkOffset3D) { 0, 0, 0 },
pRegions[r].imageExtent);
+
+ anv_DestroyObject(vk_device, VK_OBJECT_TYPE_IMAGE, (VkImage) dest_image);
}
meta_finish_blit(cmd_buffer, &saved_state);
{
anv_device_init_meta_clear_state(device);
anv_device_init_meta_blit_state(device);
+
+ anv_CreateDynamicRasterState((VkDevice) device,
+ &(VkDynamicRsStateCreateInfo) {
+ .sType = VK_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO,
+ },
+ &device->meta_state.shared.rs_state);
+
+ anv_CreateDynamicColorBlendState((VkDevice) device,
+ &(VkDynamicCbStateCreateInfo) {
+ .sType = VK_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO
+ },
+ &device->meta_state.shared.cb_state);
+
+ anv_CreateDynamicDepthStencilState((VkDevice) device,
+ &(VkDynamicDsStateCreateInfo) {
+ .sType = VK_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO
+ },
+ &device->meta_state.shared.ds_state);
+}
+
+void
+anv_device_finish_meta(struct anv_device *device)
+{
+ /* Clear */
+ anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_PIPELINE,
+ device->meta_state.clear.pipeline);
+
+ /* Blit */
+ anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_PIPELINE,
+ device->meta_state.blit.pipeline);
+ anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_PIPELINE_LAYOUT,
+ device->meta_state.blit.pipeline_layout);
+ anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT,
+ device->meta_state.blit.ds_layout);
+
+ /* Shared */
+ anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_DYNAMIC_RS_STATE,
+ device->meta_state.shared.rs_state);
+ anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_DYNAMIC_CB_STATE,
+ device->meta_state.shared.cb_state);
+ anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_DYNAMIC_DS_STATE,
+ device->meta_state.shared.ds_state);
}