From: Mike Blumenkrantz Date: Thu, 5 Jan 2023 21:28:33 +0000 (-0500) Subject: zink: track depth swizzle on samplerviews X-Git-Tag: upstream/23.3.3~14170 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f62ccaacb8035afe8f356bb96faa285682ec961e;p=platform%2Fupstream%2Fmesa.git zink: track depth swizzle on samplerviews this will provide info for shader rewrites Part-of: --- diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 9002922..ebe6994 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -1022,6 +1022,19 @@ zink_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *pres, ivci.components.b = zink_component_mapping(clamp_zs_swizzle(sampler_view->base.swizzle_b)); ivci.components.a = zink_component_mapping(clamp_zs_swizzle(sampler_view->base.swizzle_a)); } + if (ivci.subresourceRange.aspectMask == VK_IMAGE_ASPECT_DEPTH_BIT) { + VkComponentSwizzle *swizzle = (VkComponentSwizzle*)&ivci.components; + for (unsigned i = 0; i < 4; i++) { + /* these require shader rewrites to correctly emulate */ + if (swizzle[i] == VK_COMPONENT_SWIZZLE_ONE || swizzle[i] == VK_COMPONENT_SWIZZLE_ZERO) + sampler_view->shadow_needs_shader_swizzle = true; + } + /* this is the data that will be used in shader rewrites */ + sampler_view->swizzle.s[0] = clamp_zs_swizzle(sampler_view->base.swizzle_r); + sampler_view->swizzle.s[1] = clamp_zs_swizzle(sampler_view->base.swizzle_g); + sampler_view->swizzle.s[2] = clamp_zs_swizzle(sampler_view->base.swizzle_b); + sampler_view->swizzle.s[3] = clamp_zs_swizzle(sampler_view->base.swizzle_a); + } } else { enum pipe_swizzle swizzle[4] = { sampler_view->base.swizzle_r, diff --git a/src/gallium/drivers/zink/zink_shader_keys.h b/src/gallium/drivers/zink/zink_shader_keys.h index 3a14aeb..4605d6e 100644 --- a/src/gallium/drivers/zink/zink_shader_keys.h +++ b/src/gallium/drivers/zink/zink_shader_keys.h @@ -67,6 +67,15 @@ struct zink_gs_key { unsigned size; }; +struct zink_fs_shadow_swizzle { + uint8_t s[4]; +}; + +struct zink_fs_shadow_key { + uint32_t mask; + struct zink_fs_shadow_swizzle swizzle[32]; +}; + struct zink_fs_key_base { bool coord_replace_yinvert : 1; bool samples : 1; diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index 31a797d..30966c9 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -1468,6 +1468,8 @@ struct zink_sampler_view { struct zink_buffer_view *buffer_view; }; struct zink_surface *cube_array; + bool shadow_needs_shader_swizzle; + struct zink_fs_shadow_swizzle swizzle; }; struct zink_image_view {