vkd3d-shader: Pass the interface info as part of the vkd3d_shader_compile_info structure chain.

Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Henri Verbeet
2020-06-19 16:13:33 +04:30
committed by Alexandre Julliard
parent 8ff9610fed
commit c4e6657c11
7 changed files with 13 additions and 20 deletions

View File

@ -179,6 +179,7 @@ struct vkd3d_shader_push_constant_buffer
unsigned int size; /* in bytes */ unsigned int size; /* in bytes */
}; };
/* Extends vkd3d_shader_compile_info. */
struct vkd3d_shader_interface_info struct vkd3d_shader_interface_info
{ {
enum vkd3d_shader_structure_type type; enum vkd3d_shader_structure_type type;
@ -644,7 +645,6 @@ struct vkd3d_shader_signature
int vkd3d_shader_compile_dxbc(const struct vkd3d_shader_compile_info *compile_info, int vkd3d_shader_compile_dxbc(const struct vkd3d_shader_compile_info *compile_info,
struct vkd3d_shader_code *spirv, unsigned int compiler_options, struct vkd3d_shader_code *spirv, unsigned int compiler_options,
const struct vkd3d_shader_interface_info *shader_interface_info,
const struct vkd3d_shader_spirv_target_info *target_info); const struct vkd3d_shader_spirv_target_info *target_info);
void vkd3d_shader_free_shader_code(struct vkd3d_shader_code *code); void vkd3d_shader_free_shader_code(struct vkd3d_shader_code *code);
@ -676,7 +676,6 @@ void vkd3d_shader_free_shader_signature(struct vkd3d_shader_signature *signature
*/ */
typedef int (*PFN_vkd3d_shader_compile_dxbc)(const struct vkd3d_shader_compile_info *compile_info, typedef int (*PFN_vkd3d_shader_compile_dxbc)(const struct vkd3d_shader_compile_info *compile_info,
struct vkd3d_shader_code *spirv, unsigned int compiler_options, struct vkd3d_shader_code *spirv, unsigned int compiler_options,
const struct vkd3d_shader_interface_info *shader_interface_info,
const struct vkd3d_shader_spirv_target_info *target_info); const struct vkd3d_shader_spirv_target_info *target_info);
typedef void (*PFN_vkd3d_shader_free_shader_code)(struct vkd3d_shader_code *code); typedef void (*PFN_vkd3d_shader_free_shader_code)(struct vkd3d_shader_code *code);

View File

@ -2124,12 +2124,13 @@ static void vkd3d_dxbc_compiler_emit_initial_declarations(struct vkd3d_dxbc_comp
struct vkd3d_dxbc_compiler *vkd3d_dxbc_compiler_create(const struct vkd3d_shader_version *shader_version, struct vkd3d_dxbc_compiler *vkd3d_dxbc_compiler_create(const struct vkd3d_shader_version *shader_version,
const struct vkd3d_shader_desc *shader_desc, uint32_t compiler_options, const struct vkd3d_shader_desc *shader_desc, uint32_t compiler_options,
const struct vkd3d_shader_interface_info *shader_interface, const struct vkd3d_shader_compile_info *compile_info,
const struct vkd3d_shader_spirv_target_info *target_info, const struct vkd3d_shader_spirv_target_info *target_info,
const struct vkd3d_shader_scan_info *scan_info) const struct vkd3d_shader_scan_info *scan_info)
{ {
const struct vkd3d_shader_signature *patch_constant_signature = &shader_desc->patch_constant_signature; const struct vkd3d_shader_signature *patch_constant_signature = &shader_desc->patch_constant_signature;
const struct vkd3d_shader_signature *output_signature = &shader_desc->output_signature; const struct vkd3d_shader_signature *output_signature = &shader_desc->output_signature;
const struct vkd3d_shader_interface_info *shader_interface;
struct vkd3d_dxbc_compiler *compiler; struct vkd3d_dxbc_compiler *compiler;
unsigned int max_element_count; unsigned int max_element_count;
unsigned int i; unsigned int i;
@ -2157,7 +2158,7 @@ struct vkd3d_dxbc_compiler *vkd3d_dxbc_compiler_create(const struct vkd3d_shader
compiler->output_signature = &shader_desc->output_signature; compiler->output_signature = &shader_desc->output_signature;
compiler->patch_constant_signature = &shader_desc->patch_constant_signature; compiler->patch_constant_signature = &shader_desc->patch_constant_signature;
if (shader_interface) if ((shader_interface = vkd3d_find_struct(compile_info->next, INTERFACE_INFO)))
{ {
compiler->xfb_info = vkd3d_find_struct(shader_interface->next, TRANSFORM_FEEDBACK_INFO); compiler->xfb_info = vkd3d_find_struct(shader_interface->next, TRANSFORM_FEEDBACK_INFO);

View File

@ -129,7 +129,6 @@ static int vkd3d_shader_validate_spirv_target_info(const struct vkd3d_shader_spi
int vkd3d_shader_compile_dxbc(const struct vkd3d_shader_compile_info *compile_info, int vkd3d_shader_compile_dxbc(const struct vkd3d_shader_compile_info *compile_info,
struct vkd3d_shader_code *spirv, unsigned int compiler_options, struct vkd3d_shader_code *spirv, unsigned int compiler_options,
const struct vkd3d_shader_interface_info *shader_interface_info,
const struct vkd3d_shader_spirv_target_info *info) const struct vkd3d_shader_spirv_target_info *info)
{ {
struct vkd3d_shader_instruction instruction; struct vkd3d_shader_instruction instruction;
@ -138,8 +137,8 @@ int vkd3d_shader_compile_dxbc(const struct vkd3d_shader_compile_info *compile_in
struct vkd3d_shader_parser parser; struct vkd3d_shader_parser parser;
int ret; int ret;
TRACE("compile_info %p, spirv %p, compiler_options %#x, shader_interface_info %p, info %p.\n", TRACE("compile_info %p, spirv %p, compiler_options %#x, info %p.\n",
compile_info, spirv, compiler_options, shader_interface_info, info); compile_info, spirv, compiler_options, info);
if (compile_info->type != VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO) if (compile_info->type != VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO)
{ {
@ -147,12 +146,6 @@ int vkd3d_shader_compile_dxbc(const struct vkd3d_shader_compile_info *compile_in
return VKD3D_ERROR_INVALID_ARGUMENT; return VKD3D_ERROR_INVALID_ARGUMENT;
} }
if (shader_interface_info && shader_interface_info->type != VKD3D_SHADER_STRUCTURE_TYPE_INTERFACE_INFO)
{
WARN("Invalid structure type %#x.\n", shader_interface_info->type);
return VKD3D_ERROR_INVALID_ARGUMENT;
}
if ((ret = vkd3d_shader_validate_spirv_target_info(info)) < 0) if ((ret = vkd3d_shader_validate_spirv_target_info(info)) < 0)
return ret; return ret;
@ -170,7 +163,7 @@ int vkd3d_shader_compile_dxbc(const struct vkd3d_shader_compile_info *compile_in
vkd3d_shader_trace(parser.data); vkd3d_shader_trace(parser.data);
if (!(spirv_compiler = vkd3d_dxbc_compiler_create(&parser.shader_version, if (!(spirv_compiler = vkd3d_dxbc_compiler_create(&parser.shader_version,
&parser.shader_desc, compiler_options, shader_interface_info, info, &scan_info))) &parser.shader_desc, compiler_options, compile_info, info, &scan_info)))
{ {
ERR("Failed to create DXBC compiler.\n"); ERR("Failed to create DXBC compiler.\n");
vkd3d_shader_parser_destroy(&parser); vkd3d_shader_parser_destroy(&parser);

View File

@ -821,7 +821,7 @@ struct vkd3d_dxbc_compiler;
struct vkd3d_dxbc_compiler *vkd3d_dxbc_compiler_create(const struct vkd3d_shader_version *shader_version, struct vkd3d_dxbc_compiler *vkd3d_dxbc_compiler_create(const struct vkd3d_shader_version *shader_version,
const struct vkd3d_shader_desc *shader_desc, uint32_t compiler_options, const struct vkd3d_shader_desc *shader_desc, uint32_t compiler_options,
const struct vkd3d_shader_interface_info *shader_interface_info, const struct vkd3d_shader_compile_info *compile_info,
const struct vkd3d_shader_spirv_target_info *target_info, const struct vkd3d_shader_spirv_target_info *target_info,
const struct vkd3d_shader_scan_info *scan_info) DECLSPEC_HIDDEN; const struct vkd3d_shader_scan_info *scan_info) DECLSPEC_HIDDEN;
int vkd3d_dxbc_compiler_handle_instruction(struct vkd3d_dxbc_compiler *compiler, int vkd3d_dxbc_compiler_handle_instruction(struct vkd3d_dxbc_compiler *compiler,

View File

@ -1348,11 +1348,11 @@ static HRESULT create_shader_stage(struct d3d12_device *device,
shader_desc.flags = 0; shader_desc.flags = 0;
compile_info.type = VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO; compile_info.type = VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO;
compile_info.next = NULL; compile_info.next = shader_interface;
compile_info.source.code = code->pShaderBytecode; compile_info.source.code = code->pShaderBytecode;
compile_info.source.size = code->BytecodeLength; compile_info.source.size = code->BytecodeLength;
if ((ret = vkd3d_shader_compile_dxbc(&compile_info, &spirv, 0, shader_interface, target_info)) < 0) if ((ret = vkd3d_shader_compile_dxbc(&compile_info, &spirv, 0, target_info)) < 0)
{ {
WARN("Failed to compile shader, vkd3d result %d.\n", ret); WARN("Failed to compile shader, vkd3d result %d.\n", ret);
return hresult_from_vkd3d_result(ret); return hresult_from_vkd3d_result(ret);

View File

@ -168,7 +168,7 @@ int main(int argc, char **argv)
return 1; return 1;
} }
ret = vkd3d_shader_compile_dxbc(&info, &spirv, options.compiler_options, NULL, NULL); ret = vkd3d_shader_compile_dxbc(&info, &spirv, options.compiler_options, NULL);
vkd3d_shader_free_shader_code(&info.source); vkd3d_shader_free_shader_code(&info.source);
if (ret < 0) if (ret < 0)
{ {

View File

@ -55,7 +55,7 @@ static void test_invalid_shaders(void)
info.source.code = ps_break_code; info.source.code = ps_break_code;
info.source.size = sizeof(ps_break_code); info.source.size = sizeof(ps_break_code);
rc = vkd3d_shader_compile_dxbc(&info, &spirv, VKD3D_SHADER_STRIP_DEBUG, NULL, NULL); rc = vkd3d_shader_compile_dxbc(&info, &spirv, VKD3D_SHADER_STRIP_DEBUG, NULL);
ok(rc == VKD3D_ERROR_INVALID_SHADER, "Got unexpected error code %d.\n", rc); ok(rc == VKD3D_ERROR_INVALID_SHADER, "Got unexpected error code %d.\n", rc);
} }
@ -128,7 +128,7 @@ static void test_vkd3d_shader_pfns(void)
compile_info.next = NULL; compile_info.next = NULL;
compile_info.source = vs; compile_info.source = vs;
rc = pfn_vkd3d_shader_compile_dxbc(&compile_info, &spirv, 0, NULL, NULL); rc = pfn_vkd3d_shader_compile_dxbc(&compile_info, &spirv, 0, NULL);
ok(rc == VKD3D_OK, "Got unexpected error code %d.\n", rc); ok(rc == VKD3D_OK, "Got unexpected error code %d.\n", rc);
pfn_vkd3d_shader_free_shader_code(&spirv); pfn_vkd3d_shader_free_shader_code(&spirv);