diff options
author | Jason Ekstrand <[email protected]> | 2016-10-21 17:13:51 -0700 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2016-11-16 10:11:29 -0800 |
commit | 9fcaf4e37a14316a63bec08c7d80af8e2251cc44 (patch) | |
tree | 225bf31f918d403f2056f81a4856e8410c0ad702 /src/intel/vulkan/anv_blorp.c | |
parent | e371850d94cf8cf9df678233d64411c783d95668 (diff) |
anv/blorp: Use the new clear_attachments entrypoint for attachment clears
This allows us to re-use the surface states emitted from the Vulkan driver
instead of blorp creating its own.
Signed-off-by: Jason Ekstrand <[email protected]>
Reviewed-by: Topi Pohjolainen <[email protected]>
Diffstat (limited to 'src/intel/vulkan/anv_blorp.c')
-rw-r--r-- | src/intel/vulkan/anv_blorp.c | 91 |
1 files changed, 50 insertions, 41 deletions
diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index 3c415902aa4..ae746ed9b2d 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -909,38 +909,51 @@ anv_cmd_buffer_alloc_blorp_binding_table(struct anv_cmd_buffer *cmd_buffer, return bt_state; } +static uint32_t +binding_table_for_surface_state(struct anv_cmd_buffer *cmd_buffer, + struct anv_state surface_state) +{ + uint32_t state_offset; + struct anv_state bt_state = + anv_cmd_buffer_alloc_blorp_binding_table(cmd_buffer, 1, &state_offset); + + uint32_t *bt_map = bt_state.map; + bt_map[0] = surface_state.offset + state_offset; + + return bt_state.offset; +} + static void clear_color_attachment(struct anv_cmd_buffer *cmd_buffer, struct blorp_batch *batch, const VkClearAttachment *attachment, uint32_t rectCount, const VkClearRect *pRects) { - const struct anv_framebuffer *fb = cmd_buffer->state.framebuffer; const struct anv_subpass *subpass = cmd_buffer->state.subpass; - const uint32_t att = attachment->colorAttachment; - const struct anv_image_view *iview = - fb->attachments[subpass->color_attachments[att]]; - const struct anv_image *image = iview->image; + const uint32_t color_att = attachment->colorAttachment; + const uint32_t att_idx = subpass->color_attachments[color_att]; + struct anv_render_pass_attachment *pass_att = + &cmd_buffer->state.pass->attachments[att_idx]; + struct anv_attachment_state *att_state = + &cmd_buffer->state.attachments[att_idx]; - struct blorp_surf surf; - get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_COLOR_BIT, &surf); + uint32_t binding_table = + binding_table_for_surface_state(cmd_buffer, att_state->color_rt_state); union isl_color_value clear_color; memcpy(clear_color.u32, attachment->clearValue.color.uint32, sizeof(clear_color.u32)); - static const bool color_write_disable[4] = { false, false, false, false }; - for (uint32_t r = 0; r < rectCount; ++r) { const VkOffset2D offset = pRects[r].rect.offset; const VkExtent2D extent = pRects[r].rect.extent; - blorp_clear(batch, &surf, iview->isl.format, iview->isl.swizzle, - iview->isl.base_level, - iview->isl.base_array_layer + pRects[r].baseArrayLayer, - pRects[r].layerCount, - offset.x, offset.y, - offset.x + extent.width, offset.y + extent.height, - clear_color, color_write_disable); + blorp_clear_attachments(batch, binding_table, + ISL_FORMAT_UNSUPPORTED, pass_att->samples, + pRects[r].baseArrayLayer, + pRects[r].layerCount, + offset.x, offset.y, + offset.x + extent.width, offset.y + extent.height, + true, clear_color, false, 0.0f, 0, 0); } } @@ -950,44 +963,40 @@ clear_depth_stencil_attachment(struct anv_cmd_buffer *cmd_buffer, const VkClearAttachment *attachment, uint32_t rectCount, const VkClearRect *pRects) { - const struct anv_framebuffer *fb = cmd_buffer->state.framebuffer; + static const union isl_color_value color_value = { .u32 = { 0, } }; const struct anv_subpass *subpass = cmd_buffer->state.subpass; - const struct anv_image_view *iview = - fb->attachments[subpass->depth_stencil_attachment]; - const struct anv_image *image = iview->image; + const uint32_t att_idx = subpass->depth_stencil_attachment; + struct anv_render_pass_attachment *pass_att = + &cmd_buffer->state.pass->attachments[att_idx]; bool clear_depth = attachment->aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT; bool clear_stencil = attachment->aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT; - struct blorp_surf depth, stencil; + enum isl_format depth_format = ISL_FORMAT_UNSUPPORTED; if (clear_depth) { - get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_DEPTH_BIT, - &depth); - } else { - memset(&depth, 0, sizeof(depth)); + depth_format = anv_get_isl_format(&cmd_buffer->device->info, + pass_att->format, + VK_IMAGE_ASPECT_DEPTH_BIT, + VK_IMAGE_TILING_OPTIMAL); } - if (clear_stencil) { - get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_STENCIL_BIT, - &stencil); - } else { - memset(&stencil, 0, sizeof(stencil)); - } + uint32_t binding_table = + binding_table_for_surface_state(cmd_buffer, + cmd_buffer->state.null_surface_state); for (uint32_t r = 0; r < rectCount; ++r) { const VkOffset2D offset = pRects[r].rect.offset; const VkExtent2D extent = pRects[r].rect.extent; VkClearDepthStencilValue value = attachment->clearValue.depthStencil; - blorp_clear_depth_stencil(batch, &depth, &stencil, - iview->isl.base_level, - iview->isl.base_array_layer + - pRects[r].baseArrayLayer, - pRects[r].layerCount, - offset.x, offset.y, - offset.x + extent.width, - offset.y + extent.height, - clear_depth, value.depth, - clear_stencil ? 0xff : 0, value.stencil); + blorp_clear_attachments(batch, binding_table, + depth_format, pass_att->samples, + pRects[r].baseArrayLayer, + pRects[r].layerCount, + offset.x, offset.y, + offset.x + extent.width, offset.y + extent.height, + false, color_value, + clear_depth, value.depth, + clear_stencil ? 0xff : 0, value.stencil); } } |