vkd3d-shader: Add shader replacement support for DXR as well.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2021-03-17 15:17:35 +01:00
parent 5abc4b9af2
commit e0374d735d
3 changed files with 52 additions and 21 deletions

View File

@ -773,8 +773,16 @@ int vkd3d_shader_compile_dxil_export(const struct vkd3d_shader_code *dxil,
hash = vkd3d_shader_hash(dxil);
spirv->meta.replaced = false;
spirv->meta.hash = hash;
/* TODO: Probably need to add per-export shader replacement. */
demangled_export = vkd3d_dup_demangled_entry_point_ascii(export);
if (demangled_export)
{
if (vkd3d_shader_replace_export(hash, &spirv->code, &spirv->size, demangled_export))
{
spirv->meta.replaced = true;
vkd3d_free(demangled_export);
return ret;
}
}
dxil_spv_begin_thread_allocator_context();
@ -1077,17 +1085,14 @@ int vkd3d_shader_compile_dxil_export(const struct vkd3d_shader_code *dxil,
spirv->code = code;
spirv->size = compiled.size;
demangled_export = vkd3d_dup_demangled_entry_point_ascii(export);
if (demangled_export)
{
vkd3d_shader_dump_spirv_shader_export(hash, spirv, demangled_export);
vkd3d_free(demangled_export);
}
end:
dxil_spv_converter_free(converter);
dxil_spv_parsed_blob_free(blob);
dxil_spv_end_thread_allocator_context();
vkd3d_free(demangled_export);
return ret;
}

View File

@ -40,25 +40,12 @@ static void vkd3d_shader_dump_blob(const char *path, vkd3d_shader_hash_t hash, c
}
}
bool vkd3d_shader_replace(vkd3d_shader_hash_t hash, const void **data, size_t *size)
static bool vkd3d_shader_replace_path(const char *filename, vkd3d_shader_hash_t hash, const void **data, size_t *size)
{
static bool enabled = true;
char filename[1024];
void *buffer = NULL;
const char *path;
FILE *f = NULL;
size_t len;
if (!enabled)
return false;
if (!(path = getenv("VKD3D_SHADER_OVERRIDE")))
{
enabled = false;
return false;
}
snprintf(filename, ARRAY_SIZE(filename), "%s/%016"PRIx64".spv", path, hash);
if ((f = fopen(filename, "rb")))
{
if (fseek(f, 0, SEEK_END) < 0)
@ -78,7 +65,7 @@ bool vkd3d_shader_replace(vkd3d_shader_hash_t hash, const void **data, size_t *s
*data = buffer;
*size = len;
WARN("Overriding shader hash %016"PRIx64" with alternative SPIR-V module!\n", hash);
INFO("Overriding shader hash %016"PRIx64" with alternative SPIR-V module from %s!\n", hash, filename);
fclose(f);
return true;
@ -89,6 +76,44 @@ err:
return false;
}
bool vkd3d_shader_replace(vkd3d_shader_hash_t hash, const void **data, size_t *size)
{
static bool enabled = true;
char filename[1024];
const char *path;
if (!enabled)
return false;
if (!(path = getenv("VKD3D_SHADER_OVERRIDE")))
{
enabled = false;
return false;
}
snprintf(filename, ARRAY_SIZE(filename), "%s/%016"PRIx64".spv", path, hash);
return vkd3d_shader_replace_path(filename, hash, data, size);
}
bool vkd3d_shader_replace_export(vkd3d_shader_hash_t hash, const void **data, size_t *size, const char *export)
{
static bool enabled = true;
char filename[1024];
const char *path;
if (!enabled)
return false;
if (!(path = getenv("VKD3D_SHADER_OVERRIDE")))
{
enabled = false;
return false;
}
snprintf(filename, ARRAY_SIZE(filename), "%s/%016"PRIx64".lib.%s.spv", path, hash, export);
return vkd3d_shader_replace_path(filename, hash, data, size);
}
void vkd3d_shader_dump_shader(vkd3d_shader_hash_t hash, const struct vkd3d_shader_code *shader, const char *ext)
{
static bool enabled = true;

View File

@ -801,6 +801,7 @@ void vkd3d_shader_dump_spirv_shader_export(vkd3d_shader_hash_t hash, const struc
const char *export);
void vkd3d_shader_dump_shader(vkd3d_shader_hash_t hash, const struct vkd3d_shader_code *shader, const char *ext);
bool vkd3d_shader_replace(vkd3d_shader_hash_t hash, const void **data, size_t *size);
bool vkd3d_shader_replace_export(vkd3d_shader_hash_t hash, const void **data, size_t *size, const char *export);
static inline enum vkd3d_component_type vkd3d_component_type_from_data_type(
enum vkd3d_data_type data_type)