=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: vkd3d-shader: Add initial support for built-in patch constants.
Alexandre Julliard
julliard at winehq.org
Fri Feb 8 16:10:06 CST 2019
Module: vkd3d
Branch: master
Commit: a81a7f837e0bfc60869283f4616e623b83b462c7
URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=a81a7f837e0bfc60869283f4616e623b83b462c7
Author: Józef Kucia <jkucia at codeweavers.com>
Date: Fri Feb 8 13:20:15 2019 +0100
vkd3d-shader: Add initial support for built-in patch constants.
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
libs/vkd3d-shader/spirv.c | 97 ++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 84 insertions(+), 13 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 2c7519d..07cb5fe 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -1941,6 +1941,12 @@ struct vkd3d_shader_phase
size_t function_location;
};
+struct vkd3d_hull_shader_variables
+{
+ uint32_t tess_level_outer_id;
+ uint32_t tess_level_inner_id;
+};
+
struct vkd3d_dxbc_compiler
{
struct vkd3d_spirv_builder spirv_builder;
@@ -1950,6 +1956,7 @@ struct vkd3d_dxbc_compiler
struct rb_tree symbol_table;
uint32_t temp_id;
unsigned int temp_count;
+ struct vkd3d_hull_shader_variables hs;
enum vkd3d_shader_type shader_type;
@@ -3154,7 +3161,8 @@ struct vkd3d_spirv_builtin
unsigned int component_count;
SpvBuiltIn spirv_builtin;
vkd3d_spirv_builtin_fixup_pfn fixup_pfn;
- bool is_spirv_array;
+ unsigned int spirv_array_size;
+ unsigned int member_idx;
};
/*
@@ -3183,8 +3191,23 @@ vkd3d_system_value_builtins[] =
{VKD3D_SIV_SAMPLE_INDEX, {VKD3D_TYPE_UINT, 1, SpvBuiltInSampleId}},
- {VKD3D_SIV_CLIP_DISTANCE, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInClipDistance, NULL, true}},
- {VKD3D_SIV_CULL_DISTANCE, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInCullDistance, NULL, true}},
+ {VKD3D_SIV_CLIP_DISTANCE, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInClipDistance, NULL, 1}},
+ {VKD3D_SIV_CULL_DISTANCE, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInCullDistance, NULL, 1}},
+
+ {VKD3D_SIV_QUAD_U0_TESS_FACTOR, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInTessLevelOuter, NULL, 4, 0}},
+ {VKD3D_SIV_QUAD_V0_TESS_FACTOR, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInTessLevelOuter, NULL, 4, 1}},
+ {VKD3D_SIV_QUAD_U1_TESS_FACTOR, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInTessLevelOuter, NULL, 4, 2}},
+ {VKD3D_SIV_QUAD_V1_TESS_FACTOR, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInTessLevelOuter, NULL, 4, 3}},
+ {VKD3D_SIV_QUAD_U_INNER_TESS_FACTOR, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInTessLevelInner, NULL, 2, 0}},
+ {VKD3D_SIV_QUAD_V_INNER_TESS_FACTOR, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInTessLevelInner, NULL, 2, 1}},
+
+ {VKD3D_SIV_TRIANGLE_U_TESS_FACTOR, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInTessLevelOuter, NULL, 4, 0}},
+ {VKD3D_SIV_TRIANGLE_V_TESS_FACTOR, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInTessLevelOuter, NULL, 4, 1}},
+ {VKD3D_SIV_TRIANGLE_W_TESS_FACTOR, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInTessLevelOuter, NULL, 4, 2}},
+ {VKD3D_SIV_TRIANGLE_INNER_TESS_FACTOR, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInTessLevelInner, NULL, 2, 0}},
+
+ {VKD3D_SIV_LINE_DETAIL_TESS_FACTOR, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInTessLevelOuter, NULL, 4, 0}},
+ {VKD3D_SIV_LINE_DENSITY_TESS_FACTOR, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInTessLevelOuter, NULL, 4, 1}},
};
static const struct vkd3d_spirv_builtin vkd3d_pixel_shader_position_builtin =
{
@@ -3207,8 +3230,8 @@ vkd3d_register_builtins[] =
{VKD3DSPR_TESSCOORD, {VKD3D_TYPE_FLOAT, 3, SpvBuiltInTessCoord}},
- {VKD3DSPR_COVERAGE, {VKD3D_TYPE_UINT, 1, SpvBuiltInSampleMask, NULL, true}},
- {VKD3DSPR_SAMPLEMASK, {VKD3D_TYPE_UINT, 1, SpvBuiltInSampleMask, NULL, true}},
+ {VKD3DSPR_COVERAGE, {VKD3D_TYPE_UINT, 1, SpvBuiltInSampleMask, NULL, 1}},
+ {VKD3DSPR_SAMPLEMASK, {VKD3D_TYPE_UINT, 1, SpvBuiltInSampleMask, NULL, 1}},
{VKD3DSPR_DEPTHOUT, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInFragDepth}},
{VKD3DSPR_DEPTHOUTGE, {VKD3D_TYPE_FLOAT, 1, SpvBuiltInFragDepth}},
@@ -3389,8 +3412,7 @@ static uint32_t vkd3d_dxbc_compiler_emit_builtin_variable(struct vkd3d_dxbc_comp
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
uint32_t id;
- if (!array_size && builtin->is_spirv_array)
- array_size = 1;
+ array_size = max(array_size, builtin->spirv_array_size);
id = vkd3d_dxbc_compiler_emit_array_variable(compiler,
&builder->global_stream, storage_class,
@@ -3570,7 +3592,7 @@ static void vkd3d_dxbc_compiler_emit_input_register(struct vkd3d_dxbc_compiler *
vkd3d_symbol_make_register(®_symbol, reg);
vkd3d_symbol_set_register_info(®_symbol, input_id, SpvStorageClassInput,
builtin->component_type, vkd3d_write_mask_from_component_count(builtin->component_count));
- reg_symbol.info.reg.is_aggregate = builtin->is_spirv_array;
+ reg_symbol.info.reg.is_aggregate = builtin->spirv_array_size;
vkd3d_dxbc_compiler_put_symbol(compiler, ®_symbol);
vkd3d_dxbc_compiler_emit_register_debug_name(builder, input_id, reg);
}
@@ -3733,7 +3755,7 @@ static void vkd3d_dxbc_compiler_emit_output_register(struct vkd3d_dxbc_compiler
vkd3d_symbol_make_register(®_symbol, reg);
vkd3d_symbol_set_register_info(®_symbol, output_id, SpvStorageClassOutput,
builtin->component_type, vkd3d_write_mask_from_component_count(builtin->component_count));
- reg_symbol.info.reg.is_aggregate = builtin->is_spirv_array;
+ reg_symbol.info.reg.is_aggregate = builtin->spirv_array_size;
vkd3d_dxbc_compiler_put_symbol(compiler, ®_symbol);
vkd3d_dxbc_compiler_emit_register_debug_name(builder, output_id, reg);
}
@@ -3769,7 +3791,7 @@ static void vkd3d_dxbc_compiler_emit_output(struct vkd3d_dxbc_compiler *compiler
if (builtin)
{
component_type = builtin->component_type;
- if (!builtin->is_spirv_array)
+ if (!builtin->spirv_array_size)
output_component_count = builtin->component_count;
}
else
@@ -3821,7 +3843,7 @@ static void vkd3d_dxbc_compiler_emit_output(struct vkd3d_dxbc_compiler *compiler
use_private_variable = component_count != VKD3D_VEC4_SIZE
|| get_shader_output_swizzle(compiler, signature_element->register_index) != VKD3D_NO_SWIZZLE
- || (builtin && builtin->is_spirv_array);
+ || (builtin && builtin->spirv_array_size);
if (use_private_variable)
storage_class = SpvStorageClassPrivate;
@@ -3852,6 +3874,46 @@ static void vkd3d_dxbc_compiler_emit_output(struct vkd3d_dxbc_compiler *compiler
}
}
+static void vkd3d_dxbc_compiler_emit_shader_phase_output(struct vkd3d_dxbc_compiler *compiler,
+ const struct vkd3d_shader_phase *phase, const struct vkd3d_shader_dst_param *dst,
+ enum vkd3d_shader_input_sysval_semantic sysval)
+{
+ struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
+ const struct vkd3d_shader_register *reg = &dst->reg;
+ const struct vkd3d_spirv_builtin *builtin;
+ struct vkd3d_symbol reg_symbol;
+ uint32_t *variable_id;
+
+ variable_id = NULL;
+ if ((builtin = get_spirv_builtin_for_sysval(compiler, sysval)))
+ {
+ if (builtin->spirv_builtin == SpvBuiltInTessLevelOuter)
+ variable_id = &compiler->hs.tess_level_outer_id;
+ else if (builtin->spirv_builtin == SpvBuiltInTessLevelInner)
+ variable_id = &compiler->hs.tess_level_inner_id;
+ }
+
+ if (!variable_id)
+ {
+ FIXME("Unhandled shader phase output register %#x, sysval %#x.\n", reg->type, sysval);
+ return;
+ }
+
+ if (!*variable_id)
+ {
+ *variable_id = vkd3d_dxbc_compiler_emit_builtin_variable(compiler, builtin, SpvStorageClassOutput, 0);
+ if (phase->type == VKD3DSIH_HS_FORK_PHASE || phase->type == VKD3DSIH_HS_JOIN_PHASE)
+ vkd3d_spirv_build_op_decorate(builder, *variable_id, SpvDecorationPatch, NULL, 0);
+ }
+
+ vkd3d_symbol_make_register(®_symbol, reg);
+ vkd3d_symbol_set_register_info(®_symbol, *variable_id, SpvStorageClassOutput,
+ builtin->component_type, vkd3d_write_mask_from_component_count(builtin->component_count));
+ reg_symbol.info.reg.member_idx = builtin->member_idx;
+ reg_symbol.info.reg.is_aggregate = builtin->spirv_array_size;
+ vkd3d_dxbc_compiler_put_symbol(compiler, ®_symbol);
+}
+
static void vkd3d_dxbc_compiler_emit_initial_declarations(struct vkd3d_dxbc_compiler *compiler)
{
const struct vkd3d_shader_transform_feedback_info *xfb_info = compiler->xfb_info;
@@ -4639,8 +4701,17 @@ static void vkd3d_dxbc_compiler_emit_dcl_output(struct vkd3d_dxbc_compiler *comp
static void vkd3d_dxbc_compiler_emit_dcl_output_siv(struct vkd3d_dxbc_compiler *compiler,
const struct vkd3d_shader_instruction *instruction)
{
- vkd3d_dxbc_compiler_emit_output(compiler, &instruction->declaration.register_semantic.reg,
- instruction->declaration.register_semantic.sysval_semantic);
+ enum vkd3d_shader_input_sysval_semantic sysval;
+ const struct vkd3d_shader_dst_param *dst;
+ const struct vkd3d_shader_phase *phase;
+
+ dst = &instruction->declaration.register_semantic.reg;
+ sysval = instruction->declaration.register_semantic.sysval_semantic;
+
+ if ((phase = vkd3d_dxbc_compiler_get_current_shader_phase(compiler)))
+ vkd3d_dxbc_compiler_emit_shader_phase_output(compiler, phase, dst, sysval);
+ else
+ vkd3d_dxbc_compiler_emit_output(compiler, dst, sysval);
}
static void vkd3d_dxbc_compiler_emit_dcl_stream(struct vkd3d_dxbc_compiler *compiler,
More information about the wine-cvs
mailing list