summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/broadcom/vulkan/v3dv_meta_copy.c65
1 files changed, 38 insertions, 27 deletions
diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c
index b623954f0c5..063481f824c 100644
--- a/src/broadcom/vulkan/v3dv_meta_copy.c
+++ b/src/broadcom/vulkan/v3dv_meta_copy.c
@@ -2224,7 +2224,7 @@ format_needs_software_int_clamp(VkFormat format)
}
static void
-get_blit_pipeline_cache_key(VkImageAspectFlags aspect,
+get_blit_pipeline_cache_key(VkImageAspectFlags aspects,
VkFormat dst_format,
VkFormat src_format,
uint8_t *key)
@@ -2249,7 +2249,7 @@ get_blit_pipeline_cache_key(VkImageAspectFlags aspect,
*p = format_needs_software_int_clamp(dst_format) ? src_format : 0;
p++;
- *p = aspect;
+ *p = aspects;
p++;
assert(((uint8_t*)p - key) == V3DV_META_BLIT_CACHE_KEY_SIZE);
@@ -2303,12 +2303,12 @@ create_blit_pipeline_layout(struct v3dv_device *device,
static bool
create_blit_render_pass(struct v3dv_device *device,
- VkImageAspectFlags aspect,
+ VkImageAspectFlags aspects,
VkFormat dst_format,
VkFormat src_format,
VkRenderPass *pass)
{
- const bool is_color_blit = aspect == VK_IMAGE_ASPECT_COLOR_BIT;
+ const bool is_color_blit = aspects == VK_IMAGE_ASPECT_COLOR_BIT;
/* FIXME: if blitting to tile boundaries or to the whole image, we could
* use LOAD_DONT_CARE, but then we would have to include that in the
@@ -2768,6 +2768,7 @@ create_blit_pipeline(struct v3dv_device *device,
VkImageAspectFlags aspect,
VkFormat dst_format,
VkFormat src_format,
+ VkColorComponentFlags cmask,
VkImageType src_type,
VkRenderPass _pass,
VkPipelineLayout pipeline_layout,
@@ -2775,13 +2776,17 @@ create_blit_pipeline(struct v3dv_device *device,
{
struct v3dv_render_pass *pass = v3dv_render_pass_from_handle(_pass);
- /* Depth/stencil blits require that src/dst formats are the same */
- assert(aspect == VK_IMAGE_ASPECT_COLOR_BIT || src_format == dst_format);
+ /* Depth/stencil blits require that src/dst formats are the same. In our
+ * case, any time we are asked to blit stencil (with or without depth) we
+ * turn it into a (possibly color-masked) RGBA8UI color blit, so here
+ * we only ever see color or depth blits.
+ */
+ assert(aspect == VK_IMAGE_ASPECT_COLOR_BIT ||
+ (aspect == VK_IMAGE_ASPECT_DEPTH_BIT && src_format == dst_format));
const enum glsl_sampler_dim sampler_dim =
get_sampler_dim_for_image_type(src_type);
- /* We implement stencil blits as a masked RGB8UI blit */
nir_shader *vs_nir = get_blit_vs();
nir_shader *fs_nir = aspect == VK_IMAGE_ASPECT_DEPTH_BIT ?
get_depth_blit_fs(device, dst_format, sampler_dim) :
@@ -2805,13 +2810,8 @@ create_blit_pipeline(struct v3dv_device *device,
VkPipelineColorBlendAttachmentState blend_att_state[1] = { 0 };
blend_att_state[0] = (VkPipelineColorBlendAttachmentState) {
.blendEnable = false,
- .colorWriteMask = VK_COLOR_COMPONENT_R_BIT |
- VK_COLOR_COMPONENT_G_BIT |
- VK_COLOR_COMPONENT_B_BIT |
- VK_COLOR_COMPONENT_A_BIT,
+ .colorWriteMask = cmask,
};
- if (aspect == VK_IMAGE_ASPECT_STENCIL_BIT)
- blend_att_state[0].colorWriteMask = VK_COLOR_COMPONENT_R_BIT;
const VkPipelineColorBlendStateCreateInfo cb_state = {
.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
@@ -2842,7 +2842,7 @@ create_blit_pipeline(struct v3dv_device *device,
*/
static bool
get_blit_pipeline(struct v3dv_device *device,
- VkImageAspectFlags *aspect,
+ VkImageAspectFlags *aspects,
VkFormat *dst_format,
VkFormat *src_format,
VkImageType src_type,
@@ -2861,7 +2861,7 @@ get_blit_pipeline(struct v3dv_device *device,
return false;
uint8_t key[V3DV_META_BLIT_CACHE_KEY_SIZE];
- get_blit_pipeline_cache_key(*aspect, *dst_format, *src_format, key);
+ get_blit_pipeline_cache_key(*aspects, *dst_format, *src_format, key);
mtx_lock(&device->meta.mtx);
struct hash_entry *entry =
_mesa_hash_table_search(device->meta.blit.cache[src_type], &key);
@@ -2869,11 +2869,13 @@ get_blit_pipeline(struct v3dv_device *device,
mtx_unlock(&device->meta.mtx);
*pipeline = entry->data;
- /* We implement stencil aspect blits with a color pipeline */
- if (*aspect == VK_IMAGE_ASPECT_STENCIL_BIT) {
+ /* We implement stencil aspect (and stencil+depth) blits with a
+ * color pipeline.
+ */
+ if (*aspects & VK_IMAGE_ASPECT_STENCIL_BIT) {
*dst_format = VK_FORMAT_R8G8B8A8_UINT;
*src_format = VK_FORMAT_R8G8B8A8_UINT;
- *aspect = VK_IMAGE_ASPECT_COLOR_BIT;
+ *aspects = VK_IMAGE_ASPECT_COLOR_BIT;
}
return true;
@@ -2885,22 +2887,31 @@ get_blit_pipeline(struct v3dv_device *device,
if (*pipeline == NULL)
goto fail;
- /* We implement stencil aspect blits with a color pipeline */
- if (*aspect == VK_IMAGE_ASPECT_STENCIL_BIT) {
+ /* We implement stencil aspect (and stencil+depth) blits with a
+ * color pipeline.
+ */
+ VkColorComponentFlags cmask = VK_COLOR_COMPONENT_R_BIT |
+ VK_COLOR_COMPONENT_G_BIT |
+ VK_COLOR_COMPONENT_B_BIT |
+ VK_COLOR_COMPONENT_A_BIT;
+ if (*aspects & VK_IMAGE_ASPECT_STENCIL_BIT) {
*dst_format = VK_FORMAT_R8G8B8A8_UINT;
*src_format = VK_FORMAT_R8G8B8A8_UINT;
- *aspect = VK_IMAGE_ASPECT_COLOR_BIT;
+ if (!(*aspects & VK_IMAGE_ASPECT_DEPTH_BIT))
+ cmask = VK_COLOR_COMPONENT_R_BIT;
+ *aspects = VK_IMAGE_ASPECT_COLOR_BIT;
}
- ok = create_blit_render_pass(device, *aspect, *dst_format, *src_format,
+ ok = create_blit_render_pass(device, *aspects, *dst_format, *src_format,
&(*pipeline)->pass);
if (!ok)
goto fail;
ok = create_blit_pipeline(device,
- *aspect,
+ *aspects,
*dst_format,
*src_format,
+ cmask,
src_type,
(*pipeline)->pass,
device->meta.blit.playout,
@@ -3092,10 +3103,10 @@ blit_shader(struct v3dv_cmd_buffer *cmd_buffer,
ensure_meta_blit_descriptor_pool(cmd_buffer);
/* Get the blit pipeline */
- VkImageAspectFlags aspect = region->dstSubresource.aspectMask;
+ VkImageAspectFlags aspects = region->dstSubresource.aspectMask;
struct v3dv_meta_blit_pipeline *pipeline = NULL;
bool ok = get_blit_pipeline(cmd_buffer->device,
- &aspect, &dst_format, &src_format, src->type,
+ &aspects, &dst_format, &src_format, src->type,
&pipeline);
if (!ok)
return false;
@@ -3121,7 +3132,7 @@ blit_shader(struct v3dv_cmd_buffer *cmd_buffer,
.viewType = v3dv_image_type_to_view_type(dst->type),
.format = dst_format,
.subresourceRange = {
- .aspectMask = aspect,
+ .aspectMask = aspects,
.baseMipLevel = region->dstSubresource.mipLevel,
.levelCount = 1,
.baseArrayLayer = min_dst_layer + i,
@@ -3204,7 +3215,7 @@ blit_shader(struct v3dv_cmd_buffer *cmd_buffer,
.viewType = v3dv_image_type_to_view_type(src->type),
.format = src_format,
.subresourceRange = {
- .aspectMask = aspect,
+ .aspectMask = aspects,
.baseMipLevel = region->srcSubresource.mipLevel,
.levelCount = 1,
.baseArrayLayer =