On Fri, Oct 07, 2016 at 09:41:15PM -0700, Jason Ekstrand wrote: > Signed-off-by: Jason Ekstrand <ja...@jlekstrand.net> > --- > src/intel/vulkan/anv_blorp.c | 113 > ++++++++++++++++++++++++++++++++++++++ > src/intel/vulkan/anv_meta_clear.c | 24 -------- > 2 files changed, 113 insertions(+), 24 deletions(-) > > diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c > index 546737b..4279f62 100644 > --- a/src/intel/vulkan/anv_blorp.c > +++ b/src/intel/vulkan/anv_blorp.c > @@ -870,6 +870,119 @@ void anv_CmdClearDepthStencilImage( > } > > 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; > + > + struct blorp_surf surf; > + get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_COLOR_BIT, &surf); > + > + 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,
I'm not that familiar with vulkan yet and looking emit_color_clear() does not directly tell me if "pRects[r].baseArrayLayer" is relative to the view base layer. If that is the case then this patch looks good to me: Reviewed-by: Topi Pohjolainen <topi.pohjolai...@intel.com> > + pRects[r].layerCount, > + offset.x, offset.y, > + offset.x + extent.width, offset.y + extent.height, > + clear_color, color_write_disable); > + } > +} > + > +static void > +clear_depth_stencil_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 struct anv_image_view *iview = > + fb->attachments[subpass->depth_stencil_attachment]; > + const struct anv_image *image = iview->image; > + > + bool clear_depth = attachment->aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT; > + bool clear_stencil = attachment->aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT; These two could be const. > + > + struct blorp_surf depth, stencil; > + if (clear_depth) { > + get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_DEPTH_BIT, > + &depth); > + } else { > + memset(&depth, 0, sizeof(depth)); > + } > + > + if (clear_stencil) { > + get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_STENCIL_BIT, > + &stencil); > + } else { > + memset(&stencil, 0, sizeof(stencil)); > + } > + > + 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, value.stencil); > + } > +} > + > +void anv_CmdClearAttachments( > + VkCommandBuffer commandBuffer, > + uint32_t attachmentCount, > + const VkClearAttachment* pAttachments, > + uint32_t rectCount, > + const VkClearRect* pRects) > +{ > + ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); > + > + /* Because this gets called within a render pass, we tell blorp not to > + * trash our depth and stencil buffers. > + */ > + struct blorp_batch batch; > + blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, > + BLORP_BATCH_NO_EMIT_DEPTH_STENCIL); > + > + for (uint32_t a = 0; a < attachmentCount; ++a) { > + if (pAttachments[a].aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) { > + clear_color_attachment(cmd_buffer, &batch, > + &pAttachments[a], > + rectCount, pRects); > + } else { > + clear_depth_stencil_attachment(cmd_buffer, &batch, > + &pAttachments[a], > + rectCount, pRects); > + } > + } > + > + blorp_batch_finish(&batch); > +} > + > +static void > resolve_image(struct blorp_batch *batch, > const struct anv_image *src_image, > uint32_t src_level, uint32_t src_layer, > diff --git a/src/intel/vulkan/anv_meta_clear.c > b/src/intel/vulkan/anv_meta_clear.c > index ce7f8a7..6802229 100644 > --- a/src/intel/vulkan/anv_meta_clear.c > +++ b/src/intel/vulkan/anv_meta_clear.c > @@ -751,27 +751,3 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer > *cmd_buffer) > > meta_clear_end(&saved_state, cmd_buffer); > } > - > -void anv_CmdClearAttachments( > - VkCommandBuffer commandBuffer, > - uint32_t attachmentCount, > - const VkClearAttachment* pAttachments, > - uint32_t rectCount, > - const VkClearRect* pRects) > -{ > - ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); > - struct anv_meta_saved_state saved_state; > - > - meta_clear_begin(&saved_state, cmd_buffer); > - > - /* FINISHME: We can do better than this dumb loop. It thrashes too much > - * state. > - */ > - for (uint32_t a = 0; a < attachmentCount; ++a) { > - for (uint32_t r = 0; r < rectCount; ++r) { > - emit_clear(cmd_buffer, &pAttachments[a], &pRects[r]); > - } > - } > - > - meta_clear_end(&saved_state, cmd_buffer); > -} > -- > 2.5.0.400.gff86faf > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev