vkd3d-shader: Implement vkd3d_spirv_binary_to_text helper.

Signed-off-by: Isabella Bosia <ibosia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Isabella Bosia
2020-09-07 12:35:40 +01:00
committed by Alexandre Julliard
parent 7dd8c15d49
commit e75a0d6f14

View File

@@ -50,36 +50,62 @@ static spv_target_env spv_target_env_from_vkd3d(enum vkd3d_shader_spirv_environm
} }
} }
static void vkd3d_spirv_dump(const struct vkd3d_shader_code *spirv, enum vkd3d_shader_spirv_environment environment) static enum vkd3d_result vkd3d_spirv_binary_to_text(const struct vkd3d_shader_code *spirv,
enum vkd3d_shader_spirv_environment environment, uint32_t options, struct vkd3d_shader_code *out)
{ {
const static uint32_t options
= SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES | SPV_BINARY_TO_TEXT_OPTION_INDENT;
spv_diagnostic diagnostic = NULL; spv_diagnostic diagnostic = NULL;
spv_text text = NULL; spv_text text = NULL;
spv_context context; spv_context context;
spv_result_t ret; spv_result_t spvret;
enum vkd3d_result result = VKD3D_OK;
context = spvContextCreate(spv_target_env_from_vkd3d(environment)); context = spvContextCreate(spv_target_env_from_vkd3d(environment));
if (!(ret = spvBinaryToText(context, spirv->code, spirv->size / sizeof(uint32_t), if (!(spvret = spvBinaryToText(context, spirv->code, spirv->size / sizeof(uint32_t),
options, &text, &diagnostic))) options, &text, &diagnostic)))
{ {
const char *str, *current = text->str; void *code = vkd3d_malloc(text->length);
while ((str = strchr(current, '\n'))) if (code)
{ {
TRACE("%.*s\n", (int)(str - current), current); memcpy(code, text->str, text->length);
current = str + 1; out->size = text->length;
out->code = code;
} }
else
result = VKD3D_ERROR_OUT_OF_MEMORY;
} }
else else
{ {
FIXME("Failed to convert SPIR-V binary to text, ret %d.\n", ret); FIXME("Failed to convert SPIR-V binary to text, ret %d.\n", spvret);
FIXME("Diagnostic message: %s.\n", debugstr_a(diagnostic->error)); FIXME("Diagnostic message: %s.\n", debugstr_a(diagnostic->error));
result = VKD3D_ERROR;
} }
spvTextDestroy(text); spvTextDestroy(text);
spvDiagnosticDestroy(diagnostic); spvDiagnosticDestroy(diagnostic);
spvContextDestroy(context); spvContextDestroy(context);
return result;
}
static void vkd3d_spirv_dump(const struct vkd3d_shader_code *spirv,
enum vkd3d_shader_spirv_environment environment)
{
const static uint32_t options
= SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES | SPV_BINARY_TO_TEXT_OPTION_INDENT;
struct vkd3d_shader_code text;
if (!vkd3d_spirv_binary_to_text(spirv, environment, options, &text))
{
const char *str, *current = text.code;
while ((str = strchr(current, '\n')))
{
TRACE("%.*s\n", (int)(str - current), current);
current = str + 1;
}
vkd3d_shader_free_shader_code(&text);
}
} }
static void vkd3d_spirv_validate(const struct vkd3d_shader_code *spirv, static void vkd3d_spirv_validate(const struct vkd3d_shader_code *spirv,