vkd3d-shader: Add INVARIANT_POSITION quirk.
Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
parent
2152500014
commit
32c5abf496
|
@ -307,6 +307,10 @@ enum vkd3d_shader_quirk
|
||||||
/* After every write to group shared memory, force a memory barrier.
|
/* After every write to group shared memory, force a memory barrier.
|
||||||
* This works around buggy games which forget to use barrier(). */
|
* This works around buggy games which forget to use barrier(). */
|
||||||
VKD3D_SHADER_QUIRK_FORCE_TGSM_BARRIERS = (1 << 1),
|
VKD3D_SHADER_QUIRK_FORCE_TGSM_BARRIERS = (1 << 1),
|
||||||
|
|
||||||
|
/* For Position builtins in Output storage class, emit Invariant decoration.
|
||||||
|
* Normally, games have to emit Precise math for position, but if they forget ... */
|
||||||
|
VKD3D_SHADER_QUIRK_INVARIANT_POSITION = (1 << 2),
|
||||||
};
|
};
|
||||||
|
|
||||||
struct vkd3d_shader_quirk_hash
|
struct vkd3d_shader_quirk_hash
|
||||||
|
|
|
@ -490,6 +490,7 @@ int vkd3d_shader_compile_dxil(const struct vkd3d_shader_code *dxbc,
|
||||||
unsigned int i, max_size;
|
unsigned int i, max_size;
|
||||||
vkd3d_shader_hash_t hash;
|
vkd3d_shader_hash_t hash;
|
||||||
int ret = VKD3D_OK;
|
int ret = VKD3D_OK;
|
||||||
|
uint32_t quirks;
|
||||||
void *code;
|
void *code;
|
||||||
|
|
||||||
dxil_spv_set_thread_log_callback(vkd3d_dxil_log_callback, NULL);
|
dxil_spv_set_thread_log_callback(vkd3d_dxil_log_callback, NULL);
|
||||||
|
@ -502,6 +503,7 @@ int vkd3d_shader_compile_dxil(const struct vkd3d_shader_code *dxbc,
|
||||||
spirv->meta.replaced = true;
|
spirv->meta.replaced = true;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
quirks = vkd3d_shader_compile_arguments_select_quirks(compiler_args, hash);
|
||||||
|
|
||||||
dxil_spv_begin_thread_allocator_context();
|
dxil_spv_begin_thread_allocator_context();
|
||||||
|
|
||||||
|
@ -760,6 +762,18 @@ int vkd3d_shader_compile_dxil(const struct vkd3d_shader_code *dxbc,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (quirks & VKD3D_SHADER_QUIRK_INVARIANT_POSITION)
|
||||||
|
{
|
||||||
|
const dxil_spv_option_invariant_position helper =
|
||||||
|
{ { DXIL_SPV_OPTION_INVARIANT_POSITION }, DXIL_SPV_TRUE };
|
||||||
|
if (dxil_spv_converter_add_option(converter, &helper.base) != DXIL_SPV_SUCCESS)
|
||||||
|
{
|
||||||
|
ERR("dxil-spirv does not support INVARIANT_POSITION.\n");
|
||||||
|
ret = VKD3D_ERROR_NOT_IMPLEMENTED;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
remap_userdata.shader_interface_info = shader_interface_info;
|
remap_userdata.shader_interface_info = shader_interface_info;
|
||||||
remap_userdata.shader_interface_local_info = NULL;
|
remap_userdata.shader_interface_local_info = NULL;
|
||||||
remap_userdata.num_root_descriptors = num_root_descriptors;
|
remap_userdata.num_root_descriptors = num_root_descriptors;
|
||||||
|
|
|
@ -3845,8 +3845,14 @@ static void vkd3d_dxbc_compiler_emit_store_dst_scalar(struct vkd3d_dxbc_compiler
|
||||||
vkd3d_dxbc_compiler_emit_store_dst_components(compiler, dst, component_type, component_ids);
|
vkd3d_dxbc_compiler_emit_store_dst_components(compiler, dst, component_type, component_ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool vkd3d_dxbc_compiler_has_quirk(struct vkd3d_dxbc_compiler *compiler,
|
||||||
|
enum vkd3d_shader_quirk quirk)
|
||||||
|
{
|
||||||
|
return !!(compiler->quirks & quirk);
|
||||||
|
}
|
||||||
|
|
||||||
static void vkd3d_dxbc_compiler_decorate_builtin(struct vkd3d_dxbc_compiler *compiler,
|
static void vkd3d_dxbc_compiler_decorate_builtin(struct vkd3d_dxbc_compiler *compiler,
|
||||||
uint32_t target_id, SpvBuiltIn builtin)
|
uint32_t target_id, SpvBuiltIn builtin, SpvStorageClass storage_class)
|
||||||
{
|
{
|
||||||
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
|
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
|
||||||
|
|
||||||
|
@ -3883,6 +3889,13 @@ static void vkd3d_dxbc_compiler_decorate_builtin(struct vkd3d_dxbc_compiler *com
|
||||||
case SpvBuiltInCullDistance:
|
case SpvBuiltInCullDistance:
|
||||||
vkd3d_spirv_enable_capability(builder, SpvCapabilityCullDistance);
|
vkd3d_spirv_enable_capability(builder, SpvCapabilityCullDistance);
|
||||||
break;
|
break;
|
||||||
|
case SpvBuiltInPosition:
|
||||||
|
if (storage_class == SpvStorageClassOutput &&
|
||||||
|
vkd3d_dxbc_compiler_has_quirk(compiler, VKD3D_SHADER_QUIRK_INVARIANT_POSITION))
|
||||||
|
{
|
||||||
|
vkd3d_spirv_build_op_decorate(builder, target_id, SpvDecorationInvariant, NULL, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -3961,7 +3974,7 @@ static uint32_t vkd3d_dxbc_compiler_emit_draw_parameter_fixup(struct vkd3d_dxbc_
|
||||||
base_var_id = vkd3d_dxbc_compiler_emit_variable(compiler, &builder->global_stream,
|
base_var_id = vkd3d_dxbc_compiler_emit_variable(compiler, &builder->global_stream,
|
||||||
SpvStorageClassInput, VKD3D_TYPE_INT, 1);
|
SpvStorageClassInput, VKD3D_TYPE_INT, 1);
|
||||||
vkd3d_spirv_add_iface_variable(builder, base_var_id);
|
vkd3d_spirv_add_iface_variable(builder, base_var_id);
|
||||||
vkd3d_dxbc_compiler_decorate_builtin(compiler, base_var_id, base);
|
vkd3d_dxbc_compiler_decorate_builtin(compiler, base_var_id, base, SpvStorageClassInput);
|
||||||
|
|
||||||
type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_INT, 1);
|
type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_INT, 1);
|
||||||
base_id = vkd3d_spirv_build_op_load(builder,
|
base_id = vkd3d_spirv_build_op_load(builder,
|
||||||
|
@ -4364,7 +4377,7 @@ static uint32_t vkd3d_dxbc_compiler_emit_builtin_variable(struct vkd3d_dxbc_comp
|
||||||
&builder->global_stream, storage_class,
|
&builder->global_stream, storage_class,
|
||||||
builtin->component_type, builtin->component_count, array_size);
|
builtin->component_type, builtin->component_count, array_size);
|
||||||
vkd3d_spirv_add_iface_variable(builder, id);
|
vkd3d_spirv_add_iface_variable(builder, id);
|
||||||
vkd3d_dxbc_compiler_decorate_builtin(compiler, id, builtin->spirv_builtin);
|
vkd3d_dxbc_compiler_decorate_builtin(compiler, id, builtin->spirv_builtin, storage_class);
|
||||||
|
|
||||||
if (compiler->shader_type == VKD3D_SHADER_TYPE_PIXEL && storage_class == SpvStorageClassInput
|
if (compiler->shader_type == VKD3D_SHADER_TYPE_PIXEL && storage_class == SpvStorageClassInput
|
||||||
&& builtin->component_type != VKD3D_TYPE_FLOAT && builtin->component_type != VKD3D_TYPE_BOOL)
|
&& builtin->component_type != VKD3D_TYPE_FLOAT && builtin->component_type != VKD3D_TYPE_BOOL)
|
||||||
|
@ -9065,12 +9078,6 @@ static void vkd3d_dxbc_compiler_emit_lod(struct vkd3d_dxbc_compiler *compiler,
|
||||||
dst, val_id, image.sampled_type, resource->swizzle);
|
dst, val_id, image.sampled_type, resource->swizzle);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool vkd3d_dxbc_compiler_has_quirk(struct vkd3d_dxbc_compiler *compiler,
|
|
||||||
enum vkd3d_shader_quirk quirk)
|
|
||||||
{
|
|
||||||
return !!(compiler->quirks & quirk);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vkd3d_dxbc_compiler_emit_sample(struct vkd3d_dxbc_compiler *compiler,
|
static void vkd3d_dxbc_compiler_emit_sample(struct vkd3d_dxbc_compiler *compiler,
|
||||||
const struct vkd3d_shader_instruction *instruction)
|
const struct vkd3d_shader_instruction *instruction)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue