On Wed, Oct 12, 2016 at 2:26 AM, Pohjolainen, Topi < topi.pohjolai...@gmail.com> wrote:
> 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: > It is. Took me by surprise too. > Reviewed-by: Topi Pohjolainen <topi.pohjolai...@intel.com> > Thanks! > > > + 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