mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
libs/vkd3d-shader: Make bytecode parser responsible for setting scalar register write masks.
This commit is contained in:
parent
ca9cc355b4
commit
8f631c8b0c
@ -1552,6 +1552,19 @@ static BOOL shader_sm4_read_src_param(struct vkd3d_sm4_data *priv, const DWORD *
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static bool shader_sm4_is_scalar_register(const struct vkd3d_shader_register *reg)
|
||||
{
|
||||
switch (reg->type)
|
||||
{
|
||||
case VKD3DSPR_DEPTHOUT:
|
||||
case VKD3DSPR_LOCALTHREADINDEX:
|
||||
case VKD3DSPR_PRIMID:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static BOOL shader_sm4_read_dst_param(struct vkd3d_sm4_data *priv, const DWORD **ptr, const DWORD *end,
|
||||
enum vkd3d_data_type data_type, struct vkd3d_shader_dst_param *dst_param)
|
||||
{
|
||||
@ -1578,6 +1591,9 @@ static BOOL shader_sm4_read_dst_param(struct vkd3d_sm4_data *priv, const DWORD *
|
||||
}
|
||||
|
||||
dst_param->write_mask = (token & VKD3D_SM4_WRITEMASK_MASK) >> VKD3D_SM4_WRITEMASK_SHIFT;
|
||||
/* Scalar registers are declared with no write mask in shader bytecode. */
|
||||
if (!dst_param->write_mask && shader_sm4_is_scalar_register(&dst_param->reg))
|
||||
dst_param->write_mask = VKD3DSP_WRITEMASK_0;
|
||||
dst_param->modifiers = 0;
|
||||
dst_param->shift = 0;
|
||||
|
||||
|
@ -2517,28 +2517,6 @@ static const struct vkd3d_shader_signature_element *vkd3d_find_signature_element
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static bool vkd3d_shader_is_scalar_register(const struct vkd3d_shader_register *reg)
|
||||
{
|
||||
switch (reg->type)
|
||||
{
|
||||
case VKD3DSPR_DEPTHOUT:
|
||||
case VKD3DSPR_LOCALTHREADINDEX:
|
||||
case VKD3DSPR_PRIMID:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static DWORD vkd3d_shader_fix_write_mask(const struct vkd3d_shader_register *reg,
|
||||
DWORD write_mask)
|
||||
{
|
||||
/* Scalar registers are declared with no write mask in shader bytecode. */
|
||||
if (!write_mask && vkd3d_shader_is_scalar_register(reg))
|
||||
return VKD3DSP_WRITEMASK_0;
|
||||
return write_mask;
|
||||
}
|
||||
|
||||
static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compiler,
|
||||
const struct vkd3d_shader_dst_param *dst, enum vkd3d_shader_input_sysval_semantic sysval)
|
||||
{
|
||||
@ -2554,13 +2532,11 @@ static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compi
|
||||
SpvStorageClass storage_class;
|
||||
struct rb_entry *entry = NULL;
|
||||
bool use_private_var = false;
|
||||
DWORD write_mask;
|
||||
|
||||
builtin = vkd3d_get_spirv_builtin(reg->type, sysval);
|
||||
|
||||
write_mask = vkd3d_shader_fix_write_mask(reg, dst->write_mask);
|
||||
component_idx = vkd3d_write_mask_get_component_idx(write_mask);
|
||||
component_count = vkd3d_write_mask_component_count(write_mask);
|
||||
component_idx = vkd3d_write_mask_get_component_idx(dst->write_mask);
|
||||
component_count = vkd3d_write_mask_component_count(dst->write_mask);
|
||||
if (builtin)
|
||||
{
|
||||
component_type = builtin->component_type;
|
||||
@ -2569,7 +2545,7 @@ static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compi
|
||||
else
|
||||
{
|
||||
signature_element = vkd3d_find_signature_element_for_reg(compiler->input_signature,
|
||||
NULL, reg, write_mask);
|
||||
NULL, reg, dst->write_mask);
|
||||
component_type = signature_element ? signature_element->component_type : VKD3D_TYPE_FLOAT;
|
||||
input_component_count = component_count;
|
||||
}
|
||||
@ -2608,7 +2584,7 @@ static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compi
|
||||
|
||||
if (val_id && input_component_count != component_count)
|
||||
val_id = vkd3d_dxbc_compiler_emit_swizzle(compiler,
|
||||
val_id, VKD3D_TYPE_FLOAT, VKD3DSP_NOSWIZZLE, write_mask);
|
||||
val_id, VKD3D_TYPE_FLOAT, VKD3DSP_NOSWIZZLE, dst->write_mask);
|
||||
|
||||
vkd3d_symbol_make_register(®_symbol, reg);
|
||||
|
||||
@ -2634,7 +2610,7 @@ static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compi
|
||||
if (use_private_var)
|
||||
{
|
||||
assert(val_id);
|
||||
vkd3d_dxbc_compiler_emit_store_reg(compiler, reg, write_mask, val_id);
|
||||
vkd3d_dxbc_compiler_emit_store_reg(compiler, reg, dst->write_mask, val_id);
|
||||
}
|
||||
|
||||
return input_id;
|
||||
@ -2664,15 +2640,13 @@ static uint32_t vkd3d_dxbc_compiler_emit_output(struct vkd3d_dxbc_compiler *comp
|
||||
unsigned int signature_idx;
|
||||
bool use_private_variable;
|
||||
uint32_t id, var_id;
|
||||
DWORD write_mask;
|
||||
|
||||
write_mask = vkd3d_shader_fix_write_mask(reg, dst->write_mask);
|
||||
signature_element = vkd3d_find_signature_element_for_reg(compiler->output_signature,
|
||||
&signature_idx, reg, write_mask);
|
||||
&signature_idx, reg, dst->write_mask);
|
||||
builtin = vkd3d_get_spirv_builtin(dst->reg.type, sysval);
|
||||
|
||||
component_idx = vkd3d_write_mask_get_component_idx(write_mask);
|
||||
component_count = vkd3d_write_mask_component_count(write_mask);
|
||||
component_idx = vkd3d_write_mask_get_component_idx(dst->write_mask);
|
||||
component_count = vkd3d_write_mask_component_count(dst->write_mask);
|
||||
if (builtin)
|
||||
{
|
||||
component_type = builtin->component_type;
|
||||
|
@ -868,6 +868,7 @@ static inline unsigned int vkd3d_write_mask_get_component_idx(DWORD write_mask)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
assert(write_mask);
|
||||
for (i = 0; i < VKD3D_VEC4_SIZE; ++i)
|
||||
{
|
||||
if (write_mask & (VKD3DSP_WRITEMASK_0 << i))
|
||||
@ -882,6 +883,7 @@ static inline unsigned int vkd3d_write_mask_component_count(DWORD write_mask)
|
||||
{
|
||||
unsigned int i, count = 0;
|
||||
|
||||
assert(write_mask);
|
||||
for (i = 0; i < VKD3D_VEC4_SIZE; ++i)
|
||||
{
|
||||
if (write_mask & (VKD3DSP_WRITEMASK_0 << i))
|
||||
|
Loading…
x
Reference in New Issue
Block a user