I don't know of an application that requires this, but it was easy enough to write regardless.
From: Zebediah Figura zfigura@codeweavers.com
--- dlls/d3d11/device.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index ca231af9652..fa100ec075e 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -4162,6 +4162,26 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CheckFeatureSupport(ID3D11Device2 return S_OK; }
+ case D3D11_FEATURE_D3D11_OPTIONS2: + { + D3D11_FEATURE_DATA_D3D11_OPTIONS2 *options = feature_support_data; + if (feature_support_data_size != sizeof(*options)) + { + WARN("Invalid data size.\n"); + return E_INVALIDARG; + } + + options->PSSpecifiedStencilRefSupported = FALSE; + options->TypedUAVLoadAdditionalFormats = FALSE; + options->ROVsSupported = FALSE; + options->ConservativeRasterizationTier = D3D11_CONSERVATIVE_RASTERIZATION_NOT_SUPPORTED; + options->TiledResourcesTier = D3D11_TILED_RESOURCES_NOT_SUPPORTED; + options->MapOnDefaultTextures = FALSE; + options->StandardSwizzle = FALSE; + options->UnifiedMemoryArchitecture = FALSE; + return S_OK; + } + case D3D11_FEATURE_D3D11_OPTIONS3: { D3D11_FEATURE_DATA_D3D11_OPTIONS3 *options = feature_support_data;
From: Zebediah Figura zfigura@codeweavers.com
--- dlls/wined3d/adapter_vk.c | 2 ++ dlls/wined3d/shader_spirv.c | 19 ++++++++++++------- dlls/wined3d/wined3d_vk.h | 1 + 3 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c index 0e6a7babfb1..2ab7f30c8fd 100644 --- a/dlls/wined3d/adapter_vk.c +++ b/dlls/wined3d/adapter_vk.c @@ -2356,6 +2356,7 @@ static bool wined3d_adapter_vk_init_device_extensions(struct wined3d_adapter_vk } info[] = { + {VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, ~0u}, {VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, ~0u}, {VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, ~0u, true}, {VK_KHR_MAINTENANCE1_EXTENSION_NAME, VK_API_VERSION_1_1, true}, @@ -2372,6 +2373,7 @@ static bool wined3d_adapter_vk_init_device_extensions(struct wined3d_adapter_vk } map[] = { + {VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, WINED3D_VK_EXT_SHADER_STENCIL_EXPORT}, {VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, WINED3D_VK_EXT_TRANSFORM_FEEDBACK}, {VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, WINED3D_VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE}, {VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, WINED3D_VK_KHR_SHADER_DRAW_PARAMETERS}, diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index e1c50a1179c..ad34856ab5d 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -105,6 +105,7 @@ struct wined3d_shader_spirv_compile_args { struct vkd3d_shader_varying_map_info varying_map; struct vkd3d_shader_spirv_target_info spirv_target; + enum vkd3d_shader_spirv_extension extensions[1]; struct vkd3d_shader_parameter sample_count; unsigned int ps_alpha_swizzle[WINED3D_MAX_RENDER_TARGETS]; }; @@ -187,7 +188,8 @@ static void shader_spirv_compile_arguments_init(struct shader_spirv_compile_argu } }
-static void shader_spirv_init_compile_args(struct wined3d_shader_spirv_compile_args *args, +static void shader_spirv_init_compile_args(const struct wined3d_vk_info *vk_info, + struct wined3d_shader_spirv_compile_args *args, struct vkd3d_shader_interface_info *vkd3d_interface, enum vkd3d_shader_spirv_environment environment, enum wined3d_shader_type shader_type, enum vkd3d_shader_source_type source_type, const struct shader_spirv_compile_arguments *compile_args) @@ -200,6 +202,12 @@ static void shader_spirv_init_compile_args(struct wined3d_shader_spirv_compile_a args->spirv_target.entry_point = "main"; args->spirv_target.environment = environment;
+ args->spirv_target.extensions = args->extensions; + + if (vk_info->supported[WINED3D_VK_EXT_SHADER_STENCIL_EXPORT]) + args->extensions[args->spirv_target.extension_count++] = VKD3D_SHADER_SPIRV_EXTENSION_EXT_STENCIL_EXPORT; + assert(args->spirv_target.extension_count <= ARRAY_SIZE(args->extensions)); + if (shader_type == WINED3D_SHADER_TYPE_PIXEL) { unsigned int rt_alpha_swizzle = compile_args->u.fs.alpha_swizzle; @@ -272,12 +280,12 @@ static VkShaderModule shader_spirv_compile_shader(struct wined3d_context_vk *con enum wined3d_shader_type shader_type, const struct shader_spirv_compile_arguments *args, const struct shader_spirv_resource_bindings *bindings, const struct wined3d_stream_output_desc *so_desc) { + struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device); + const struct wined3d_vk_info *vk_info = &device_vk->vk_info; struct wined3d_shader_spirv_compile_args compile_args; struct wined3d_shader_spirv_shader_interface iface; VkShaderModuleCreateInfo shader_create_info; struct vkd3d_shader_compile_info info; - const struct wined3d_vk_info *vk_info; - struct wined3d_device_vk *device_vk; struct vkd3d_shader_code spirv; VkShaderModule module; char *messages; @@ -285,7 +293,7 @@ static VkShaderModule shader_spirv_compile_shader(struct wined3d_context_vk *con int ret;
shader_spirv_init_shader_interface_vk(&iface, bindings, so_desc); - shader_spirv_init_compile_args(&compile_args, &iface.vkd3d_interface, + shader_spirv_init_compile_args(vk_info, &compile_args, &iface.vkd3d_interface, VKD3D_SHADER_SPIRV_ENVIRONMENT_VULKAN_1_0, shader_type, source_type, args);
info.type = VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO; @@ -321,9 +329,6 @@ static VkShaderModule shader_spirv_compile_shader(struct wined3d_context_vk *con return VK_NULL_HANDLE; }
- device_vk = wined3d_device_vk(context_vk->c.device); - vk_info = &device_vk->vk_info; - shader_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; shader_create_info.pNext = NULL; shader_create_info.flags = 0; diff --git a/dlls/wined3d/wined3d_vk.h b/dlls/wined3d/wined3d_vk.h index 5d2191e9833..079de4ea6df 100644 --- a/dlls/wined3d/wined3d_vk.h +++ b/dlls/wined3d/wined3d_vk.h @@ -215,6 +215,7 @@ enum wined3d_vk_extension { WINED3D_VK_EXT_NONE,
+ WINED3D_VK_EXT_SHADER_STENCIL_EXPORT, WINED3D_VK_EXT_TRANSFORM_FEEDBACK, WINED3D_VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE, WINED3D_VK_KHR_SHADER_DRAW_PARAMETERS,
From: Zebediah Figura zfigura@codeweavers.com
--- dlls/wined3d/adapter_gl.c | 1 + dlls/wined3d/glsl_shader.c | 12 ++++++++++++ dlls/wined3d/shader.c | 4 ++++ dlls/wined3d/shader_sm4.c | 3 +++ dlls/wined3d/wined3d_gl.h | 1 + dlls/wined3d/wined3d_private.h | 4 +++- 6 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c index de4729a56fc..34cbeea9c4b 100644 --- a/dlls/wined3d/adapter_gl.c +++ b/dlls/wined3d/adapter_gl.c @@ -115,6 +115,7 @@ static const struct wined3d_extension_map gl_extension_map[] = {"GL_ARB_shader_bit_encoding", ARB_SHADER_BIT_ENCODING }, {"GL_ARB_shader_image_load_store", ARB_SHADER_IMAGE_LOAD_STORE }, {"GL_ARB_shader_image_size", ARB_SHADER_IMAGE_SIZE }, + {"GL_ARB_shader_stencil_export", ARB_SHADER_STENCIL_EXPORT }, {"GL_ARB_shader_storage_buffer_object", ARB_SHADER_STORAGE_BUFFER_OBJECT}, {"GL_ARB_shader_texture_image_samples", ARB_SHADER_TEXTURE_IMAGE_SAMPLES}, {"GL_ARB_shader_texture_lod", ARB_SHADER_TEXTURE_LOD }, diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 5dfcbb689b7..4141a39b00f 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -3052,6 +3052,10 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register * string_buffer_sprintf(register_name, "sample_mask"); break;
+ case WINED3DSPR_STENCILREF: + string_buffer_sprintf(register_name, "stencil_ref"); + break; + default: FIXME("Unhandled register type %#x.\n", reg->type); string_buffer_sprintf(register_name, "unrecognised_register"); @@ -7554,6 +7558,8 @@ static void shader_glsl_enable_extensions(struct wined3d_string_buffer *buffer, shader_addline(buffer, "#extension GL_ARB_shader_image_load_store : enable\n"); if (gl_info->supported[ARB_SHADER_IMAGE_SIZE]) shader_addline(buffer, "#extension GL_ARB_shader_image_size : enable\n"); + if (gl_info->supported[ARB_SHADER_STENCIL_EXPORT]) + shader_addline(buffer, "#extension GL_ARB_shader_stencil_export : enable\n"); if (gl_info->supported[ARB_SHADER_STORAGE_BUFFER_OBJECT]) shader_addline(buffer, "#extension GL_ARB_shader_storage_buffer_object : enable\n"); if (gl_info->supported[ARB_SHADER_TEXTURE_IMAGE_SAMPLES]) @@ -7653,6 +7659,9 @@ static void shader_glsl_generate_ps_epilogue(const struct wined3d_gl_info *gl_in if (reg_maps->sample_mask) shader_addline(buffer, "gl_SampleMask[0] = floatBitsToInt(sample_mask);\n");
+ if (reg_maps->stencil_ref) + shader_addline(buffer, "gl_FragStencilRefARB = floatBitsToInt(stencil_ref);\n"); + if (!use_legacy_fragment_output(gl_info)) shader_glsl_generate_color_output(buffer, gl_info, shader, args, string_buffers); } @@ -7899,6 +7908,9 @@ static GLuint shader_glsl_generate_fragment_shader(const struct wined3d_context_ if (reg_maps->sample_mask) shader_addline(buffer, "float sample_mask = uintBitsToFloat(0xffffffffu);\n");
+ if (reg_maps->stencil_ref) + shader_addline(buffer, "float stencil_ref = uintBitsToFloat(0xffffffffu);\n"); + /* Direct3D applications expect integer vPos values, while OpenGL drivers * add approximately 0.5. This causes off-by-one problems as spotted by * the vPos d3d9 visual test. Unfortunately ATI cards do not add exactly diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index 1f0fe13402c..8553ff6ec72 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -758,6 +758,10 @@ static BOOL shader_record_register_usage(struct wined3d_shader *shader, struct w reg_maps->sample_mask = 1; break;
+ case WINED3DSPR_STENCILREF: + reg_maps->stencil_ref = 1; + break; + default: TRACE("Not recording register of type %#x and [%#x][%#x].\n", reg->type, reg->idx[0].offset, reg->idx[1].offset); diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c index 4af1a5b43ba..76d2664f60d 100644 --- a/dlls/wined3d/shader_sm4.c +++ b/dlls/wined3d/shader_sm4.c @@ -357,6 +357,7 @@ enum wined3d_sm4_register_type WINED3D_SM5_RT_GS_INSTANCE_ID = 0x25, WINED3D_SM5_RT_DEPTHOUT_GREATER_EQUAL = 0x26, WINED3D_SM5_RT_DEPTHOUT_LESS_EQUAL = 0x27, + WINED3D_SM5_RT_OUTPUT_STENCIL_REF = 0x29, };
enum wined3d_sm4_output_primitive_type @@ -1184,6 +1185,8 @@ static const enum wined3d_shader_register_type register_type_table[] = /* WINED3D_SM5_RT_GS_INSTANCE_ID */ WINED3DSPR_GSINSTID, /* WINED3D_SM5_RT_DEPTHOUT_GREATER_EQUAL */ WINED3DSPR_DEPTHOUTGE, /* WINED3D_SM5_RT_DEPTHOUT_LESS_EQUAL */ WINED3DSPR_DEPTHOUTLE, + /* UNKNOWN */ ~0u, + /* WINED3D_SM5_RT_OUTPUT_STENCIL_REF */ WINED3DSPR_STENCILREF, };
static const struct wined3d_sm4_opcode_info *get_opcode_info(enum wined3d_sm4_opcode opcode) diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h index b31ddddf726..dc6901b8da1 100644 --- a/dlls/wined3d/wined3d_gl.h +++ b/dlls/wined3d/wined3d_gl.h @@ -110,6 +110,7 @@ enum wined3d_gl_extension ARB_SHADER_BIT_ENCODING, ARB_SHADER_IMAGE_LOAD_STORE, ARB_SHADER_IMAGE_SIZE, + ARB_SHADER_STENCIL_EXPORT, ARB_SHADER_STORAGE_BUFFER_OBJECT, ARB_SHADER_TEXTURE_IMAGE_SAMPLES, ARB_SHADER_TEXTURE_LOD, diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index ff08a7f837f..6d1cd837ac4 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -582,6 +582,7 @@ enum wined3d_shader_register_type WINED3DSPR_DEPTHOUTGE, WINED3DSPR_DEPTHOUTLE, WINED3DSPR_RASTERIZER, + WINED3DSPR_STENCILREF, };
enum wined3d_data_type @@ -1156,7 +1157,7 @@ struct wined3d_shader_reg_maps DWORD input_rel_addressing : 1; DWORD viewport_array : 1; DWORD sample_mask : 1; - DWORD padding : 14; + DWORD stencil_ref : 1;
DWORD rt_mask; /* Used render targets, 32 max. */
@@ -4336,6 +4337,7 @@ static inline BOOL shader_is_scalar(const struct wined3d_shader_register *reg) case WINED3DSPR_PRIMID: /* primID */ case WINED3DSPR_COVERAGE: /* vCoverage */ case WINED3DSPR_SAMPLEMASK: /* oMask */ + case WINED3DSPR_STENCILREF: /* oStencilRef */ return TRUE;
case WINED3DSPR_MISCTYPE:
From: Zebediah Figura zfigura@codeweavers.com
--- dlls/d3d11/device.c | 11 ++++++++++- dlls/wined3d/adapter_gl.c | 1 + dlls/wined3d/adapter_vk.c | 1 + dlls/wined3d/directx.c | 1 + dlls/wined3d/wined3d_private.h | 1 + include/wine/wined3d.h | 1 + 6 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index fa100ec075e..061fd57fe09 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -4171,7 +4171,16 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CheckFeatureSupport(ID3D11Device2 return E_INVALIDARG; }
- options->PSSpecifiedStencilRefSupported = FALSE; + wined3d_mutex_lock(); + hr = wined3d_device_get_device_caps(device->wined3d_device, &wined3d_caps); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to get device caps, hr %#lx.\n", hr); + return hr; + } + + options->PSSpecifiedStencilRefSupported = wined3d_caps.stencil_export; options->TypedUAVLoadAdditionalFormats = FALSE; options->ROVsSupported = FALSE; options->ConservativeRasterizationTier = D3D11_CONSERVATIVE_RASTERIZATION_NOT_SUPPORTED; diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c index 34cbeea9c4b..7ae3143a891 100644 --- a/dlls/wined3d/adapter_gl.c +++ b/dlls/wined3d/adapter_gl.c @@ -5196,6 +5196,7 @@ static void wined3d_adapter_gl_init_d3d_info(struct wined3d_adapter_gl *adapter_ d3d_info->shader_output_interpolation = !!(shader_caps.wined3d_caps & WINED3D_SHADER_CAP_OUTPUT_INTERPOLATION); d3d_info->frag_coord_correction = !!gl_info->supported[ARB_FRAGMENT_COORD_CONVENTIONS]; d3d_info->viewport_array_index_any_shader = !!gl_info->supported[ARB_SHADER_VIEWPORT_LAYER_ARRAY]; + d3d_info->stencil_export = !!gl_info->supported[ARB_SHADER_STENCIL_EXPORT]; d3d_info->texture_npot = !!gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO]; d3d_info->texture_npot_conditional = gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT] || gl_info->supported[ARB_TEXTURE_RECTANGLE]; diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c index 2ab7f30c8fd..291661bb5e7 100644 --- a/dlls/wined3d/adapter_vk.c +++ b/dlls/wined3d/adapter_vk.c @@ -2306,6 +2306,7 @@ static void wined3d_adapter_vk_init_d3d_info(struct wined3d_adapter_vk *adapter_ d3d_info->shader_double_precision = !!(shader_caps.wined3d_caps & WINED3D_SHADER_CAP_DOUBLE_PRECISION); d3d_info->shader_output_interpolation = !!(shader_caps.wined3d_caps & WINED3D_SHADER_CAP_OUTPUT_INTERPOLATION); d3d_info->viewport_array_index_any_shader = false; /* VK_EXT_shader_viewport_index_layer */ + d3d_info->stencil_export = vk_info->supported[WINED3D_VK_EXT_SHADER_STENCIL_EXPORT]; d3d_info->texture_npot = true; d3d_info->texture_npot_conditional = true; d3d_info->normalized_texrect = false; diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 11d829c2756..50990e4cd0e 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -2709,6 +2709,7 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d_adapter *adapter,
caps->shader_double_precision = d3d_info->shader_double_precision; caps->viewport_array_index_any_shader = d3d_info->viewport_array_index_any_shader; + caps->stencil_export = d3d_info->stencil_export;
caps->max_feature_level = d3d_info->feature_level;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 6d1cd837ac4..549a2aa7a7a 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -221,6 +221,7 @@ struct wined3d_d3d_info uint32_t shader_output_interpolation : 1; uint32_t frag_coord_correction : 1; uint32_t viewport_array_index_any_shader : 1; + uint32_t stencil_export : 1; uint32_t texture_npot : 1; uint32_t texture_npot_conditional : 1; uint32_t normalized_texrect : 1; diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index fcbe094e30b..492065711f3 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2000,6 +2000,7 @@ struct wined3d_caps
BOOL shader_double_precision; BOOL viewport_array_index_any_shader; + BOOL stencil_export;
enum wined3d_feature_level max_feature_level; };
From: Zebediah Figura zfigura@codeweavers.com
Ported from b8ab71e4dc in vkd3d by Conor McCarthy. --- dlls/d3d11/tests/d3d11.c | 160 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+)
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index 727f263731d..d08c19f89cf 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -21,6 +21,7 @@ #include <float.h> #include <limits.h> #include <math.h> +#include <stdbool.h> #include <stdlib.h> #define COBJMACROS #include "initguid.h" @@ -1646,6 +1647,16 @@ static BOOL check_compute_shaders_via_sm4_support(ID3D11Device *device) return options.ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x; }
+static bool check_stencil_ref_export_support(ID3D11Device *device) +{ + D3D11_FEATURE_DATA_D3D11_OPTIONS2 options; + + if (FAILED(ID3D11Device_CheckFeatureSupport(device, + D3D11_FEATURE_D3D11_OPTIONS2, &options, sizeof(options)))) + return false; + return options.PSSpecifiedStencilRefSupported; +} + static BOOL check_viewport_array_index_from_any_shader_support(ID3D11Device *device) { D3D11_FEATURE_DATA_D3D11_OPTIONS3 options; @@ -35452,6 +35463,154 @@ static void test_clear_during_render(void) release_test_context(&test_context); }
+static void test_stencil_export(void) +{ + D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc; + D3D11_DEPTH_STENCIL_VIEW_DESC dsv_desc; + struct d3d11_test_context test_context; + D3D11_DEPTH_STENCIL_DESC ds_desc = {0}; + ID3D11DepthStencilState *ds_state; + D3D11_TEXTURE2D_DESC texture_desc; + ID3D11PixelShader *ps, *ps_sample; + ID3D11ShaderResourceView *srv; + ID3D11DeviceContext *context; + struct resource_readback rb; + ID3D11DepthStencilView *dsv; + ID3D11RenderTargetView *rtv; + ID3D11Texture2D *rt, *ds; + ID3D11Device *device; + ID3D11Buffer *cb; + HRESULT hr; + + static const DWORD ps_code[] = + { +#if 0 + uint stencil_ref; + + uint main() : SV_StencilRef + { + return stencil_ref; + } +#endif + 0x43425844, 0x3980cb16, 0xbbe87d38, 0xb93f7c61, 0x200c41ed, 0x00000001, 0x000000cc, 0x00000004, + 0x00000030, 0x00000040, 0x00000078, 0x000000bc, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, + 0x4e47534f, 0x00000030, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001, + 0xffffffff, 0x00000e01, 0x535f5653, 0x636e6574, 0x65526c69, 0xabab0066, 0x58454853, 0x0000003c, + 0x00000050, 0x0000000f, 0x0100086a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x02000065, + 0x00029001, 0x05000036, 0x00029001, 0x0020800a, 0x00000000, 0x00000000, 0x0100003e, 0x30494653, + 0x00000008, 0x00000200, 0x00000000, + }; + static const DWORD ps_sample_code[] = + { +#if 0 + Texture2D<uint4> tex : register(t0); + + uint4 main(float4 pos : SV_Position) : SV_TARGET + { + return tex[uint2(pos.xy)].g; + } +#endif + 0x43425844, 0xdd1e98d4, 0x53c81701, 0x576f6b2e, 0x040b18bb, 0x00000001, 0x0000014c, 0x00000003, + 0x0000002c, 0x00000060, 0x00000094, 0x4e475349, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, + 0x00000000, 0x00000001, 0x00000003, 0x00000000, 0x0000030f, 0x505f5653, 0x7469736f, 0x006e6f69, + 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0000000f, 0x545f5653, 0x45475241, 0xabab0054, 0x58454853, 0x000000b0, 0x00000050, + 0x0000002c, 0x0100086a, 0x04001858, 0x00107000, 0x00000000, 0x00004444, 0x04002064, 0x00101032, + 0x00000000, 0x00000001, 0x03000065, 0x001020f2, 0x00000000, 0x02000068, 0x00000001, 0x0500001c, + 0x00100032, 0x00000000, 0x00101046, 0x00000000, 0x08000036, 0x001000c2, 0x00000000, 0x00004002, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8900002d, 0x800000c2, 0x00111103, 0x00100012, + 0x00000000, 0x00100e46, 0x00000000, 0x00107e16, 0x00000000, 0x05000036, 0x001020f2, 0x00000000, + 0x00100006, 0x00000000, 0x0100003e, + }; + static const float black[] = {0.0f, 0.0f, 0.0f, 0.0f}; + static const DWORD cb_data[4] = {0xff}; + + if (!init_test_context(&test_context, NULL)) + return; + + device = test_context.device; + context = test_context.immediate_context; + + if (!check_stencil_ref_export_support(device)) + { + skip("The device does not support stencil ref export.\n"); + release_test_context(&test_context); + return; + } + + ID3D11Texture2D_GetDesc(test_context.backbuffer, &texture_desc); + texture_desc.Format = DXGI_FORMAT_R8_UINT; + hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &rt); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = ID3D11Device_CreateRenderTargetView(device, (ID3D11Resource *)rt, NULL, &rtv); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + ID3D11Texture2D_GetDesc(test_context.backbuffer, &texture_desc); + texture_desc.Format = DXGI_FORMAT_R32G8X24_TYPELESS; + texture_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; + hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &ds); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + dsv_desc.Format = DXGI_FORMAT_D32_FLOAT_S8X24_UINT; + dsv_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; + dsv_desc.Flags = 0; + dsv_desc.Texture2D.MipSlice = 0; + hr = ID3D11Device_CreateDepthStencilView(device, (ID3D11Resource *)ds, &dsv_desc, &dsv); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + srv_desc.Format = DXGI_FORMAT_X32_TYPELESS_G8X24_UINT; + srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srv_desc.Texture2D.MostDetailedMip = 0; + srv_desc.Texture2D.MipLevels = 1; + hr = ID3D11Device_CreateShaderResourceView(device, (ID3D11Resource *)ds, &srv_desc, &srv); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + ds_desc.DepthFunc = D3D11_COMPARISON_NEVER; + ds_desc.StencilEnable = TRUE, + ds_desc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK, + ds_desc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK, + ds_desc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_REPLACE, + ds_desc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_REPLACE, + ds_desc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_REPLACE, + ds_desc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS, + ds_desc.BackFace = ds_desc.FrontFace; + hr = ID3D11Device_CreateDepthStencilState(device, &ds_desc, &ds_state); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = ID3D11Device_CreatePixelShader(device, ps_code, sizeof(ps_code), NULL, &ps); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = ID3D11Device_CreatePixelShader(device, ps_sample_code, sizeof(ps_sample_code), NULL, &ps_sample); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + cb = create_buffer(device, D3D11_BIND_CONSTANT_BUFFER, sizeof(cb_data), cb_data); + + ID3D11DeviceContext_ClearDepthStencilView(context, dsv, D3D11_CLEAR_STENCIL, 0.0f, 0x80); + ID3D11DeviceContext_OMSetRenderTargets(context, 1, &rtv, dsv); + ID3D11DeviceContext_OMSetDepthStencilState(context, ds_state, 0); + ID3D11DeviceContext_PSSetShader(context, ps, NULL, 0); + ID3D11DeviceContext_PSSetConstantBuffers(context, 0, 1, &cb); + draw_quad(&test_context); + + ID3D11DeviceContext_OMSetRenderTargets(context, 1, &rtv, NULL); + ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black); + ID3D11DeviceContext_PSSetShaderResources(context, 0, 1, &srv); + ID3D11DeviceContext_PSSetShader(context, ps_sample, NULL, 0); + draw_quad(&test_context); + + get_texture_readback(rt, 0, &rb); + check_readback_data_u8(&rb, NULL, 0xff, 0); + release_resource_readback(&rb); + + ID3D11ShaderResourceView_Release(srv); + ID3D11Buffer_Release(cb); + ID3D11PixelShader_Release(ps); + ID3D11PixelShader_Release(ps_sample); + ID3D11DepthStencilState_Release(ds_state); + ID3D11Texture2D_Release(rt); + ID3D11Texture2D_Release(ds); + ID3D11RenderTargetView_Release(rtv); + ID3D11DepthStencilView_Release(dsv); + release_test_context(&test_context); +} + START_TEST(d3d11) { unsigned int argc, i; @@ -35649,6 +35808,7 @@ START_TEST(d3d11) queue_for_each_feature_level(test_shared_resource); queue_test(test_keyed_mutex); queue_test(test_clear_during_render); + queue_test(test_stencil_export);
run_queued_tests();
This merge request was approved by Jan Sikorski.