mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
vkd3d-shader/spirv: Allow the origin of fragment coordinates to be specified.
We typically want to use lower-left in OpenGL environments when rendering to FBOs.
This commit is contained in:
parent
0805ce121e
commit
e7eec3e023
Notes:
Alexandre Julliard
2023-11-10 00:08:58 +01:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/457
@ -173,6 +173,21 @@ enum vkd3d_shader_compile_option_backward_compatibility
|
|||||||
VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_COMPILE_OPTION_BACKWARD_COMPATIBILITY),
|
VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_COMPILE_OPTION_BACKWARD_COMPATIBILITY),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines the origin of fragment coordinates.
|
||||||
|
*
|
||||||
|
* \since 1.10
|
||||||
|
*/
|
||||||
|
enum vkd3d_shader_compile_option_fragment_coordinate_origin
|
||||||
|
{
|
||||||
|
/** Fragment coordinates originate from the upper-left. This is the
|
||||||
|
* default; it's also the only value supported by Vulkan environments. */
|
||||||
|
VKD3D_SHADER_COMPILE_OPTION_FRAGMENT_COORDINATE_ORIGIN_UPPER_LEFT = 0x00000000,
|
||||||
|
/** Fragment coordinates originate from the lower-left. This matches the
|
||||||
|
* traditional behaviour of OpenGL environments. */
|
||||||
|
VKD3D_SHADER_COMPILE_OPTION_FRAGMENT_COORDINATE_ORIGIN_LOWER_LEFT = 0x00000001,
|
||||||
|
};
|
||||||
|
|
||||||
enum vkd3d_shader_compile_option_name
|
enum vkd3d_shader_compile_option_name
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
@ -220,6 +235,16 @@ enum vkd3d_shader_compile_option_name
|
|||||||
* \since 1.10
|
* \since 1.10
|
||||||
*/
|
*/
|
||||||
VKD3D_SHADER_COMPILE_OPTION_BACKWARD_COMPATIBILITY = 0x00000008,
|
VKD3D_SHADER_COMPILE_OPTION_BACKWARD_COMPATIBILITY = 0x00000008,
|
||||||
|
/**
|
||||||
|
* This option specifies the origin of fragment coordinates for SPIR-V
|
||||||
|
* targets.
|
||||||
|
*
|
||||||
|
* \a value is a member of enum
|
||||||
|
* vkd3d_shader_compile_option_fragment_coordinate_origin.
|
||||||
|
*
|
||||||
|
* \since 1.10
|
||||||
|
*/
|
||||||
|
VKD3D_SHADER_COMPILE_OPTION_FRAGMENT_COORDINATE_ORIGIN = 0x00000009,
|
||||||
|
|
||||||
VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_COMPILE_OPTION_NAME),
|
VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_COMPILE_OPTION_NAME),
|
||||||
};
|
};
|
||||||
|
@ -2288,6 +2288,7 @@ struct spirv_compiler
|
|||||||
bool strip_debug;
|
bool strip_debug;
|
||||||
bool ssbo_uavs;
|
bool ssbo_uavs;
|
||||||
bool uav_read_without_format;
|
bool uav_read_without_format;
|
||||||
|
SpvExecutionMode fragment_coordinate_origin;
|
||||||
|
|
||||||
struct rb_tree symbol_table;
|
struct rb_tree symbol_table;
|
||||||
uint32_t temp_id;
|
uint32_t temp_id;
|
||||||
@ -2453,6 +2454,7 @@ static struct spirv_compiler *spirv_compiler_create(const struct vkd3d_shader_ve
|
|||||||
compiler->formatting = VKD3D_SHADER_COMPILE_OPTION_FORMATTING_INDENT
|
compiler->formatting = VKD3D_SHADER_COMPILE_OPTION_FORMATTING_INDENT
|
||||||
| VKD3D_SHADER_COMPILE_OPTION_FORMATTING_HEADER;
|
| VKD3D_SHADER_COMPILE_OPTION_FORMATTING_HEADER;
|
||||||
compiler->write_tess_geom_point_size = true;
|
compiler->write_tess_geom_point_size = true;
|
||||||
|
compiler->fragment_coordinate_origin = SpvExecutionModeOriginUpperLeft;
|
||||||
|
|
||||||
for (i = 0; i < compile_info->option_count; ++i)
|
for (i = 0; i < compile_info->option_count; ++i)
|
||||||
{
|
{
|
||||||
@ -2493,6 +2495,15 @@ static struct spirv_compiler *spirv_compiler_create(const struct vkd3d_shader_ve
|
|||||||
compiler->write_tess_geom_point_size = option->value;
|
compiler->write_tess_geom_point_size = option->value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case VKD3D_SHADER_COMPILE_OPTION_FRAGMENT_COORDINATE_ORIGIN:
|
||||||
|
if (option->value == VKD3D_SHADER_COMPILE_OPTION_FRAGMENT_COORDINATE_ORIGIN_UPPER_LEFT)
|
||||||
|
compiler->fragment_coordinate_origin = SpvExecutionModeOriginUpperLeft;
|
||||||
|
else if (option->value == VKD3D_SHADER_COMPILE_OPTION_FRAGMENT_COORDINATE_ORIGIN_LOWER_LEFT)
|
||||||
|
compiler->fragment_coordinate_origin = SpvExecutionModeOriginLowerLeft;
|
||||||
|
else
|
||||||
|
WARN("Ignoring unrecognised value %#x for option %#x.\n", option->value, option->name);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
WARN("Ignoring unrecognised option %#x with value %#x.\n", option->name, option->value);
|
WARN("Ignoring unrecognised option %#x with value %#x.\n", option->name, option->value);
|
||||||
break;
|
break;
|
||||||
@ -5358,7 +5369,7 @@ static void spirv_compiler_emit_initial_declarations(struct spirv_compiler *comp
|
|||||||
break;
|
break;
|
||||||
case VKD3D_SHADER_TYPE_PIXEL:
|
case VKD3D_SHADER_TYPE_PIXEL:
|
||||||
vkd3d_spirv_set_execution_model(builder, SpvExecutionModelFragment);
|
vkd3d_spirv_set_execution_model(builder, SpvExecutionModelFragment);
|
||||||
spirv_compiler_emit_execution_mode(compiler, SpvExecutionModeOriginUpperLeft, NULL, 0);
|
spirv_compiler_emit_execution_mode(compiler, compiler->fragment_coordinate_origin, NULL, 0);
|
||||||
break;
|
break;
|
||||||
case VKD3D_SHADER_TYPE_COMPUTE:
|
case VKD3D_SHADER_TYPE_COMPUTE:
|
||||||
vkd3d_spirv_set_execution_model(builder, SpvExecutionModelGLCompute);
|
vkd3d_spirv_set_execution_model(builder, SpvExecutionModelGLCompute);
|
||||||
|
Loading…
Reference in New Issue
Block a user