vkd3d-shader: Parse minprecision modifier.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2021-12-03 13:45:39 +01:00
parent cca7613bca
commit fee77efca4
3 changed files with 19 additions and 16 deletions

View File

@ -1616,9 +1616,11 @@ static bool shader_sm4_read_param(struct vkd3d_sm4_data *priv, const DWORD **ptr
}
if (m & 0x20000)
param->modifier = VKD3DSPRM_NONUNIFORM;
param->modifier |= VKD3DSPRM_NONUNIFORM;
if (m & 0x4000)
param->modifier |= VKD3DSPRM_RELAXED_PRECISION;
if ((m &= ~(0x200c1)))
if ((m &= ~(0x240c1)))
FIXME("Skipping modifier 0x%08x.\n", m);
}
else

View File

@ -3515,7 +3515,7 @@ static uint32_t vkd3d_dxbc_compiler_emit_load_constant_buffer(struct vkd3d_dxbc_
ptr_id = vkd3d_spirv_build_op_access_chain(builder, ptr_type_id,
base_id, indexes, last_index + 1);
if (reg->modifier == VKD3DSPRM_NONUNIFORM)
if (reg->modifier & VKD3DSPRM_NONUNIFORM)
vkd3d_dxbc_compiler_decorate_nonuniform(compiler, ptr_id);
component_ids[j++] = vkd3d_spirv_build_op_loadv(builder, type_id, ptr_id,
@ -8939,7 +8939,7 @@ static uint32_t vkd3d_dxbc_compiler_get_resource_index(struct vkd3d_dxbc_compile
#endif
/* AMD drivers rely on the index being marked as nonuniform */
if (reg->modifier == VKD3DSPRM_NONUNIFORM)
if (reg->modifier & VKD3DSPRM_NONUNIFORM)
vkd3d_dxbc_compiler_decorate_nonuniform(compiler, index_id);
return index_id;
@ -9027,7 +9027,7 @@ static void vkd3d_dxbc_compiler_prepare_image(struct vkd3d_dxbc_compiler *compil
image->image_id = 0;
}
if (image->image_id && resource_reg->modifier == VKD3DSPRM_NONUNIFORM)
if (image->image_id && (resource_reg->modifier & VKD3DSPRM_NONUNIFORM))
vkd3d_dxbc_compiler_decorate_nonuniform(compiler, image->image_id);
if (sampled)
@ -9043,12 +9043,12 @@ static void vkd3d_dxbc_compiler_prepare_image(struct vkd3d_dxbc_compiler *compil
image->sampled_image_id = vkd3d_spirv_build_op_sampled_image(builder,
sampled_image_type_id, image->image_id, sampler_id);
if (sampler_reg->modifier == VKD3DSPRM_NONUNIFORM)
if (sampler_reg->modifier & VKD3DSPRM_NONUNIFORM)
vkd3d_dxbc_compiler_decorate_nonuniform(compiler, sampler_id);
/* To be strict against Vulkan spec, the sampled image itself needs to be marked as NonUniform. */
if ((image->image_id && resource_reg->modifier == VKD3DSPRM_NONUNIFORM) ||
sampler_reg->modifier == VKD3DSPRM_NONUNIFORM)
if ((image->image_id && (resource_reg->modifier & VKD3DSPRM_NONUNIFORM)) ||
(sampler_reg->modifier & VKD3DSPRM_NONUNIFORM))
{
vkd3d_dxbc_compiler_decorate_nonuniform(compiler, image->sampled_image_id);
}
@ -9681,7 +9681,7 @@ static void vkd3d_dxbc_compiler_emit_ld_raw_structured_srv_uav(struct vkd3d_dxbc
ptr_id = vkd3d_spirv_build_op_access_chain(builder, ptr_type_id, image.id, indices, ARRAY_SIZE(indices));
constituents[j++] = vkd3d_spirv_build_op_loadv(builder, type_id, ptr_id, access_mask, &alignment, 1);
if (resource->reg.modifier == VKD3DSPRM_NONUNIFORM)
if (resource->reg.modifier & VKD3DSPRM_NONUNIFORM)
vkd3d_dxbc_compiler_decorate_nonuniform(compiler, ptr_id);
}
else
@ -9821,7 +9821,7 @@ static void vkd3d_dxbc_compiler_emit_store_uav_raw_structured(struct vkd3d_dxbc_
ptr_id = vkd3d_spirv_build_op_access_chain(builder, ptr_type_id, image.id, indices, ARRAY_SIZE(indices));
vkd3d_spirv_build_op_storev(builder, ptr_id, texel_id, access_mask, &alignment, 1);
if (dst->reg.modifier == VKD3DSPRM_NONUNIFORM)
if (dst->reg.modifier & VKD3DSPRM_NONUNIFORM)
vkd3d_dxbc_compiler_decorate_nonuniform(compiler, ptr_id);
}
else
@ -10032,7 +10032,7 @@ static void vkd3d_dxbc_compiler_emit_uav_counter_instruction(struct vkd3d_dxbc_c
ctr_ptr_type_id, image_ptr, zero_id, zero_id);
/* Need to mark the pointer argument itself as non-uniform. */
if (src->reg.modifier == VKD3DSPRM_NONUNIFORM)
if (src->reg.modifier & VKD3DSPRM_NONUNIFORM)
vkd3d_dxbc_compiler_decorate_nonuniform(compiler, pointer_id);
}
else
@ -10195,7 +10195,7 @@ static void vkd3d_dxbc_compiler_emit_atomic_instruction(struct vkd3d_dxbc_compil
ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, image.storage_class, type_id);
pointer_id = vkd3d_spirv_build_op_access_chain(builder, ptr_type_id, image.id, indices, ARRAY_SIZE(indices));
if (resource->reg.modifier == VKD3DSPRM_NONUNIFORM)
if (resource->reg.modifier & VKD3DSPRM_NONUNIFORM)
vkd3d_dxbc_compiler_decorate_nonuniform(compiler, pointer_id);
}
else
@ -10207,7 +10207,7 @@ static void vkd3d_dxbc_compiler_emit_atomic_instruction(struct vkd3d_dxbc_compil
pointer_id = vkd3d_spirv_build_op_image_texel_pointer(builder,
ptr_type_id, image.id, coordinate_id, sample_id);
if (resource->reg.modifier == VKD3DSPRM_NONUNIFORM)
if (resource->reg.modifier & VKD3DSPRM_NONUNIFORM)
vkd3d_dxbc_compiler_decorate_nonuniform(compiler, pointer_id);
}
@ -10258,7 +10258,7 @@ static void vkd3d_dxbc_compiler_emit_bufinfo(struct vkd3d_dxbc_compiler *compile
}
else
{
if (src->reg.modifier == VKD3DSPRM_NONUNIFORM)
if (src->reg.modifier & VKD3DSPRM_NONUNIFORM)
vkd3d_dxbc_compiler_decorate_nonuniform(compiler, image.id);
val_id = vkd3d_spirv_build_op_array_length(builder, type_id, image.id, 0);

View File

@ -386,7 +386,8 @@ enum vkd3d_immconst_type
enum vkd3d_shader_register_modifier
{
VKD3DSPRM_NONE = 0,
VKD3DSPRM_NONUNIFORM = 1,
VKD3DSPRM_NONUNIFORM = 0x1,
VKD3DSPRM_RELAXED_PRECISION = 0x2,
};
enum vkd3d_shader_src_modifier
@ -534,7 +535,7 @@ struct vkd3d_shader_register_index
struct vkd3d_shader_register
{
enum vkd3d_shader_register_type type;
enum vkd3d_shader_register_modifier modifier;
uint32_t modifier; /* enum vkd3d_shader_register_modifier */
enum vkd3d_data_type data_type;
struct vkd3d_shader_register_index idx[3];
enum vkd3d_immconst_type immconst_type;