mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
vkd3d-shader/dxbc: Pass a vkd3d_shader_dxbc_section_desc structure to shader_parse_signature().
This commit is contained in:
committed by
Alexandre Julliard
parent
bf3c012834
commit
6c64f8a217
Notes:
Alexandre Julliard
2023-02-23 22:20:24 +01:00
Approved-by: Zebediah Figura (@zfigura) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/103
@@ -1829,18 +1829,19 @@ static int parse_dxbc(const char *data, size_t data_size,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int shader_parse_signature(DWORD tag, const char *data, DWORD data_size,
|
static int shader_parse_signature(const struct vkd3d_shader_dxbc_section_desc *section,
|
||||||
struct vkd3d_shader_signature *s)
|
struct vkd3d_shader_signature *s)
|
||||||
{
|
{
|
||||||
bool has_stream_index, has_min_precision;
|
bool has_stream_index, has_min_precision;
|
||||||
struct vkd3d_shader_signature_element *e;
|
struct vkd3d_shader_signature_element *e;
|
||||||
|
const char *data = section->data.code;
|
||||||
const char *ptr = data;
|
const char *ptr = data;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
uint32_t count;
|
uint32_t count;
|
||||||
|
|
||||||
if (!require_space(0, 2, sizeof(DWORD), data_size))
|
if (!require_space(0, 2, sizeof(uint32_t), section->data.size))
|
||||||
{
|
{
|
||||||
WARN("Invalid data size %#x.\n", data_size);
|
WARN("Invalid data size %#zx.\n", section->data.size);
|
||||||
return VKD3D_ERROR_INVALID_ARGUMENT;
|
return VKD3D_ERROR_INVALID_ARGUMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1849,9 +1850,9 @@ static int shader_parse_signature(DWORD tag, const char *data, DWORD data_size,
|
|||||||
|
|
||||||
skip_dword_unknown(&ptr, 1); /* It seems to always be 0x00000008. */
|
skip_dword_unknown(&ptr, 1); /* It seems to always be 0x00000008. */
|
||||||
|
|
||||||
if (!require_space(ptr - data, count, 6 * sizeof(DWORD), data_size))
|
if (!require_space(ptr - data, count, 6 * sizeof(uint32_t), section->data.size))
|
||||||
{
|
{
|
||||||
WARN("Invalid count %#x (data size %#x).\n", count, data_size);
|
WARN("Invalid count %#x (data size %#zx).\n", count, section->data.size);
|
||||||
return VKD3D_ERROR_INVALID_ARGUMENT;
|
return VKD3D_ERROR_INVALID_ARGUMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1861,8 +1862,8 @@ static int shader_parse_signature(DWORD tag, const char *data, DWORD data_size,
|
|||||||
return VKD3D_ERROR_OUT_OF_MEMORY;
|
return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
has_min_precision = tag == TAG_OSG1 || tag == TAG_PSG1 || tag == TAG_ISG1;
|
has_min_precision = section->tag == TAG_OSG1 || section->tag == TAG_PSG1 || section->tag == TAG_ISG1;
|
||||||
has_stream_index = tag == TAG_OSG5 || has_min_precision;
|
has_stream_index = section->tag == TAG_OSG5 || has_min_precision;
|
||||||
|
|
||||||
for (i = 0; i < count; ++i)
|
for (i = 0; i < count; ++i)
|
||||||
{
|
{
|
||||||
@@ -1874,9 +1875,9 @@ static int shader_parse_signature(DWORD tag, const char *data, DWORD data_size,
|
|||||||
e[i].stream_index = 0;
|
e[i].stream_index = 0;
|
||||||
|
|
||||||
read_dword(&ptr, &name_offset);
|
read_dword(&ptr, &name_offset);
|
||||||
if (!(e[i].semantic_name = shader_get_string(data, data_size, name_offset)))
|
if (!(e[i].semantic_name = shader_get_string(data, section->data.size, name_offset)))
|
||||||
{
|
{
|
||||||
WARN("Invalid name offset %#x (data size %#x).\n", name_offset, data_size);
|
WARN("Invalid name offset %#x (data size %#zx).\n", name_offset, section->data.size);
|
||||||
vkd3d_free(e);
|
vkd3d_free(e);
|
||||||
return VKD3D_ERROR_INVALID_ARGUMENT;
|
return VKD3D_ERROR_INVALID_ARGUMENT;
|
||||||
}
|
}
|
||||||
@@ -1887,7 +1888,7 @@ static int shader_parse_signature(DWORD tag, const char *data, DWORD data_size,
|
|||||||
read_dword(&ptr, &mask);
|
read_dword(&ptr, &mask);
|
||||||
e[i].mask = mask & 0xff;
|
e[i].mask = mask & 0xff;
|
||||||
e[i].used_mask = (mask >> 8) & 0xff;
|
e[i].used_mask = (mask >> 8) & 0xff;
|
||||||
switch (tag)
|
switch (section->tag)
|
||||||
{
|
{
|
||||||
case TAG_OSGN:
|
case TAG_OSGN:
|
||||||
case TAG_OSG1:
|
case TAG_OSG1:
|
||||||
@@ -1917,6 +1918,7 @@ static int shader_parse_signature(DWORD tag, const char *data, DWORD data_size,
|
|||||||
|
|
||||||
static int isgn_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
|
static int isgn_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
|
||||||
{
|
{
|
||||||
|
struct vkd3d_shader_dxbc_section_desc section = {.tag = tag, .data = {.code = data, .size = data_size}};
|
||||||
struct vkd3d_shader_signature *is = ctx;
|
struct vkd3d_shader_signature *is = ctx;
|
||||||
|
|
||||||
if (tag != TAG_ISGN)
|
if (tag != TAG_ISGN)
|
||||||
@@ -1927,7 +1929,7 @@ static int isgn_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
|
|||||||
FIXME("Multiple input signatures.\n");
|
FIXME("Multiple input signatures.\n");
|
||||||
vkd3d_shader_free_shader_signature(is);
|
vkd3d_shader_free_shader_signature(is);
|
||||||
}
|
}
|
||||||
return shader_parse_signature(tag, data, data_size, is);
|
return shader_parse_signature(§ion, is);
|
||||||
}
|
}
|
||||||
|
|
||||||
int shader_parse_input_signature(const void *dxbc, size_t dxbc_length,
|
int shader_parse_input_signature(const void *dxbc, size_t dxbc_length,
|
||||||
@@ -1944,6 +1946,7 @@ int shader_parse_input_signature(const void *dxbc, size_t dxbc_length,
|
|||||||
|
|
||||||
static int shdr_handler(const char *data, DWORD data_size, DWORD tag, void *context)
|
static int shdr_handler(const char *data, DWORD data_size, DWORD tag, void *context)
|
||||||
{
|
{
|
||||||
|
struct vkd3d_shader_dxbc_section_desc section = {.tag = tag, .data = {.code = data, .size = data_size}};
|
||||||
struct vkd3d_shader_desc *desc = context;
|
struct vkd3d_shader_desc *desc = context;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@@ -1956,7 +1959,7 @@ static int shdr_handler(const char *data, DWORD data_size, DWORD tag, void *cont
|
|||||||
FIXME("Multiple input signatures.\n");
|
FIXME("Multiple input signatures.\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((ret = shader_parse_signature(tag, data, data_size, &desc->input_signature)) < 0)
|
if ((ret = shader_parse_signature(§ion, &desc->input_signature)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1968,7 +1971,7 @@ static int shdr_handler(const char *data, DWORD data_size, DWORD tag, void *cont
|
|||||||
FIXME("Multiple output signatures.\n");
|
FIXME("Multiple output signatures.\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((ret = shader_parse_signature(tag, data, data_size, &desc->output_signature)) < 0)
|
if ((ret = shader_parse_signature(§ion, &desc->output_signature)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1979,7 +1982,7 @@ static int shdr_handler(const char *data, DWORD data_size, DWORD tag, void *cont
|
|||||||
FIXME("Multiple patch constant signatures.\n");
|
FIXME("Multiple patch constant signatures.\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((ret = shader_parse_signature(tag, data, data_size, &desc->patch_constant_signature)) < 0)
|
if ((ret = shader_parse_signature(§ion, &desc->patch_constant_signature)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user