libs/vkd3d-shader: Make bytecode parser responsible for setting scalar register write masks.

This commit is contained in:
Józef Kucia 2017-08-18 14:52:40 +02:00
parent ca9cc355b4
commit 8f631c8b0c
3 changed files with 26 additions and 34 deletions

View File

@ -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;

View File

@ -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(&reg_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;

View File

@ -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))