ReactOS 0.4.17-dev-934-g091855f
dxbc.c File Reference
Include dependency graph for dxbc.c:

Go to the source code of this file.

Classes

struct  root_signature_parser_context
 
struct  root_signature_writer_context
 

Macros

#define DXBC_CHECKSUM_SKIP_BYTE_COUNT   20
 
#define VKD3D_ROOT_SIGNATURE_1_0_ROOT_DESCRIPTOR_FLAGS   VKD3D_SHADER_ROOT_DESCRIPTOR_FLAG_DATA_VOLATILE
 
#define VKD3D_ROOT_SIGNATURE_1_0_DESCRIPTOR_RANGE_FLAGS    (VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE | VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_DATA_VOLATILE)
 

Functions

static void compute_dxbc_checksum (const void *dxbc, size_t size, uint32_t checksum[4])
 
void dxbc_writer_init (struct dxbc_writer *dxbc)
 
void dxbc_writer_add_section (struct dxbc_writer *dxbc, uint32_t tag, const void *data, size_t size)
 
int vkd3d_shader_serialize_dxbc (size_t section_count, const struct vkd3d_shader_dxbc_section_desc *sections, struct vkd3d_shader_code *dxbc, char **messages)
 
int dxbc_writer_write (struct dxbc_writer *dxbc, struct vkd3d_shader_code *out)
 
static bool require_space (size_t offset, size_t count, size_t size, size_t data_size)
 
static uint32_t read_u32 (const char **ptr)
 
static float read_float (const char **ptr)
 
static void skip_dword_unknown (const char **ptr, unsigned int count)
 
static const char * shader_get_string (const char *data, size_t data_size, size_t offset)
 
static int parse_dxbc (const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_message_context *message_context, const char *source_name, uint32_t flags, struct vkd3d_shader_dxbc_desc *desc)
 
void vkd3d_shader_free_dxbc (struct vkd3d_shader_dxbc_desc *dxbc)
 
static int for_each_dxbc_section (const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_message_context *message_context, const char *source_name, int(*section_handler)(const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, void *ctx), void *ctx)
 
int vkd3d_shader_parse_dxbc (const struct vkd3d_shader_code *dxbc, uint32_t flags, struct vkd3d_shader_dxbc_desc *desc, char **messages)
 
static enum vkd3d_shader_sysval_semantic map_fragment_output_sysval (const char *name)
 
static int shader_parse_signature (const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, struct shader_signature *s)
 
static int isgn_handler (const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, void *ctx)
 
int shader_parse_input_signature (const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_message_context *message_context, struct shader_signature *signature)
 
static int shdr_handler (const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, void *context)
 
void free_dxbc_shader_desc (struct dxbc_shader_desc *desc)
 
int shader_extract_from_dxbc (const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_message_context *message_context, const char *source_name, struct dxbc_shader_desc *desc)
 
static int shader_parse_descriptor_ranges (struct root_signature_parser_context *context, unsigned int offset, unsigned int count, struct vkd3d_shader_descriptor_range *ranges)
 
static void shader_validate_descriptor_range1 (const struct vkd3d_shader_descriptor_range1 *range)
 
static int shader_parse_descriptor_ranges1 (struct root_signature_parser_context *context, unsigned int offset, unsigned int count, struct vkd3d_shader_descriptor_range1 *ranges)
 
static int shader_parse_descriptor_table (struct root_signature_parser_context *context, unsigned int offset, struct vkd3d_shader_root_descriptor_table *table)
 
static int shader_parse_descriptor_table1 (struct root_signature_parser_context *context, unsigned int offset, struct vkd3d_shader_root_descriptor_table1 *table)
 
static int shader_parse_root_constants (struct root_signature_parser_context *context, unsigned int offset, struct vkd3d_shader_root_constants *constants)
 
static int shader_parse_root_descriptor (struct root_signature_parser_context *context, unsigned int offset, struct vkd3d_shader_root_descriptor *descriptor)
 
static void shader_validate_root_descriptor1 (const struct vkd3d_shader_root_descriptor1 *descriptor)
 
static int shader_parse_root_descriptor1 (struct root_signature_parser_context *context, unsigned int offset, struct vkd3d_shader_root_descriptor1 *descriptor)
 
static int shader_parse_root_parameters (struct root_signature_parser_context *context, unsigned int offset, unsigned int count, struct vkd3d_shader_root_parameter *parameters)
 
static int shader_parse_root_parameters1 (struct root_signature_parser_context *context, uint32_t offset, unsigned int count, struct vkd3d_shader_root_parameter1 *parameters)
 
static int shader_parse_static_samplers (struct root_signature_parser_context *context, unsigned int offset, unsigned int count, struct vkd3d_shader_static_sampler_desc *sampler_descs)
 
static int shader_parse_root_signature (const struct vkd3d_shader_code *data, struct vkd3d_shader_versioned_root_signature_desc *desc)
 
static int rts0_handler (const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, void *context)
 
int vkd3d_shader_parse_root_signature (const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_versioned_root_signature_desc *root_signature, char **messages)
 
static unsigned int versioned_root_signature_get_parameter_count (const struct vkd3d_shader_versioned_root_signature_desc *desc)
 
static enum vkd3d_shader_root_parameter_type versioned_root_signature_get_parameter_type (const struct vkd3d_shader_versioned_root_signature_desc *desc, unsigned int i)
 
static enum vkd3d_shader_visibility versioned_root_signature_get_parameter_shader_visibility (const struct vkd3d_shader_versioned_root_signature_desc *desc, unsigned int i)
 
static const struct vkd3d_shader_root_constants * versioned_root_signature_get_root_constants (const struct vkd3d_shader_versioned_root_signature_desc *desc, unsigned int i)
 
static unsigned int versioned_root_signature_get_static_sampler_count (const struct vkd3d_shader_versioned_root_signature_desc *desc)
 
static const struct vkd3d_shader_static_sampler_desc * versioned_root_signature_get_static_samplers (const struct vkd3d_shader_versioned_root_signature_desc *desc)
 
static unsigned int versioned_root_signature_get_flags (const struct vkd3d_shader_versioned_root_signature_desc *desc)
 
static size_t get_chunk_offset (struct root_signature_writer_context *context)
 
static void shader_write_root_signature_header (struct root_signature_writer_context *context)
 
static void shader_write_descriptor_ranges (struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_root_descriptor_table *table)
 
static void shader_write_descriptor_ranges1 (struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_root_descriptor_table1 *table)
 
static void shader_write_descriptor_table (struct root_signature_writer_context *context, const struct vkd3d_shader_root_descriptor_table *table)
 
static void shader_write_descriptor_table1 (struct root_signature_writer_context *context, const struct vkd3d_shader_root_descriptor_table1 *table)
 
static void shader_write_root_constants (struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_root_constants *constants)
 
static void shader_write_root_descriptor (struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_root_descriptor *descriptor)
 
static void shader_write_root_descriptor1 (struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_root_descriptor1 *descriptor)
 
static int shader_write_root_parameters (struct root_signature_writer_context *context, const struct vkd3d_shader_versioned_root_signature_desc *desc)
 
static void shader_write_static_samplers (struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_versioned_root_signature_desc *desc)
 
static int shader_write_root_signature (struct root_signature_writer_context *context, const struct vkd3d_shader_versioned_root_signature_desc *desc)
 
static int validate_descriptor_table_v_1_0 (const struct vkd3d_shader_root_descriptor_table *descriptor_table, struct vkd3d_shader_message_context *message_context)
 
static int validate_descriptor_table_v_1_1 (const struct vkd3d_shader_root_descriptor_table1 *descriptor_table, struct vkd3d_shader_message_context *message_context)
 
static int validate_root_signature_desc (const struct vkd3d_shader_versioned_root_signature_desc *desc, struct vkd3d_shader_message_context *message_context)
 
int vkd3d_shader_serialize_root_signature (const struct vkd3d_shader_versioned_root_signature_desc *root_signature, struct vkd3d_shader_code *dxbc, char **messages)
 
static void free_descriptor_ranges (const struct vkd3d_shader_root_parameter *parameters, unsigned int count)
 
static int convert_root_parameters_to_v_1_0 (struct vkd3d_shader_root_parameter *dst, const struct vkd3d_shader_root_parameter1 *src, unsigned int count)
 
static int convert_root_signature_to_v1_0 (struct vkd3d_shader_versioned_root_signature_desc *dst, const struct vkd3d_shader_versioned_root_signature_desc *src)
 
static void free_descriptor_ranges1 (const struct vkd3d_shader_root_parameter1 *parameters, unsigned int count)
 
static int convert_root_parameters_to_v_1_1 (struct vkd3d_shader_root_parameter1 *dst, const struct vkd3d_shader_root_parameter *src, unsigned int count)
 
static int convert_root_signature_to_v1_1 (struct vkd3d_shader_versioned_root_signature_desc *dst, const struct vkd3d_shader_versioned_root_signature_desc *src)
 
int vkd3d_shader_convert_root_signature (struct vkd3d_shader_versioned_root_signature_desc *dst, enum vkd3d_shader_root_signature_version version, const struct vkd3d_shader_versioned_root_signature_desc *src)
 

Macro Definition Documentation

◆ DXBC_CHECKSUM_SKIP_BYTE_COUNT

#define DXBC_CHECKSUM_SKIP_BYTE_COUNT   20

Definition at line 23 of file dxbc.c.

◆ VKD3D_ROOT_SIGNATURE_1_0_DESCRIPTOR_RANGE_FLAGS

Definition at line 601 of file dxbc.c.

◆ VKD3D_ROOT_SIGNATURE_1_0_ROOT_DESCRIPTOR_FLAGS

#define VKD3D_ROOT_SIGNATURE_1_0_ROOT_DESCRIPTOR_FLAGS   VKD3D_SHADER_ROOT_DESCRIPTOR_FLAG_DATA_VOLATILE

Definition at line 599 of file dxbc.c.

Function Documentation

◆ compute_dxbc_checksum()

static void compute_dxbc_checksum ( const void *  dxbc,
size_t  size,
uint32_t  checksum[4] 
)
static

Definition at line 25 of file dxbc.c.

26{
27 const uint8_t *ptr = dxbc;
28
32
34}
static cab_ULONG checksum(const cab_UBYTE *data, cab_UWORD bytes, cab_ULONG csum)
Definition: fdi.c:353
unsigned char uint8_t
Definition: stdint.h:33
#define DXBC_CHECKSUM_SKIP_BYTE_COUNT
Definition: dxbc.c:23
GLsizeiptr size
Definition: glext.h:5919
static PVOID ptr
Definition: dispmode.c:27
void vkd3d_compute_md5(const void *data, size_t size, uint32_t checksum[4], enum vkd3d_md5_variant variant)
Definition: checksum.c:305
#define VKD3D_ASSERT(cond)
Definition: vkd3d_common.h:49
@ VKD3D_MD5_DXBC

Referenced by parse_dxbc(), vkd3d_shader_serialize_dxbc(), and vkd3d_shader_serialize_root_signature().

◆ convert_root_parameters_to_v_1_0()

static int convert_root_parameters_to_v_1_0 ( struct vkd3d_shader_root_parameter *  dst,
const struct vkd3d_shader_root_parameter1 *  src,
unsigned int  count 
)
static

Definition at line 1532 of file dxbc.c.

1534{
1535 const struct vkd3d_shader_descriptor_range1 *ranges1;
1536 struct vkd3d_shader_descriptor_range *ranges;
1537 unsigned int i, j;
1538 int ret;
1539
1540 for (i = 0; i < count; ++i)
1541 {
1542 const struct vkd3d_shader_root_parameter1 *p1 = &src[i];
1543 struct vkd3d_shader_root_parameter *p = &dst[i];
1544
1546 switch (p->parameter_type)
1547 {
1549 ranges = NULL;
1550 if ((p->u.descriptor_table.descriptor_range_count = p1->u.descriptor_table.descriptor_range_count))
1551 {
1552 if (!(ranges = vkd3d_calloc(p->u.descriptor_table.descriptor_range_count, sizeof(*ranges))))
1553 {
1555 goto fail;
1556 }
1557 }
1558 p->u.descriptor_table.descriptor_ranges = ranges;
1559 ranges1 = p1->u.descriptor_table.descriptor_ranges;
1560 for (j = 0; j < p->u.descriptor_table.descriptor_range_count; ++j)
1561 {
1562 ranges[j].range_type = ranges1[j].range_type;
1563 ranges[j].descriptor_count = ranges1[j].descriptor_count;
1564 ranges[j].base_shader_register = ranges1[j].base_shader_register;
1565 ranges[j].register_space = ranges1[j].register_space;
1567 }
1568 break;
1570 p->u.constants = p1->u.constants;
1571 break;
1575 p->u.descriptor.shader_register = p1->u.descriptor.shader_register;
1576 p->u.descriptor.register_space = p1->u.descriptor.register_space;
1577 break;
1578 default:
1579 WARN("Invalid root parameter type %#x.\n", p->parameter_type);
1581 goto fail;
1582
1583 }
1584 p->shader_visibility = p1->shader_visibility;
1585 }
1586
1587 return VKD3D_OK;
1588
1589fail:
1591 return ret;
1592}
#define WARN(fmt,...)
Definition: precomp.h:61
#define NULL
Definition: types.h:112
return ret
Definition: mutex.c:147
static void free_descriptor_ranges(const struct vkd3d_shader_root_parameter *parameters, unsigned int count)
Definition: dxbc.c:1516
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340
GLfloat GLfloat p
Definition: glext.h:8902
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
enum vkd3d_shader_descriptor_type range_type
enum vkd3d_shader_descriptor_type range_type
struct vkd3d_shader_root_descriptor_table1 descriptor_table
struct vkd3d_shader_root_descriptor1 descriptor
enum vkd3d_shader_root_parameter_type parameter_type
struct vkd3d_shader_root_constants constants
enum vkd3d_shader_visibility shader_visibility
union vkd3d_shader_root_parameter1::@5988 u
enum vkd3d_shader_root_parameter_type parameter_type
static void * vkd3d_calloc(size_t count, size_t size)
Definition: vkd3d_memory.h:43
@ VKD3D_SHADER_ROOT_PARAMETER_TYPE_SRV
@ VKD3D_SHADER_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE
@ VKD3D_SHADER_ROOT_PARAMETER_TYPE_CBV
@ VKD3D_SHADER_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS
@ VKD3D_SHADER_ROOT_PARAMETER_TYPE_UAV
@ VKD3D_ERROR_INVALID_ARGUMENT
Definition: vkd3d_types.h:51
@ VKD3D_OK
Definition: vkd3d_types.h:43
@ VKD3D_ERROR_OUT_OF_MEMORY
Definition: vkd3d_types.h:49

Referenced by convert_root_signature_to_v1_0().

◆ convert_root_parameters_to_v_1_1()

static int convert_root_parameters_to_v_1_1 ( struct vkd3d_shader_root_parameter1 *  dst,
const struct vkd3d_shader_root_parameter *  src,
unsigned int  count 
)
static

Definition at line 1651 of file dxbc.c.

1653{
1654 const struct vkd3d_shader_descriptor_range *ranges;
1655 struct vkd3d_shader_descriptor_range1 *ranges1;
1656 unsigned int i, j;
1657 int ret;
1658
1659 for (i = 0; i < count; ++i)
1660 {
1661 const struct vkd3d_shader_root_parameter *p = &src[i];
1662 struct vkd3d_shader_root_parameter1 *p1 = &dst[i];
1663
1664 p1->parameter_type = p->parameter_type;
1665 switch (p1->parameter_type)
1666 {
1668 ranges1 = NULL;
1669 if ((p1->u.descriptor_table.descriptor_range_count = p->u.descriptor_table.descriptor_range_count))
1670 {
1671 if (!(ranges1 = vkd3d_calloc(p1->u.descriptor_table.descriptor_range_count, sizeof(*ranges1))))
1672 {
1674 goto fail;
1675 }
1676 }
1677 p1->u.descriptor_table.descriptor_ranges = ranges1;
1678 ranges = p->u.descriptor_table.descriptor_ranges;
1679 for (j = 0; j < p1->u.descriptor_table.descriptor_range_count; ++j)
1680 {
1681 ranges1[j].range_type = ranges[j].range_type;
1682 ranges1[j].descriptor_count = ranges[j].descriptor_count;
1683 ranges1[j].base_shader_register = ranges[j].base_shader_register;
1684 ranges1[j].register_space = ranges[j].register_space;
1687 }
1688 break;
1690 p1->u.constants = p->u.constants;
1691 break;
1695 p1->u.descriptor.shader_register = p->u.descriptor.shader_register;
1696 p1->u.descriptor.register_space = p->u.descriptor.register_space;
1698 break;
1699 default:
1700 WARN("Invalid root parameter type %#x.\n", p1->parameter_type);
1702 goto fail;
1703
1704 }
1705 p1->shader_visibility = p->shader_visibility;
1706 }
1707
1708 return VKD3D_OK;
1709
1710fail:
1712 return ret;
1713}
#define VKD3D_ROOT_SIGNATURE_1_0_ROOT_DESCRIPTOR_FLAGS
Definition: dxbc.c:599
#define VKD3D_ROOT_SIGNATURE_1_0_DESCRIPTOR_RANGE_FLAGS
Definition: dxbc.c:601
static void free_descriptor_ranges1(const struct vkd3d_shader_root_parameter1 *parameters, unsigned int count)
Definition: dxbc.c:1635
enum vkd3d_shader_descriptor_range_flags flags

Referenced by convert_root_signature_to_v1_1().

◆ convert_root_signature_to_v1_0()

static int convert_root_signature_to_v1_0 ( struct vkd3d_shader_versioned_root_signature_desc *  dst,
const struct vkd3d_shader_versioned_root_signature_desc *  src 
)
static

Definition at line 1594 of file dxbc.c.

1596{
1597 const struct vkd3d_shader_root_signature_desc1 *src_desc = &src->u.v_1_1;
1598 struct vkd3d_shader_root_signature_desc *dst_desc = &dst->u.v_1_0;
1601 int ret;
1602
1603 if ((dst_desc->parameter_count = src_desc->parameter_count))
1604 {
1605 if (!(parameters = vkd3d_calloc(dst_desc->parameter_count, sizeof(*parameters))))
1606 {
1608 goto fail;
1609 }
1611 goto fail;
1612 }
1613 dst_desc->parameters = parameters;
1614 if ((dst_desc->static_sampler_count = src_desc->static_sampler_count))
1615 {
1616 if (!(samplers = vkd3d_calloc(dst_desc->static_sampler_count, sizeof(*samplers))))
1617 {
1619 goto fail;
1620 }
1621 memcpy(samplers, src_desc->static_samplers, src_desc->static_sampler_count * sizeof(*samplers));
1622 }
1623 dst_desc->static_samplers = samplers;
1624 dst_desc->flags = src_desc->flags;
1625
1626 return VKD3D_OK;
1627
1628fail:
1632 return ret;
1633}
static int convert_root_parameters_to_v_1_0(struct vkd3d_shader_root_parameter *dst, const struct vkd3d_shader_root_parameter1 *src, unsigned int count)
Definition: dxbc.c:1532
GLuint * samplers
Definition: glext.h:7280
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static BYTE parameters[]
Definition: asn.c:558
enum vkd3d_shader_root_signature_flags flags
const struct vkd3d_shader_static_sampler_desc * static_samplers
const struct vkd3d_shader_root_parameter1 * parameters
const struct vkd3d_shader_root_parameter * parameters
const struct vkd3d_shader_static_sampler_desc * static_samplers
enum vkd3d_shader_root_signature_flags flags
static void vkd3d_free(void *ptr)
Definition: vkd3d_memory.h:52

Referenced by vkd3d_shader_convert_root_signature().

◆ convert_root_signature_to_v1_1()

static int convert_root_signature_to_v1_1 ( struct vkd3d_shader_versioned_root_signature_desc *  dst,
const struct vkd3d_shader_versioned_root_signature_desc *  src 
)
static

Definition at line 1715 of file dxbc.c.

1717{
1718 const struct vkd3d_shader_root_signature_desc *src_desc = &src->u.v_1_0;
1719 struct vkd3d_shader_root_signature_desc1 *dst_desc = &dst->u.v_1_1;
1722 int ret;
1723
1724 if ((dst_desc->parameter_count = src_desc->parameter_count))
1725 {
1726 if (!(parameters = vkd3d_calloc(dst_desc->parameter_count, sizeof(*parameters))))
1727 {
1729 goto fail;
1730 }
1732 goto fail;
1733 }
1734 dst_desc->parameters = parameters;
1735 if ((dst_desc->static_sampler_count = src_desc->static_sampler_count))
1736 {
1737 if (!(samplers = vkd3d_calloc(dst_desc->static_sampler_count, sizeof(*samplers))))
1738 {
1740 goto fail;
1741 }
1742 memcpy(samplers, src_desc->static_samplers, src_desc->static_sampler_count * sizeof(*samplers));
1743 }
1744 dst_desc->static_samplers = samplers;
1745 dst_desc->flags = src_desc->flags;
1746
1747 return VKD3D_OK;
1748
1749fail:
1753 return ret;
1754}
static int convert_root_parameters_to_v_1_1(struct vkd3d_shader_root_parameter1 *dst, const struct vkd3d_shader_root_parameter *src, unsigned int count)
Definition: dxbc.c:1651

Referenced by vkd3d_shader_convert_root_signature().

◆ dxbc_writer_add_section()

void dxbc_writer_add_section ( struct dxbc_writer *  dxbc,
uint32_t  tag,
const void *  data,
size_t  size 
)

Definition at line 41 of file dxbc.c.

42{
44
46
47 section = &dxbc->sections[dxbc->section_count++];
48 section->tag = tag;
49 section->data.code = data;
50 section->data.size = size;
51}
#define ARRAY_SIZE(A)
Definition: main.h:20
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
struct vkd3d_shader_dxbc_section_desc sections[DXBC_MAX_SECTION_COUNT]
unsigned int section_count
Definition: parser.c:56

Referenced by add_section(), and tpf_write_sfi0().

◆ dxbc_writer_init()

void dxbc_writer_init ( struct dxbc_writer *  dxbc)

Definition at line 36 of file dxbc.c.

37{
38 memset(dxbc, 0, sizeof(*dxbc));
39}
#define memset(x, y, z)
Definition: compat.h:39

Referenced by tpf_compile().

◆ dxbc_writer_write()

int dxbc_writer_write ( struct dxbc_writer *  dxbc,
struct vkd3d_shader_code *  out 
)

Definition at line 100 of file dxbc.c.

101{
103}
int vkd3d_shader_serialize_dxbc(size_t section_count, const struct vkd3d_shader_dxbc_section_desc *sections, struct vkd3d_shader_code *dxbc, char **messages)
Definition: dxbc.c:53
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

Referenced by tpf_compile().

◆ for_each_dxbc_section()

static int for_each_dxbc_section ( const struct vkd3d_shader_code *  dxbc,
struct vkd3d_shader_message_context *  message_context,
const char *  source_name,
int(*)(const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, void *ctx)  section_handler,
void *  ctx 
)
static

Definition at line 297 of file dxbc.c.

301{
303 unsigned int i;
304 int ret;
305
306 if ((ret = parse_dxbc(dxbc, message_context, source_name, 0, &desc)) < 0)
307 return ret;
308
309 for (i = 0; i < desc.section_count; ++i)
310 {
311 if ((ret = section_handler(&desc.sections[i], message_context, ctx)) < 0)
312 break;
313 }
314
316
317 return ret;
318}
static int parse_dxbc(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_message_context *message_context, const char *source_name, uint32_t flags, struct vkd3d_shader_dxbc_desc *desc)
Definition: dxbc.c:165
void vkd3d_shader_free_dxbc(struct vkd3d_shader_dxbc_desc *dxbc)
Definition: dxbc.c:290
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683

Referenced by shader_extract_from_dxbc(), shader_parse_input_signature(), and vkd3d_shader_parse_root_signature().

◆ free_descriptor_ranges()

static void free_descriptor_ranges ( const struct vkd3d_shader_root_parameter *  parameters,
unsigned int  count 
)
static

Definition at line 1516 of file dxbc.c.

1517{
1518 unsigned int i;
1519
1520 if (!parameters)
1521 return;
1522
1523 for (i = 0; i < count; ++i)
1524 {
1525 const struct vkd3d_shader_root_parameter *p = &parameters[i];
1526
1528 vkd3d_free((void *)p->u.descriptor_table.descriptor_ranges);
1529 }
1530}

Referenced by convert_root_parameters_to_v_1_0(), and convert_root_signature_to_v1_0().

◆ free_descriptor_ranges1()

static void free_descriptor_ranges1 ( const struct vkd3d_shader_root_parameter1 *  parameters,
unsigned int  count 
)
static

Definition at line 1635 of file dxbc.c.

1636{
1637 unsigned int i;
1638
1639 if (!parameters)
1640 return;
1641
1642 for (i = 0; i < count; ++i)
1643 {
1644 const struct vkd3d_shader_root_parameter1 *p = &parameters[i];
1645
1647 vkd3d_free((void *)p->u.descriptor_table.descriptor_ranges);
1648 }
1649}

Referenced by convert_root_parameters_to_v_1_1(), and convert_root_signature_to_v1_1().

◆ free_dxbc_shader_desc()

void free_dxbc_shader_desc ( struct dxbc_shader_desc *  desc)

Definition at line 573 of file dxbc.c.

574{
575 shader_signature_cleanup(&desc->input_signature);
576 shader_signature_cleanup(&desc->output_signature);
577 shader_signature_cleanup(&desc->patch_constant_signature);
578}
void shader_signature_cleanup(struct shader_signature *signature)

Referenced by dxil_parse(), shader_extract_from_dxbc(), and tpf_parse().

◆ get_chunk_offset()

static size_t get_chunk_offset ( struct root_signature_writer_context *  context)
static

Definition at line 1140 of file dxbc.c.

1141{
1142 return bytecode_get_size(&context->buffer) - context->chunk_position;
1143}
Definition: http.c:7252
static size_t bytecode_get_size(struct vkd3d_bytecode_buffer *buffer)

Referenced by shader_write_descriptor_table(), shader_write_descriptor_table1(), shader_write_root_parameters(), shader_write_root_signature(), and vkd3d_shader_serialize_root_signature().

◆ isgn_handler()

static int isgn_handler ( const struct vkd3d_shader_dxbc_section_desc *  section,
struct vkd3d_shader_message_context *  message_context,
void *  ctx 
)
static

Definition at line 477 of file dxbc.c.

479{
480 struct shader_signature *is = ctx;
481
482 if (section->tag != TAG_ISGN && section->tag != TAG_ISG1)
483 return VKD3D_OK;
484
485 if (is->elements)
486 {
487 FIXME("Multiple input signatures.\n");
489 }
490 return shader_parse_signature(section, message_context, is);
491}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define TAG_ISGN
static int shader_parse_signature(const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, struct shader_signature *s)
Definition: dxbc.c:368
#define TAG_ISG1
Definition: shader_sm4.c:1841
struct signature_element * elements

Referenced by shader_parse_input_signature().

◆ map_fragment_output_sysval()

static enum vkd3d_shader_sysval_semantic map_fragment_output_sysval ( const char *  name)
static

Definition at line 350 of file dxbc.c.

351{
352 if (!ascii_strcasecmp(name, "sv_target"))
354 if (!ascii_strcasecmp(name, "sv_depth"))
356 if (!ascii_strcasecmp(name, "sv_coverage"))
358 if (!ascii_strcasecmp(name, "sv_depthgreaterequal"))
360 if (!ascii_strcasecmp(name, "sv_depthlessequal"))
362 if (!ascii_strcasecmp(name, "sv_stencilref"))
364
366}
Definition: name.c:39
static int ascii_strcasecmp(const char *a, const char *b)
Definition: vkd3d_common.h:437
@ VKD3D_SHADER_SV_DEPTH_LESS_EQUAL
@ VKD3D_SHADER_SV_COVERAGE
@ VKD3D_SHADER_SV_DEPTH
@ VKD3D_SHADER_SV_TARGET
@ VKD3D_SHADER_SV_NONE
@ VKD3D_SHADER_SV_DEPTH_GREATER_EQUAL
@ VKD3D_SHADER_SV_STENCIL_REF

Referenced by shader_parse_signature().

◆ parse_dxbc()

static int parse_dxbc ( const struct vkd3d_shader_code *  dxbc,
struct vkd3d_shader_message_context *  message_context,
const char *  source_name,
uint32_t  flags,
struct vkd3d_shader_dxbc_desc *  desc 
)
static

Definition at line 165 of file dxbc.c.

167{
168 const struct vkd3d_shader_location location = {.source_name = source_name};
170 uint32_t checksum[4], calculated_checksum[4];
171 const char *data = dxbc->code;
172 size_t data_size = dxbc->size;
173 const char *ptr = data;
174 uint32_t chunk_count;
175 uint32_t total_size;
177 unsigned int i;
179
180 if (data_size < VKD3D_DXBC_HEADER_SIZE)
181 {
182 WARN("Invalid data size %zu.\n", data_size);
184 "DXBC size %zu is smaller than the DXBC header size.", data_size);
186 }
187
188 tag = read_u32(&ptr);
189 TRACE("tag: %#x.\n", tag);
190
191 if (tag != TAG_DXBC)
192 {
193 WARN("Wrong tag.\n");
194 vkd3d_shader_error(message_context, &location, VKD3D_SHADER_ERROR_DXBC_INVALID_MAGIC, "Invalid DXBC magic.");
196 }
197
198 checksum[0] = read_u32(&ptr);
199 checksum[1] = read_u32(&ptr);
200 checksum[2] = read_u32(&ptr);
201 checksum[3] = read_u32(&ptr);
203 {
204 compute_dxbc_checksum(data, data_size, calculated_checksum);
205 if (memcmp(checksum, calculated_checksum, sizeof(checksum)))
206 {
207 WARN("Checksum {0x%08x, 0x%08x, 0x%08x, 0x%08x} does not match "
208 "calculated checksum {0x%08x, 0x%08x, 0x%08x, 0x%08x}.\n",
209 checksum[0], checksum[1], checksum[2], checksum[3],
210 calculated_checksum[0], calculated_checksum[1],
211 calculated_checksum[2], calculated_checksum[3]);
213 "Invalid DXBC checksum.");
215 }
216 }
217
218 version = read_u32(&ptr);
219 TRACE("version: %#x.\n", version);
220 if (version != 0x00000001)
221 {
222 WARN("Got unexpected DXBC version %#x.\n", version);
224 "DXBC version %#x is not supported.", version);
226 }
227
228 total_size = read_u32(&ptr);
229 TRACE("total size: %#x\n", total_size);
230
231 chunk_count = read_u32(&ptr);
232 TRACE("chunk count: %#x\n", chunk_count);
233
234 if (!(sections = vkd3d_calloc(chunk_count, sizeof(*sections))))
235 {
236 vkd3d_shader_error(message_context, &location, VKD3D_SHADER_ERROR_DXBC_OUT_OF_MEMORY, "Out of memory.");
238 }
239
240 for (i = 0; i < chunk_count; ++i)
241 {
242 uint32_t chunk_tag, chunk_size;
243 const char *chunk_ptr;
244 uint32_t chunk_offset;
245
246 chunk_offset = read_u32(&ptr);
247 TRACE("chunk %u at offset %#x\n", i, chunk_offset);
248
249 if (chunk_offset >= data_size || !require_space(chunk_offset, 2, sizeof(uint32_t), data_size))
250 {
251 WARN("Invalid chunk offset %#x (data size %zu).\n", chunk_offset, data_size);
253 "DXBC chunk %u has invalid offset %#x (data size %#zx).", i, chunk_offset, data_size);
256 }
257
258 chunk_ptr = data + chunk_offset;
259
260 chunk_tag = read_u32(&chunk_ptr);
261 chunk_size = read_u32(&chunk_ptr);
262
263 if (!require_space(chunk_ptr - data, 1, chunk_size, data_size))
264 {
265 WARN("Invalid chunk size %#x (data size %zu, chunk offset %#x).\n",
266 chunk_size, data_size, chunk_offset);
268 "DXBC chunk %u has invalid size %#x (data size %#zx, chunk offset %#x).",
269 i, chunk_offset, data_size, chunk_offset);
272 }
273
274 section = &sections[i];
275 section->tag = chunk_tag;
276 section->data.code = chunk_ptr;
277 section->data.size = chunk_size;
278 }
279
280 desc->tag = tag;
281 memcpy(desc->checksum, checksum, sizeof(checksum));
282 desc->version = version;
283 desc->size = total_size;
284 desc->section_count = chunk_count;
285 desc->sections = sections;
286
287 return VKD3D_OK;
288}
#define TAG_DXBC
UINT32 uint32_t
Definition: types.h:75
static const WCHAR version[]
Definition: asmname.c:66
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
static bool require_space(size_t offset, size_t count, size_t size, size_t data_size)
Definition: dxbc.c:105
static uint32_t read_u32(const char **ptr)
Definition: dxbc.c:110
static void compute_dxbc_checksum(const void *dxbc, size_t size, uint32_t checksum[4])
Definition: dxbc.c:25
GLbitfield flags
Definition: glext.h:7161
struct section sections[2]
Definition: diskspace.c:792
#define TRACE(s)
Definition: solgame.cpp:4
Definition: ecma_167.h:138
const void * code
Definition: vkd3d_shader.h:413
@ VKD3D_SHADER_PARSE_DXBC_IGNORE_CHECKSUM
Definition: vkd3d_shader.h:259
vkd3d_shader_error
@ VKD3D_SHADER_ERROR_DXBC_INVALID_CHUNK_OFFSET
@ VKD3D_SHADER_ERROR_DXBC_OUT_OF_MEMORY
@ VKD3D_SHADER_ERROR_DXBC_INVALID_SIZE
@ VKD3D_SHADER_ERROR_DXBC_INVALID_MAGIC
@ VKD3D_SHADER_ERROR_DXBC_INVALID_CHUNK_SIZE
@ VKD3D_SHADER_ERROR_DXBC_INVALID_CHECKSUM
@ VKD3D_SHADER_ERROR_DXBC_INVALID_VERSION
#define VKD3D_DXBC_HEADER_SIZE

Referenced by for_each_dxbc_section(), and vkd3d_shader_parse_dxbc().

◆ read_float()

static float read_float ( const char **  ptr)
static

Definition at line 118 of file dxbc.c.

119{
120 union
121 {
122 uint32_t i;
123 float f;
124 } u;
125 STATIC_ASSERT(sizeof(float) == sizeof(uint32_t));
126 u.i = read_u32(ptr);
127 return u.f;
128}
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
#define f
Definition: ke_i.h:83
#define STATIC_ASSERT(e)
Definition: vkd3d_common.h:47

Referenced by shader_parse_static_samplers().

◆ read_u32()

◆ require_space()

◆ rts0_handler()

static int rts0_handler ( const struct vkd3d_shader_dxbc_section_desc *  section,
struct vkd3d_shader_message_context *  message_context,
void *  context 
)
static

Definition at line 1032 of file dxbc.c.

1034{
1036
1037 if (section->tag != TAG_RTS0)
1038 return VKD3D_OK;
1039
1041}
static int shader_parse_root_signature(const struct vkd3d_shader_code *data, struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:949
#define TAG_RTS0
Definition: vkd3d_common.h:80

Referenced by vkd3d_shader_parse_root_signature().

◆ shader_extract_from_dxbc()

int shader_extract_from_dxbc ( const struct vkd3d_shader_code *  dxbc,
struct vkd3d_shader_message_context *  message_context,
const char *  source_name,
struct dxbc_shader_desc *  desc 
)

Definition at line 580 of file dxbc.c.

582{
583 int ret;
584
585 ret = for_each_dxbc_section(dxbc, message_context, source_name, shdr_handler, desc);
586 if (!desc->byte_code)
588
589 if (ret < 0)
590 {
591 WARN("Failed to parse shader, vkd3d result %d.\n", ret);
593 }
594
595 return ret;
596}
static int shdr_handler(const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, void *context)
Definition: dxbc.c:505
static int for_each_dxbc_section(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_message_context *message_context, const char *source_name, int(*section_handler)(const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, void *ctx), void *ctx)
Definition: dxbc.c:297
void free_dxbc_shader_desc(struct dxbc_shader_desc *desc)
Definition: dxbc.c:573

Referenced by dxil_parse(), and tpf_parse().

◆ shader_get_string()

static const char * shader_get_string ( const char *  data,
size_t  data_size,
size_t  offset 
)
static

Definition at line 146 of file dxbc.c.

147{
148 size_t len, max_len;
149
150 if (offset >= data_size)
151 {
152 WARN("Invalid offset %#zx (data size %#zx).\n", offset, data_size);
153 return NULL;
154 }
155
156 max_len = data_size - offset;
157 len = strnlen(data + offset, max_len);
158
159 if (len == max_len)
160 return NULL;
161
162 return data + offset;
163}
_ACRTIMP size_t __cdecl strnlen(const char *, size_t)
Definition: string.c:1607
GLenum GLsizei len
Definition: glext.h:6722

Referenced by shader_parse_signature().

◆ shader_parse_descriptor_ranges()

static int shader_parse_descriptor_ranges ( struct root_signature_parser_context *  context,
unsigned int  offset,
unsigned int  count,
struct vkd3d_shader_descriptor_range *  ranges 
)
static

Definition at line 610 of file dxbc.c.

612{
613 const char *ptr;
614 unsigned int i;
615
616 if (!require_space(offset, 5 * count, sizeof(uint32_t), context->data_size))
617 {
618 WARN("Invalid data size %#x (offset %u, count %u).\n", context->data_size, offset, count);
620 }
621 ptr = &context->data[offset];
622
623 for (i = 0; i < count; ++i)
624 {
625 ranges[i].range_type = read_u32(&ptr);
626 ranges[i].descriptor_count = read_u32(&ptr);
628 ranges[i].register_space = read_u32(&ptr);
630
631 TRACE("Type %#x, descriptor count %u, base shader register %u, "
632 "register space %u, offset %u.\n",
633 ranges[i].range_type, ranges[i].descriptor_count,
634 ranges[i].base_shader_register, ranges[i].register_space,
635 ranges[i].descriptor_table_offset);
636 }
637
638 return VKD3D_OK;
639}

Referenced by shader_parse_descriptor_table().

◆ shader_parse_descriptor_ranges1()

static int shader_parse_descriptor_ranges1 ( struct root_signature_parser_context *  context,
unsigned int  offset,
unsigned int  count,
struct vkd3d_shader_descriptor_range1 *  ranges 
)
static

Definition at line 654 of file dxbc.c.

656{
657 const char *ptr;
658 unsigned int i;
659
660 if (!require_space(offset, 6 * count, sizeof(uint32_t), context->data_size))
661 {
662 WARN("Invalid data size %#x (offset %u, count %u).\n", context->data_size, offset, count);
664 }
665 ptr = &context->data[offset];
666
667 for (i = 0; i < count; ++i)
668 {
669 ranges[i].range_type = read_u32(&ptr);
670 ranges[i].descriptor_count = read_u32(&ptr);
672 ranges[i].register_space = read_u32(&ptr);
673 ranges[i].flags = read_u32(&ptr);
675
676 TRACE("Type %#x, descriptor count %u, base shader register %u, "
677 "register space %u, flags %#x, offset %u.\n",
678 ranges[i].range_type, ranges[i].descriptor_count,
679 ranges[i].base_shader_register, ranges[i].register_space,
680 ranges[i].flags, ranges[i].descriptor_table_offset);
681
683 }
684
685 return VKD3D_OK;
686}
static void shader_validate_descriptor_range1(const struct vkd3d_shader_descriptor_range1 *range)
Definition: dxbc.c:641

Referenced by shader_parse_descriptor_table1().

◆ shader_parse_descriptor_table()

static int shader_parse_descriptor_table ( struct root_signature_parser_context *  context,
unsigned int  offset,
struct vkd3d_shader_root_descriptor_table *  table 
)
static

Definition at line 688 of file dxbc.c.

690{
691 struct vkd3d_shader_descriptor_range *ranges;
692 unsigned int count;
693 const char *ptr;
694
695 if (!require_space(offset, 2, sizeof(uint32_t), context->data_size))
696 {
697 WARN("Invalid data size %#x (offset %u).\n", context->data_size, offset);
699 }
700 ptr = &context->data[offset];
701
702 count = read_u32(&ptr);
703 offset = read_u32(&ptr);
704
705 TRACE("Descriptor range count %u.\n", count);
706
707 table->descriptor_range_count = count;
708
709 if (!(ranges = vkd3d_calloc(count, sizeof(*ranges))))
711 table->descriptor_ranges = ranges;
713}
static int shader_parse_descriptor_ranges(struct root_signature_parser_context *context, unsigned int offset, unsigned int count, struct vkd3d_shader_descriptor_range *ranges)
Definition: dxbc.c:610

Referenced by shader_parse_root_parameters().

◆ shader_parse_descriptor_table1()

static int shader_parse_descriptor_table1 ( struct root_signature_parser_context *  context,
unsigned int  offset,
struct vkd3d_shader_root_descriptor_table1 *  table 
)
static

Definition at line 715 of file dxbc.c.

717{
718 struct vkd3d_shader_descriptor_range1 *ranges;
719 unsigned int count;
720 const char *ptr;
721
722 if (!require_space(offset, 2, sizeof(uint32_t), context->data_size))
723 {
724 WARN("Invalid data size %#x (offset %u).\n", context->data_size, offset);
726 }
727 ptr = &context->data[offset];
728
729 count = read_u32(&ptr);
730 offset = read_u32(&ptr);
731
732 TRACE("Descriptor range count %u.\n", count);
733
734 table->descriptor_range_count = count;
735
736 if (!(ranges = vkd3d_calloc(count, sizeof(*ranges))))
738 table->descriptor_ranges = ranges;
740}
static int shader_parse_descriptor_ranges1(struct root_signature_parser_context *context, unsigned int offset, unsigned int count, struct vkd3d_shader_descriptor_range1 *ranges)
Definition: dxbc.c:654

Referenced by shader_parse_root_parameters1().

◆ shader_parse_input_signature()

int shader_parse_input_signature ( const struct vkd3d_shader_code *  dxbc,
struct vkd3d_shader_message_context *  message_context,
struct shader_signature *  signature 
)

Definition at line 493 of file dxbc.c.

495{
496 int ret;
497
498 memset(signature, 0, sizeof(*signature));
499 if ((ret = for_each_dxbc_section(dxbc, message_context, NULL, isgn_handler, signature)) < 0)
500 ERR("Failed to parse input signature.\n");
501
502 return ret;
503}
#define ERR(fmt,...)
Definition: precomp.h:57
static int isgn_handler(const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, void *ctx)
Definition: dxbc.c:477

Referenced by vkd3d_shader_parse_input_signature().

◆ shader_parse_root_constants()

static int shader_parse_root_constants ( struct root_signature_parser_context *  context,
unsigned int  offset,
struct vkd3d_shader_root_constants *  constants 
)
static

Definition at line 742 of file dxbc.c.

744{
745 const char *ptr;
746
747 if (!require_space(offset, 3, sizeof(uint32_t), context->data_size))
748 {
749 WARN("Invalid data size %#x (offset %u).\n", context->data_size, offset);
751 }
752 ptr = &context->data[offset];
753
754 constants->shader_register = read_u32(&ptr);
755 constants->register_space = read_u32(&ptr);
756 constants->value_count = read_u32(&ptr);
757
758 TRACE("Shader register %u, register space %u, 32-bit value count %u.\n",
759 constants->shader_register, constants->register_space, constants->value_count);
760
761 return VKD3D_OK;
762}
constants
Definition: resource.c:30

Referenced by shader_parse_root_parameters(), and shader_parse_root_parameters1().

◆ shader_parse_root_descriptor()

static int shader_parse_root_descriptor ( struct root_signature_parser_context *  context,
unsigned int  offset,
struct vkd3d_shader_root_descriptor *  descriptor 
)
static

Definition at line 764 of file dxbc.c.

766{
767 const char *ptr;
768
769 if (!require_space(offset, 2, sizeof(uint32_t), context->data_size))
770 {
771 WARN("Invalid data size %#x (offset %u).\n", context->data_size, offset);
773 }
774 ptr = &context->data[offset];
775
776 descriptor->shader_register = read_u32(&ptr);
777 descriptor->register_space = read_u32(&ptr);
778
779 TRACE("Shader register %u, register space %u.\n",
780 descriptor->shader_register, descriptor->register_space);
781
782 return VKD3D_OK;
783}
descriptor
Definition: scsi.h:3997

Referenced by shader_parse_root_parameters().

◆ shader_parse_root_descriptor1()

static int shader_parse_root_descriptor1 ( struct root_signature_parser_context *  context,
unsigned int  offset,
struct vkd3d_shader_root_descriptor1 *  descriptor 
)
static

Definition at line 796 of file dxbc.c.

798{
799 const char *ptr;
800
801 if (!require_space(offset, 3, sizeof(uint32_t), context->data_size))
802 {
803 WARN("Invalid data size %#x (offset %u).\n", context->data_size, offset);
805 }
806 ptr = &context->data[offset];
807
808 descriptor->shader_register = read_u32(&ptr);
809 descriptor->register_space = read_u32(&ptr);
810 descriptor->flags = read_u32(&ptr);
811
812 TRACE("Shader register %u, register space %u, flags %#x.\n",
813 descriptor->shader_register, descriptor->register_space, descriptor->flags);
814
816
817 return VKD3D_OK;
818}
static void shader_validate_root_descriptor1(const struct vkd3d_shader_root_descriptor1 *descriptor)
Definition: dxbc.c:785

Referenced by shader_parse_root_parameters1().

◆ shader_parse_root_parameters()

static int shader_parse_root_parameters ( struct root_signature_parser_context *  context,
unsigned int  offset,
unsigned int  count,
struct vkd3d_shader_root_parameter *  parameters 
)
static

Definition at line 820 of file dxbc.c.

822{
823 const char *ptr;
824 unsigned int i;
825 int ret;
826
827 if (!require_space(offset, 3 * count, sizeof(uint32_t), context->data_size))
828 {
829 WARN("Invalid data size %#x (offset %u, count %u).\n", context->data_size, offset, count);
831 }
832 ptr = &context->data[offset];
833
834 for (i = 0; i < count; ++i)
835 {
836 parameters[i].parameter_type = read_u32(&ptr);
837 parameters[i].shader_visibility = read_u32(&ptr);
838 offset = read_u32(&ptr);
839
840 TRACE("Type %#x, shader visibility %#x.\n",
841 parameters[i].parameter_type, parameters[i].shader_visibility);
842
843 switch (parameters[i].parameter_type)
844 {
847 break;
850 break;
855 break;
856 default:
857 FIXME("Unrecognized type %#x.\n", parameters[i].parameter_type);
859 }
860
861 if (ret < 0)
862 return ret;
863 }
864
865 return VKD3D_OK;
866}
static int shader_parse_root_descriptor(struct root_signature_parser_context *context, unsigned int offset, struct vkd3d_shader_root_descriptor *descriptor)
Definition: dxbc.c:764
static int shader_parse_descriptor_table(struct root_signature_parser_context *context, unsigned int offset, struct vkd3d_shader_root_descriptor_table *table)
Definition: dxbc.c:688
static int shader_parse_root_constants(struct root_signature_parser_context *context, unsigned int offset, struct vkd3d_shader_root_constants *constants)
Definition: dxbc.c:742

Referenced by shader_parse_root_signature().

◆ shader_parse_root_parameters1()

static int shader_parse_root_parameters1 ( struct root_signature_parser_context *  context,
uint32_t  offset,
unsigned int  count,
struct vkd3d_shader_root_parameter1 *  parameters 
)
static

Definition at line 868 of file dxbc.c.

870{
871 const char *ptr;
872 unsigned int i;
873 int ret;
874
875 if (!require_space(offset, 3 * count, sizeof(uint32_t), context->data_size))
876 {
877 WARN("Invalid data size %#x (offset %u, count %u).\n", context->data_size, offset, count);
879 }
880 ptr = &context->data[offset];
881
882 for (i = 0; i < count; ++i)
883 {
884 parameters[i].parameter_type = read_u32(&ptr);
885 parameters[i].shader_visibility = read_u32(&ptr);
886 offset = read_u32(&ptr);
887
888 TRACE("Type %#x, shader visibility %#x.\n",
889 parameters[i].parameter_type, parameters[i].shader_visibility);
890
891 switch (parameters[i].parameter_type)
892 {
895 break;
898 break;
903 break;
904 default:
905 FIXME("Unrecognized type %#x.\n", parameters[i].parameter_type);
907 }
908
909 if (ret < 0)
910 return ret;
911 }
912
913 return VKD3D_OK;
914}
static int shader_parse_root_descriptor1(struct root_signature_parser_context *context, unsigned int offset, struct vkd3d_shader_root_descriptor1 *descriptor)
Definition: dxbc.c:796
static int shader_parse_descriptor_table1(struct root_signature_parser_context *context, unsigned int offset, struct vkd3d_shader_root_descriptor_table1 *table)
Definition: dxbc.c:715

Referenced by shader_parse_root_signature().

◆ shader_parse_root_signature()

static int shader_parse_root_signature ( const struct vkd3d_shader_code *  data,
struct vkd3d_shader_versioned_root_signature_desc *  desc 
)
static

Definition at line 949 of file dxbc.c.

951{
952 struct vkd3d_shader_root_signature_desc *v_1_0 = &desc->u.v_1_0;
954 unsigned int count, offset, version;
955 const char *ptr = data->code;
956 int ret;
957
958 context.data = data->code;
959 context.data_size = data->size;
960
961 if (!require_space(0, 6, sizeof(uint32_t), data->size))
962 {
963 WARN("Invalid data size %#zx.\n", data->size);
965 }
966
967 version = read_u32(&ptr);
968 TRACE("Version %#x.\n", version);
970 {
971 FIXME("Unknown version %#x.\n", version);
973 }
974 desc->version = version;
975
976 count = read_u32(&ptr);
977 offset = read_u32(&ptr);
978 TRACE("Parameter count %u, offset %u.\n", count, offset);
979
981 {
982 v_1_0->parameter_count = count;
983 if (v_1_0->parameter_count)
984 {
986 if (!(parameters = vkd3d_calloc(v_1_0->parameter_count, sizeof(*parameters))))
988 v_1_0->parameters = parameters;
990 return ret;
991 }
992 }
993 else
994 {
995 struct vkd3d_shader_root_signature_desc1 *v_1_1 = &desc->u.v_1_1;
996
998
999 v_1_1->parameter_count = count;
1000 if (v_1_1->parameter_count)
1001 {
1003 if (!(parameters = vkd3d_calloc(v_1_1->parameter_count, sizeof(*parameters))))
1005 v_1_1->parameters = parameters;
1007 return ret;
1008 }
1009 }
1010
1011 count = read_u32(&ptr);
1012 offset = read_u32(&ptr);
1013 TRACE("Static sampler count %u, offset %u.\n", count, offset);
1014
1015 v_1_0->static_sampler_count = count;
1016 if (v_1_0->static_sampler_count)
1017 {
1019 if (!(samplers = vkd3d_calloc(v_1_0->static_sampler_count, sizeof(*samplers))))
1021 v_1_0->static_samplers = samplers;
1023 return ret;
1024 }
1025
1026 v_1_0->flags = read_u32(&ptr);
1027 TRACE("Flags %#x.\n", v_1_0->flags);
1028
1029 return VKD3D_OK;
1030}
static int shader_parse_root_parameters(struct root_signature_parser_context *context, unsigned int offset, unsigned int count, struct vkd3d_shader_root_parameter *parameters)
Definition: dxbc.c:820
static int shader_parse_static_samplers(struct root_signature_parser_context *context, unsigned int offset, unsigned int count, struct vkd3d_shader_static_sampler_desc *sampler_descs)
Definition: dxbc.c:916
static int shader_parse_root_parameters1(struct root_signature_parser_context *context, uint32_t offset, unsigned int count, struct vkd3d_shader_root_parameter1 *parameters)
Definition: dxbc.c:868
@ VKD3D_SHADER_ROOT_SIGNATURE_VERSION_1_1
@ VKD3D_SHADER_ROOT_SIGNATURE_VERSION_1_0

Referenced by rts0_handler().

◆ shader_parse_signature()

static int shader_parse_signature ( const struct vkd3d_shader_dxbc_section_desc *  section,
struct vkd3d_shader_message_context *  message_context,
struct shader_signature *  s 
)
static

Definition at line 368 of file dxbc.c.

370{
371 bool has_stream_index, has_min_precision;
372 const char *data = section->data.code;
373 uint32_t count, header_size;
374 struct signature_element *e;
375 const char *ptr = data;
376 unsigned int i, j;
377
378 if (!require_space(0, 2, sizeof(uint32_t), section->data.size))
379 {
380 WARN("Invalid data size %#zx.\n", section->data.size);
382 "Section size %zu is smaller than the minimum signature header size.\n", section->data.size);
384 }
385
386 count = read_u32(&ptr);
387 TRACE("%u elements.\n", count);
388
389 header_size = read_u32(&ptr);
390 i = header_size / sizeof(uint32_t);
391 if (align(header_size, sizeof(uint32_t)) != header_size || i < 2
392 || !require_space(2, i - 2, sizeof(uint32_t), section->data.size))
393 {
394 WARN("Invalid header size %#x.\n", header_size);
396 "Signature header size %#x is invalid.\n", header_size);
398 }
399 skip_dword_unknown(&ptr, i - 2);
400
401 if (!require_space(ptr - data, count, 6 * sizeof(uint32_t), section->data.size))
402 {
403 WARN("Invalid count %#x (data size %#zx).\n", count, section->data.size);
405 }
406
407 if (!(e = vkd3d_calloc(count, sizeof(*e))))
408 {
409 ERR("Failed to allocate input signature memory.\n");
411 }
412
413 has_min_precision = section->tag == TAG_OSG1 || section->tag == TAG_PSG1 || section->tag == TAG_ISG1;
414 has_stream_index = section->tag == TAG_OSG5 || has_min_precision;
415
416 for (i = 0; i < count; ++i)
417 {
418 size_t name_offset;
419 const char *name;
421
422 if (has_stream_index)
423 e[i].stream_index = read_u32(&ptr);
424 else
425 e[i].stream_index = 0;
426
427 name_offset = read_u32(&ptr);
428 if (!(name = shader_get_string(data, section->data.size, name_offset))
429 || !(e[i].semantic_name = vkd3d_strdup(name)))
430 {
431 WARN("Invalid name offset %#zx (data size %#zx).\n", name_offset, section->data.size);
432 for (j = 0; j < i; ++j)
433 {
434 vkd3d_free((void *)e[j].semantic_name);
435 }
436 vkd3d_free(e);
438 }
439 e[i].semantic_index = read_u32(&ptr);
440 e[i].sysval_semantic = read_u32(&ptr);
441 e[i].component_type = read_u32(&ptr);
442 e[i].register_index = read_u32(&ptr);
443 e[i].target_location = e[i].register_index;
444 e[i].register_count = 1;
445 mask = read_u32(&ptr);
446 e[i].mask = mask & 0xff;
447 e[i].used_mask = (mask >> 8) & 0xff;
448 switch (section->tag)
449 {
450 case TAG_OSGN:
451 case TAG_OSG1:
452 case TAG_OSG5:
454 e[i].sysval_semantic = map_fragment_output_sysval(e[i].semantic_name);
455 break;
456 }
457
458 if (has_min_precision)
459 e[i].min_precision = read_u32(&ptr);
460 else
461 e[i].min_precision = VKD3D_SHADER_MINIMUM_PRECISION_NONE;
462
463 e[i].interpolation_mode = VKD3DSIM_NONE;
464
465 TRACE("Stream: %u, semantic: %s, semantic idx: %u, sysval_semantic %#x, "
466 "type %u, register idx: %u, use_mask %#x, input_mask %#x, precision %u.\n",
469 }
470
471 s->elements = e;
472 s->element_count = count;
473
474 return VKD3D_OK;
475}
#define TAG_OSGN
#define TAG_OSG5
component_type
static const char * shader_get_string(const char *data, size_t data_size, size_t offset)
Definition: dxbc.c:146
static enum vkd3d_shader_sysval_semantic map_fragment_output_sysval(const char *name)
Definition: dxbc.c:350
static void skip_dword_unknown(const char **ptr, unsigned int count)
Definition: dxbc.c:130
GLdouble s
Definition: gl.h:2039
GLenum GLint GLuint mask
Definition: glext.h:6028
#define e
Definition: ke_i.h:82
#define debugstr_a
Definition: kernel32.h:31
#define uint32_t
Definition: nsiface.idl:61
#define TAG_OSG1
Definition: shader_sm4.c:1843
#define TAG_PSG1
Definition: shader_sm4.c:1847
enum vkd3d_shader_minimum_precision min_precision
enum vkd3d_shader_sysval_semantic sysval_semantic
static char * vkd3d_strdup(const char *string)
Definition: vkd3d_memory.h:57
@ VKD3D_SHADER_MINIMUM_PRECISION_NONE
@ VKD3DSIM_NONE
@ VKD3D_SHADER_ERROR_DXBC_INVALID_SIGNATURE
static size_t align(size_t addr, size_t alignment)

Referenced by isgn_handler(), and shdr_handler().

◆ shader_parse_static_samplers()

static int shader_parse_static_samplers ( struct root_signature_parser_context *  context,
unsigned int  offset,
unsigned int  count,
struct vkd3d_shader_static_sampler_desc *  sampler_descs 
)
static

Definition at line 916 of file dxbc.c.

918{
919 const char *ptr;
920 unsigned int i;
921
922 if (!require_space(offset, 13 * count, sizeof(uint32_t), context->data_size))
923 {
924 WARN("Invalid data size %#x (offset %u, count %u).\n", context->data_size, offset, count);
926 }
927 ptr = &context->data[offset];
928
929 for (i = 0; i < count; ++i)
930 {
931 sampler_descs[i].filter = read_u32(&ptr);
932 sampler_descs[i].address_u = read_u32(&ptr);
933 sampler_descs[i].address_v = read_u32(&ptr);
934 sampler_descs[i].address_w = read_u32(&ptr);
935 sampler_descs[i].mip_lod_bias = read_float(&ptr);
936 sampler_descs[i].max_anisotropy = read_u32(&ptr);
937 sampler_descs[i].comparison_func = read_u32(&ptr);
938 sampler_descs[i].border_colour = read_u32(&ptr);
939 sampler_descs[i].min_lod = read_float(&ptr);
940 sampler_descs[i].max_lod = read_float(&ptr);
941 sampler_descs[i].shader_register = read_u32(&ptr);
942 sampler_descs[i].register_space = read_u32(&ptr);
943 sampler_descs[i].shader_visibility = read_u32(&ptr);
944 }
945
946 return VKD3D_OK;
947}
static float read_float(const char **ptr)
Definition: dxbc.c:118
enum vkd3d_shader_comparison_func comparison_func
enum vkd3d_shader_texture_address_mode address_u
enum vkd3d_shader_texture_address_mode address_v
enum vkd3d_shader_filter filter
enum vkd3d_shader_static_border_colour border_colour
enum vkd3d_shader_visibility shader_visibility
enum vkd3d_shader_texture_address_mode address_w

Referenced by shader_parse_root_signature().

◆ shader_validate_descriptor_range1()

static void shader_validate_descriptor_range1 ( const struct vkd3d_shader_descriptor_range1 *  range)
static

Definition at line 641 of file dxbc.c.

642{
643 unsigned int unknown_flags = range->flags & ~(VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_NONE
649
650 if (unknown_flags)
651 FIXME("Unknown descriptor range flags %#x.\n", unknown_flags);
652}
range
Definition: d3dx9_private.h:58
@ VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE
@ VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS
@ VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_DATA_VOLATILE
@ VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_DATA_STATIC
@ VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_NONE
@ VKD3D_SHADER_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE

Referenced by shader_parse_descriptor_ranges1().

◆ shader_validate_root_descriptor1()

static void shader_validate_root_descriptor1 ( const struct vkd3d_shader_root_descriptor1 *  descriptor)
static

Definition at line 785 of file dxbc.c.

786{
787 unsigned int unknown_flags = descriptor->flags & ~(VKD3D_SHADER_ROOT_DESCRIPTOR_FLAG_NONE
791
792 if (unknown_flags)
793 FIXME("Unknown root descriptor flags %#x.\n", unknown_flags);
794}
@ VKD3D_SHADER_ROOT_DESCRIPTOR_FLAG_DATA_STATIC
@ VKD3D_SHADER_ROOT_DESCRIPTOR_FLAG_NONE
@ VKD3D_SHADER_ROOT_DESCRIPTOR_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE
@ VKD3D_SHADER_ROOT_DESCRIPTOR_FLAG_DATA_VOLATILE

Referenced by shader_parse_root_descriptor1().

◆ shader_write_descriptor_ranges()

static void shader_write_descriptor_ranges ( struct vkd3d_bytecode_buffer *  buffer,
const struct vkd3d_shader_root_descriptor_table *  table 
)
static

Definition at line 1164 of file dxbc.c.

1166{
1167 const struct vkd3d_shader_descriptor_range *ranges = table->descriptor_ranges;
1168 unsigned int i;
1169
1170 for (i = 0; i < table->descriptor_range_count; ++i)
1171 {
1172 put_u32(buffer, ranges[i].range_type);
1173 put_u32(buffer, ranges[i].descriptor_count);
1175 put_u32(buffer, ranges[i].register_space);
1177 }
1178}
static void put_u32(struct bytecode_buffer *buffer, uint32_t value)
GLuint buffer
Definition: glext.h:5915

Referenced by shader_write_descriptor_table().

◆ shader_write_descriptor_ranges1()

static void shader_write_descriptor_ranges1 ( struct vkd3d_bytecode_buffer *  buffer,
const struct vkd3d_shader_root_descriptor_table1 *  table 
)
static

Definition at line 1180 of file dxbc.c.

1182{
1183 const struct vkd3d_shader_descriptor_range1 *ranges = table->descriptor_ranges;
1184 unsigned int i;
1185
1186 for (i = 0; i < table->descriptor_range_count; ++i)
1187 {
1188 put_u32(buffer, ranges[i].range_type);
1189 put_u32(buffer, ranges[i].descriptor_count);
1191 put_u32(buffer, ranges[i].register_space);
1192 put_u32(buffer, ranges[i].flags);
1194 }
1195}

Referenced by shader_write_descriptor_table1().

◆ shader_write_descriptor_table()

static void shader_write_descriptor_table ( struct root_signature_writer_context *  context,
const struct vkd3d_shader_root_descriptor_table *  table 
)
static

Definition at line 1197 of file dxbc.c.

1199{
1200 struct vkd3d_bytecode_buffer *buffer = &context->buffer;
1201
1202 put_u32(buffer, table->descriptor_range_count);
1203 put_u32(buffer, get_chunk_offset(context) + sizeof(uint32_t)); /* offset */
1204
1206}
static size_t get_chunk_offset(struct root_signature_writer_context *context)
Definition: dxbc.c:1140
static void shader_write_descriptor_ranges(struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_root_descriptor_table *table)
Definition: dxbc.c:1164

Referenced by shader_write_root_parameters().

◆ shader_write_descriptor_table1()

static void shader_write_descriptor_table1 ( struct root_signature_writer_context *  context,
const struct vkd3d_shader_root_descriptor_table1 *  table 
)
static

Definition at line 1208 of file dxbc.c.

1210{
1211 struct vkd3d_bytecode_buffer *buffer = &context->buffer;
1212
1213 put_u32(buffer, table->descriptor_range_count);
1214 put_u32(buffer, get_chunk_offset(context) + sizeof(uint32_t)); /* offset */
1215
1217}
static void shader_write_descriptor_ranges1(struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_root_descriptor_table1 *table)
Definition: dxbc.c:1180

Referenced by shader_write_root_parameters().

◆ shader_write_root_constants()

static void shader_write_root_constants ( struct vkd3d_bytecode_buffer *  buffer,
const struct vkd3d_shader_root_constants *  constants 
)
static

Definition at line 1219 of file dxbc.c.

1221{
1222 put_u32(buffer, constants->shader_register);
1223 put_u32(buffer, constants->register_space);
1224 put_u32(buffer, constants->value_count);
1225}

Referenced by shader_write_root_parameters().

◆ shader_write_root_descriptor()

static void shader_write_root_descriptor ( struct vkd3d_bytecode_buffer *  buffer,
const struct vkd3d_shader_root_descriptor *  descriptor 
)
static

Definition at line 1227 of file dxbc.c.

1229{
1230 put_u32(buffer, descriptor->shader_register);
1231 put_u32(buffer, descriptor->register_space);
1232}

Referenced by shader_write_root_parameters().

◆ shader_write_root_descriptor1()

static void shader_write_root_descriptor1 ( struct vkd3d_bytecode_buffer *  buffer,
const struct vkd3d_shader_root_descriptor1 *  descriptor 
)
static

Definition at line 1234 of file dxbc.c.

1236{
1237 put_u32(buffer, descriptor->shader_register);
1238 put_u32(buffer, descriptor->register_space);
1239 put_u32(buffer, descriptor->flags);
1240}

Referenced by shader_write_root_parameters().

◆ shader_write_root_parameters()

static int shader_write_root_parameters ( struct root_signature_writer_context *  context,
const struct vkd3d_shader_versioned_root_signature_desc *  desc 
)
static

Definition at line 1242 of file dxbc.c.

1244{
1245 unsigned int parameter_count = versioned_root_signature_get_parameter_count(desc);
1246 struct vkd3d_bytecode_buffer *buffer = &context->buffer;
1247 size_t parameters_position;
1248 unsigned int i;
1249
1250 parameters_position = bytecode_align(buffer);
1251 for (i = 0; i < parameter_count; ++i)
1252 {
1255 put_u32(buffer, 0xffffffff); /* offset */
1256 }
1257
1258 for (i = 0; i < parameter_count; ++i)
1259 {
1260 set_u32(buffer, parameters_position + ((3 * i + 2) * sizeof(uint32_t)), get_chunk_offset(context));
1261
1263 {
1266 shader_write_descriptor_table(context, &desc->u.v_1_0.parameters[i].u.descriptor_table);
1267 else
1268 shader_write_descriptor_table1(context, &desc->u.v_1_1.parameters[i].u.descriptor_table);
1269 break;
1272 break;
1277 shader_write_root_descriptor(buffer, &desc->u.v_1_0.parameters[i].u.descriptor);
1278 else
1279 shader_write_root_descriptor1(buffer, &desc->u.v_1_1.parameters[i].u.descriptor);
1280 break;
1281 default:
1282 FIXME("Unrecognized type %#x.\n", versioned_root_signature_get_parameter_type(desc, i));
1284 "Invalid/unrecognised root signature root parameter type %#x.",
1287 }
1288 }
1289
1290 return VKD3D_OK;
1291}
static unsigned int versioned_root_signature_get_parameter_count(const struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:1068
static const struct vkd3d_shader_root_constants * versioned_root_signature_get_root_constants(const struct vkd3d_shader_versioned_root_signature_desc *desc, unsigned int i)
Definition: dxbc.c:1095
static enum vkd3d_shader_visibility versioned_root_signature_get_parameter_shader_visibility(const struct vkd3d_shader_versioned_root_signature_desc *desc, unsigned int i)
Definition: dxbc.c:1086
static void shader_write_root_constants(struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_root_constants *constants)
Definition: dxbc.c:1219
static void shader_write_descriptor_table(struct root_signature_writer_context *context, const struct vkd3d_shader_root_descriptor_table *table)
Definition: dxbc.c:1197
static void shader_write_descriptor_table1(struct root_signature_writer_context *context, const struct vkd3d_shader_root_descriptor_table1 *table)
Definition: dxbc.c:1208
static void shader_write_root_descriptor1(struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_root_descriptor1 *descriptor)
Definition: dxbc.c:1234
static void shader_write_root_descriptor(struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_root_descriptor *descriptor)
Definition: dxbc.c:1227
static enum vkd3d_shader_root_parameter_type versioned_root_signature_get_parameter_type(const struct vkd3d_shader_versioned_root_signature_desc *desc, unsigned int i)
Definition: dxbc.c:1077
size_t bytecode_align(struct vkd3d_bytecode_buffer *buffer)
void set_u32(struct vkd3d_bytecode_buffer *buffer, size_t offset, uint32_t value)
@ VKD3D_SHADER_ERROR_RS_INVALID_ROOT_PARAMETER_TYPE

Referenced by shader_write_root_signature().

◆ shader_write_root_signature()

static int shader_write_root_signature ( struct root_signature_writer_context *  context,
const struct vkd3d_shader_versioned_root_signature_desc *  desc 
)
static

Definition at line 1317 of file dxbc.c.

1319{
1320 struct vkd3d_bytecode_buffer *buffer = &context->buffer;
1321 size_t samplers_offset_position;
1322 int ret;
1323
1324 put_u32(buffer, desc->version);
1326 put_u32(buffer, get_chunk_offset(context) + 4 * sizeof(uint32_t)); /* offset */
1328 samplers_offset_position = put_u32(buffer, 0xffffffff);
1330
1332 return ret;
1333
1334 set_u32(buffer, samplers_offset_position, get_chunk_offset(context));
1336 return 0;
1337}
static void shader_write_static_samplers(struct vkd3d_bytecode_buffer *buffer, const struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:1293
static int shader_write_root_parameters(struct root_signature_writer_context *context, const struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:1242
static unsigned int versioned_root_signature_get_flags(const struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:1122
static unsigned int versioned_root_signature_get_static_sampler_count(const struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:1104

Referenced by vkd3d_shader_serialize_root_signature().

◆ shader_write_root_signature_header()

static void shader_write_root_signature_header ( struct root_signature_writer_context *  context)
static

Definition at line 1145 of file dxbc.c.

1146{
1147 struct vkd3d_bytecode_buffer *buffer = &context->buffer;
1148 unsigned int i;
1149
1151
1152 /* The checksum is computed when all data is generated. */
1153 for (i = 0; i < 4; ++i)
1154 put_u32(buffer, 0);
1155 put_u32(buffer, 1);
1156 context->total_size_position = put_u32(buffer, 0xffffffff);
1157 put_u32(buffer, 1); /* chunk count */
1158 put_u32(buffer, bytecode_get_size(buffer) + sizeof(uint32_t)); /* chunk offset */
1160 put_u32(buffer, 0xffffffff);
1161 context->chunk_position = bytecode_get_size(buffer);
1162}

Referenced by vkd3d_shader_serialize_root_signature().

◆ shader_write_static_samplers()

static void shader_write_static_samplers ( struct vkd3d_bytecode_buffer *  buffer,
const struct vkd3d_shader_versioned_root_signature_desc *  desc 
)
static

Definition at line 1293 of file dxbc.c.

1295{
1297 unsigned int i;
1298
1300 {
1314 }
1315}
static const struct vkd3d_shader_static_sampler_desc * versioned_root_signature_get_static_samplers(const struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:1113
Definition: filter.c:165
static size_t put_f32(struct vkd3d_bytecode_buffer *buffer, float value)

Referenced by shader_write_root_signature().

◆ shdr_handler()

static int shdr_handler ( const struct vkd3d_shader_dxbc_section_desc *  section,
struct vkd3d_shader_message_context *  message_context,
void *  context 
)
static

Definition at line 505 of file dxbc.c.

507{
508 struct dxbc_shader_desc *desc = context;
509 int ret;
510
511 switch (section->tag)
512 {
513 case TAG_ISGN:
514 case TAG_ISG1:
515 if (desc->input_signature.elements)
516 {
517 FIXME("Multiple input signatures.\n");
518 break;
519 }
520 if ((ret = shader_parse_signature(section, message_context, &desc->input_signature)) < 0)
521 return ret;
522 break;
523
524 case TAG_OSGN:
525 case TAG_OSG5:
526 case TAG_OSG1:
527 if (desc->output_signature.elements)
528 {
529 FIXME("Multiple output signatures.\n");
530 break;
531 }
532 if ((ret = shader_parse_signature(section, message_context, &desc->output_signature)) < 0)
533 return ret;
534 break;
535
536 case TAG_PCSG:
537 case TAG_PSG1:
538 if (desc->patch_constant_signature.elements)
539 {
540 FIXME("Multiple patch constant signatures.\n");
541 break;
542 }
543 if ((ret = shader_parse_signature(section, message_context, &desc->patch_constant_signature)) < 0)
544 return ret;
545 break;
546
547 case TAG_DXIL:
548 case TAG_SHDR:
549 case TAG_SHEX:
550 if ((section->tag == TAG_DXIL) != desc->is_dxil)
551 {
552 TRACE("Skipping chunk %#x.\n", section->tag);
553 break;
554 }
555 if (desc->byte_code)
556 FIXME("Multiple shader code chunks.\n");
557 desc->byte_code = section->data.code;
558 desc->byte_code_size = section->data.size;
559 break;
560
561 case TAG_AON9:
562 TRACE("Skipping AON9 shader code chunk.\n");
563 break;
564
565 default:
566 TRACE("Skipping chunk %#x.\n", section->tag);
567 break;
568 }
569
570 return VKD3D_OK;
571}
#define TAG_SHEX
#define TAG_SHDR
#define TAG_PCSG
#define TAG_AON9
Definition: shader_sm4.c:1840
#define TAG_DXIL
Definition: vkd3d_common.h:69

Referenced by shader_extract_from_dxbc().

◆ skip_dword_unknown()

static void skip_dword_unknown ( const char **  ptr,
unsigned int  count 
)
static

Definition at line 130 of file dxbc.c.

131{
132 unsigned int i;
133 uint32_t d;
134
135 if (!count)
136 return;
137
138 WARN("Skipping %u unknown DWORDs:\n", count);
139 for (i = 0; i < count; ++i)
140 {
141 d = read_u32(ptr);
142 WARN("\t0x%08x\n", d);
143 }
144}
#define d
Definition: ke_i.h:81

Referenced by shader_parse_signature().

◆ validate_descriptor_table_v_1_0()

static int validate_descriptor_table_v_1_0 ( const struct vkd3d_shader_root_descriptor_table *  descriptor_table,
struct vkd3d_shader_message_context *  message_context 
)
static

Definition at line 1339 of file dxbc.c.

1341{
1342 bool have_srv_uav_cbv = false;
1343 bool have_sampler = false;
1344 unsigned int i;
1345
1346 for (i = 0; i < descriptor_table->descriptor_range_count; ++i)
1347 {
1348 const struct vkd3d_shader_descriptor_range *r = &descriptor_table->descriptor_ranges[i];
1349
1350 if (r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_SRV
1351 || r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV
1352 || r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_CBV)
1353 {
1354 have_srv_uav_cbv = true;
1355 }
1356 else if (r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER)
1357 {
1358 have_sampler = true;
1359 }
1360 else
1361 {
1362 WARN("Invalid descriptor range type %#x.\n", r->range_type);
1364 "Invalid root signature descriptor range type %#x.", r->range_type);
1366 }
1367 }
1368
1369 if (have_srv_uav_cbv && have_sampler)
1370 {
1371 WARN("Samplers cannot be mixed with CBVs/SRVs/UAVs in descriptor tables.\n");
1373 "Encountered both CBV/SRV/UAV and sampler descriptor ranges in the same root descriptor table.");
1375 }
1376
1377 return VKD3D_OK;
1378}
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
const struct vkd3d_shader_descriptor_range * descriptor_ranges
@ VKD3D_SHADER_DESCRIPTOR_TYPE_UAV
Definition: vkd3d_shader.h:430
@ VKD3D_SHADER_DESCRIPTOR_TYPE_CBV
Definition: vkd3d_shader.h:435
@ VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER
Definition: vkd3d_shader.h:440
@ VKD3D_SHADER_DESCRIPTOR_TYPE_SRV
Definition: vkd3d_shader.h:425
@ VKD3D_SHADER_ERROR_RS_MIXED_DESCRIPTOR_RANGE_TYPES
@ VKD3D_SHADER_ERROR_RS_INVALID_DESCRIPTOR_RANGE_TYPE

Referenced by validate_root_signature_desc().

◆ validate_descriptor_table_v_1_1()

static int validate_descriptor_table_v_1_1 ( const struct vkd3d_shader_root_descriptor_table1 *  descriptor_table,
struct vkd3d_shader_message_context *  message_context 
)
static

Definition at line 1380 of file dxbc.c.

1382{
1383 bool have_srv_uav_cbv = false;
1384 bool have_sampler = false;
1385 unsigned int i;
1386
1387 for (i = 0; i < descriptor_table->descriptor_range_count; ++i)
1388 {
1389 const struct vkd3d_shader_descriptor_range1 *r = &descriptor_table->descriptor_ranges[i];
1390
1391 if (r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_SRV
1392 || r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV
1393 || r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_CBV)
1394 {
1395 have_srv_uav_cbv = true;
1396 }
1397 else if (r->range_type == VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER)
1398 {
1399 have_sampler = true;
1400 }
1401 else
1402 {
1403 WARN("Invalid descriptor range type %#x.\n", r->range_type);
1405 "Invalid root signature descriptor range type %#x.", r->range_type);
1407 }
1408 }
1409
1410 if (have_srv_uav_cbv && have_sampler)
1411 {
1412 WARN("Samplers cannot be mixed with CBVs/SRVs/UAVs in descriptor tables.\n");
1414 "Encountered both CBV/SRV/UAV and sampler descriptor ranges in the same root descriptor table.");
1416 }
1417
1418 return VKD3D_OK;
1419}
const struct vkd3d_shader_descriptor_range1 * descriptor_ranges

Referenced by validate_root_signature_desc().

◆ validate_root_signature_desc()

static int validate_root_signature_desc ( const struct vkd3d_shader_versioned_root_signature_desc *  desc,
struct vkd3d_shader_message_context *  message_context 
)
static

Definition at line 1421 of file dxbc.c.

1423{
1424 int ret = VKD3D_OK;
1425 unsigned int i;
1426
1428 {
1430
1433 {
1435 ret = validate_descriptor_table_v_1_0(&desc->u.v_1_0.parameters[i].u.descriptor_table, message_context);
1436 else
1437 ret = validate_descriptor_table_v_1_1(&desc->u.v_1_1.parameters[i].u.descriptor_table, message_context);
1438 }
1439
1440 if (ret < 0)
1441 break;
1442 }
1443
1444 return ret;
1445}
static int validate_descriptor_table_v_1_1(const struct vkd3d_shader_root_descriptor_table1 *descriptor_table, struct vkd3d_shader_message_context *message_context)
Definition: dxbc.c:1380
static int validate_descriptor_table_v_1_0(const struct vkd3d_shader_root_descriptor_table *descriptor_table, struct vkd3d_shader_message_context *message_context)
Definition: dxbc.c:1339
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
vkd3d_shader_root_parameter_type

Referenced by vkd3d_shader_serialize_root_signature().

◆ versioned_root_signature_get_flags()

static unsigned int versioned_root_signature_get_flags ( const struct vkd3d_shader_versioned_root_signature_desc *  desc)
static

Definition at line 1122 of file dxbc.c.

1123{
1125 return desc->u.v_1_0.flags;
1126 else
1127 return desc->u.v_1_1.flags;
1128}

Referenced by shader_write_root_signature().

◆ versioned_root_signature_get_parameter_count()

static unsigned int versioned_root_signature_get_parameter_count ( const struct vkd3d_shader_versioned_root_signature_desc *  desc)
static

Definition at line 1068 of file dxbc.c.

1070{
1072 return desc->u.v_1_0.parameter_count;
1073 else
1074 return desc->u.v_1_1.parameter_count;
1075}

Referenced by shader_write_root_parameters(), shader_write_root_signature(), and validate_root_signature_desc().

◆ versioned_root_signature_get_parameter_shader_visibility()

static enum vkd3d_shader_visibility versioned_root_signature_get_parameter_shader_visibility ( const struct vkd3d_shader_versioned_root_signature_desc *  desc,
unsigned int  i 
)
static

Definition at line 1086 of file dxbc.c.

1088{
1090 return desc->u.v_1_0.parameters[i].shader_visibility;
1091 else
1092 return desc->u.v_1_1.parameters[i].shader_visibility;
1093}

Referenced by shader_write_root_parameters().

◆ versioned_root_signature_get_parameter_type()

static enum vkd3d_shader_root_parameter_type versioned_root_signature_get_parameter_type ( const struct vkd3d_shader_versioned_root_signature_desc *  desc,
unsigned int  i 
)
static

Definition at line 1077 of file dxbc.c.

1079{
1081 return desc->u.v_1_0.parameters[i].parameter_type;
1082 else
1083 return desc->u.v_1_1.parameters[i].parameter_type;
1084}

Referenced by shader_write_root_parameters(), and validate_root_signature_desc().

◆ versioned_root_signature_get_root_constants()

static const struct vkd3d_shader_root_constants * versioned_root_signature_get_root_constants ( const struct vkd3d_shader_versioned_root_signature_desc *  desc,
unsigned int  i 
)
static

Definition at line 1095 of file dxbc.c.

1097{
1099 return &desc->u.v_1_0.parameters[i].u.constants;
1100 else
1101 return &desc->u.v_1_1.parameters[i].u.constants;
1102}

Referenced by shader_write_root_parameters().

◆ versioned_root_signature_get_static_sampler_count()

static unsigned int versioned_root_signature_get_static_sampler_count ( const struct vkd3d_shader_versioned_root_signature_desc *  desc)
static

Definition at line 1104 of file dxbc.c.

1106{
1108 return desc->u.v_1_0.static_sampler_count;
1109 else
1110 return desc->u.v_1_1.static_sampler_count;
1111}

Referenced by shader_write_root_signature(), and shader_write_static_samplers().

◆ versioned_root_signature_get_static_samplers()

static const struct vkd3d_shader_static_sampler_desc * versioned_root_signature_get_static_samplers ( const struct vkd3d_shader_versioned_root_signature_desc *  desc)
static

Definition at line 1113 of file dxbc.c.

1115{
1117 return desc->u.v_1_0.static_samplers;
1118 else
1119 return desc->u.v_1_1.static_samplers;
1120}

Referenced by shader_write_static_samplers().

◆ vkd3d_shader_convert_root_signature()

Convert a structural representation of a root signature to a different version of structural representation.

This function corresponds to ID3D12VersionedRootSignatureDeserializer::GetRootSignatureDescAtVersion().

Parameters
dstA pointer to a vkd3d_shader_versioned_root_signature_desc structure in which the converted signature will be stored.
Members of dst may be allocated by vkd3d-shader. The signature should be freed with vkd3d_shader_free_root_signature() when no longer needed.
versionThe desired version to convert src to. This version must not be equal to src->version.
srcInput root signature description.
Returns
A member of vkd3d_result.

Definition at line 1756 of file dxbc.c.

1758{
1759 int ret;
1760
1761 TRACE("dst %p, version %#x, src %p.\n", dst, version, src);
1762
1763 if (src->version == version)
1764 {
1765 WARN("Nothing to convert.\n");
1767 }
1768
1770 {
1771 WARN("Root signature version %#x not supported.\n", version);
1773 }
1774
1777 {
1778 WARN("Root signature version %#x not supported.\n", src->version);
1780 }
1781
1782 memset(dst, 0, sizeof(*dst));
1783 dst->version = version;
1784
1786 {
1788 }
1789 else
1790 {
1793 }
1794
1795 return ret;
1796}
static int convert_root_signature_to_v1_0(struct vkd3d_shader_versioned_root_signature_desc *dst, const struct vkd3d_shader_versioned_root_signature_desc *src)
Definition: dxbc.c:1594
static int convert_root_signature_to_v1_1(struct vkd3d_shader_versioned_root_signature_desc *dst, const struct vkd3d_shader_versioned_root_signature_desc *src)
Definition: dxbc.c:1715

Referenced by d3d12_versioned_root_signature_deserializer_GetRootSignatureDescAtVersion(), and vkd3d_parse_root_signature_v_1_0().

◆ vkd3d_shader_free_dxbc()

void vkd3d_shader_free_dxbc ( struct vkd3d_shader_dxbc_desc *  dxbc)

Free the contents of a vkd3d_shader_dxbc_desc structure allocated by another vkd3d-shader function, such as vkd3d_shader_parse_dxbc().

This function may free the vkd3d_shader_dxbc_desc::sections member, but does not free the structure itself.

Parameters
dxbcThe vkd3d_shader_dxbc_desc structure to free.
Since
1.7

Definition at line 290 of file dxbc.c.

291{
292 TRACE("dxbc %p.\n", dxbc);
293
294 vkd3d_free(dxbc->sections);
295}
struct vkd3d_shader_dxbc_section_desc * sections

Referenced by d3d10_effect_parse(), d3dcompiler_get_blob_part(), d3dcompiler_shader_reflection_init(), d3dcompiler_strip_shader(), for_each_dxbc_section(), parse_fx10_preshader(), vkd3d_shader_parse_dxbc(), vkd3d_shader_parse_dxbc_source_type(), and wined3d_shader_extract_from_dxbc().

◆ vkd3d_shader_parse_dxbc()

int vkd3d_shader_parse_dxbc ( const struct vkd3d_shader_code *  dxbc,
uint32_t  flags,
struct vkd3d_shader_dxbc_desc *  desc,
char **  messages 
)

Parse a DXBC blob contained in a vkd3d_shader_code structure.

Parameters
dxbcA vkd3d_shader_code structure containing the DXBC blob to parse.
flagsA combination of zero or more elements of enum vkd3d_shader_parse_dxbc_flags.
descA vkd3d_shader_dxbc_desc structure describing the contents of the DXBC blob. Its vkd3d_shader_dxbc_section_desc structures will contain pointers into the input blob; its contents are only valid while the input blob is valid. The contents of this structure should be freed with vkd3d_shader_free_dxbc() when no longer needed.
messagesOptional output location for error or informational messages produced by the parser.
This string is null-terminated and UTF-8 encoded.
The messages are allocated by vkd3d-shader and should be freed with vkd3d_shader_free_messages() when no longer needed.
If no messages are produced by the parser, this parameter may receive NULL instead of a valid string pointer.
Returns
A member of vkd3d_result.
Since
1.7

Definition at line 320 of file dxbc.c.

322{
323 struct vkd3d_shader_message_context message_context;
324 int ret;
325
326 TRACE("dxbc {%p, %zu}, flags %#x, desc %p, messages %p.\n", dxbc->code, dxbc->size, flags, desc, messages);
327
328 if (messages)
329 *messages = NULL;
331
332 ret = parse_dxbc(dxbc, &message_context, NULL, flags, desc);
333
335 if (!vkd3d_shader_message_context_copy_messages(&message_context, messages) && ret >= 0)
336 {
339 }
340 vkd3d_shader_message_context_cleanup(&message_context);
341
342 if (ret < 0)
343 memset(desc, 0, sizeof(*desc));
344
345 return ret;
346}
@ VKD3D_SHADER_LOG_INFO
void vkd3d_shader_message_context_cleanup(struct vkd3d_shader_message_context *context)
bool vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context, char **out)
void vkd3d_shader_message_context_init(struct vkd3d_shader_message_context *context, enum vkd3d_shader_log_level log_level)
#define vkd3d_shader_message_context_trace_messages(context)

Referenced by d3d10_effect_parse(), d3dcompiler_get_blob_part(), d3dcompiler_shader_reflection_init(), d3dcompiler_strip_shader(), parse_fx10_preshader(), vkd3d_shader_parse_dxbc_source_type(), and wined3d_shader_extract_from_dxbc().

◆ vkd3d_shader_parse_root_signature()

int vkd3d_shader_parse_root_signature ( const struct vkd3d_shader_code *  dxbc,
struct vkd3d_shader_versioned_root_signature_desc *  root_signature,
char **  messages 
)

Convert a byte code description of a shader root signature to a structural description which can be easily parsed by C code.

This function corresponds to ID3D12VersionedRootSignatureDeserializer::GetUnconvertedRootSignatureDesc().

This function performs the reverse transformation of vkd3d_shader_serialize_root_signature().

This function parses a standalone root signature, and should not be confused with vkd3d_shader_parse_input_signature().

Parameters
dxbcCompiled byte code, in DXBC format.
root_signatureOutput location in which the decompiled root signature will be stored.
Members of root_signature may be allocated by vkd3d-shader. The signature should be freed with vkd3d_shader_free_root_signature() when no longer needed.
messagesOptional output location for error or informational messages produced by the parser.
This string is null-terminated and UTF-8 encoded.
The messages are allocated by vkd3d-shader and should be freed with vkd3d_shader_free_messages() when no longer needed.
If no messages are produced by the parser, this parameter may receive NULL instead of a valid string pointer.
Returns
A member of vkd3d_result.

Definition at line 1043 of file dxbc.c.

1045{
1046 struct vkd3d_shader_message_context message_context;
1047 int ret;
1048
1049 TRACE("dxbc {%p, %zu}, root_signature %p, messages %p.\n", dxbc->code, dxbc->size, root_signature, messages);
1050
1051 memset(root_signature, 0, sizeof(*root_signature));
1052 if (messages)
1053 *messages = NULL;
1055
1056 ret = for_each_dxbc_section(dxbc, &message_context, NULL, rts0_handler, root_signature);
1060
1061 vkd3d_shader_message_context_cleanup(&message_context);
1062 if (ret < 0)
1063 vkd3d_shader_free_root_signature(root_signature);
1064
1065 return ret;
1066}
static int rts0_handler(const struct vkd3d_shader_dxbc_section_desc *section, struct vkd3d_shader_message_context *message_context, void *context)
Definition: dxbc.c:1032
VKD3D_SHADER_API void vkd3d_shader_free_root_signature(struct vkd3d_shader_versioned_root_signature_desc *root_signature)

Referenced by d3d12_versioned_root_signature_deserializer_init(), and vkd3d_parse_root_signature_v_1_0().

◆ vkd3d_shader_serialize_dxbc()

int vkd3d_shader_serialize_dxbc ( size_t  section_count,
const struct vkd3d_shader_dxbc_section_desc *  sections,
struct vkd3d_shader_code *  dxbc,
char **  messages 
)

Serialize a DXBC description into a blob stored in a vkd3d_shader_code structure.

Parameters
section_countThe number of DXBC sections to serialize.
sectionsAn array of vkd3d_shader_dxbc_section_desc structures to serialize.
dxbcA pointer to a vkd3d_shader_code structure in which the serialized blob will be stored.
The output blob is allocated by vkd3d-shader and should be freed with vkd3d_shader_free_shader_code() when no longer needed.
messagesOptional output location for error or informational messages produced by the serializer.
This string is null-terminated and UTF-8 encoded.
The messages are allocated by vkd3d-shader and should be freed with vkd3d_shader_free_messages() when no longer needed.
If no messages are produced by the serializer, this parameter may receive NULL instead of a valid string pointer.
Returns
A member of vkd3d_result.
Since
1.7

Definition at line 53 of file dxbc.c.

55{
56 size_t size_position, offsets_position, checksum_position, i;
57 struct vkd3d_bytecode_buffer buffer = {0};
59
60 TRACE("section_count %zu, sections %p, dxbc %p, messages %p.\n", section_count, sections, dxbc, messages);
61
62 if (messages)
63 *messages = NULL;
64
66
67 checksum_position = bytecode_get_size(&buffer);
68 for (i = 0; i < 4; ++i)
69 put_u32(&buffer, 0);
70
71 put_u32(&buffer, 1); /* version */
72 size_position = put_u32(&buffer, 0);
73 put_u32(&buffer, section_count);
74
75 offsets_position = bytecode_get_size(&buffer);
76 for (i = 0; i < section_count; ++i)
77 put_u32(&buffer, 0);
78
79 for (i = 0; i < section_count; ++i)
80 {
81 set_u32(&buffer, offsets_position + i * sizeof(uint32_t), bytecode_align(&buffer));
83 put_u32(&buffer, sections[i].data.size);
84 bytecode_put_bytes(&buffer, sections[i].data.code, sections[i].data.size);
85 }
86 set_u32(&buffer, size_position, bytecode_get_size(&buffer));
87
89 for (i = 0; i < 4; ++i)
90 set_u32(&buffer, checksum_position + i * sizeof(uint32_t), checksum[i]);
91
92 if (!buffer.status)
93 {
94 dxbc->code = buffer.data;
95 dxbc->size = buffer.size;
96 }
97 return buffer.status;
98}
size_t bytecode_put_bytes(struct vkd3d_bytecode_buffer *buffer, const void *bytes, size_t size)

Referenced by D3DCompile2(), d3dcompiler_get_blob_part(), d3dcompiler_strip_shader(), and dxbc_writer_write().

◆ vkd3d_shader_serialize_root_signature()

int vkd3d_shader_serialize_root_signature ( const struct vkd3d_shader_versioned_root_signature_desc *  root_signature,
struct vkd3d_shader_code *  dxbc,
char **  messages 
)

Convert a structural description of a shader root signature to a byte code format capable of being read by ID3D12Device::CreateRootSignature. The compiled signature is compatible with Microsoft D3D 12.

This function corresponds to D3D12SerializeVersionedRootSignature().

Parameters
root_signatureDescription of the root signature.
dxbcA pointer to a vkd3d_shader_code structure in which the compiled code will be stored.
The compiled signature is allocated by vkd3d-shader and should be freed with vkd3d_shader_free_shader_code() when no longer needed.
messagesOptional output location for error or informational messages produced by the serializer.
This string is null-terminated and UTF-8 encoded.
The messages are allocated by vkd3d-shader and should be freed with vkd3d_shader_free_messages() when no longer needed.
If no messages are produced by the serializer, this parameter may receive NULL instead of a valid string pointer.
Returns
A member of vkd3d_result.

Definition at line 1447 of file dxbc.c.

1449{
1451 size_t total_size, chunk_size;
1452 uint32_t checksum[4];
1453 unsigned int i;
1454 int ret;
1455
1456 TRACE("root_signature %p, dxbc %p, messages %p.\n", root_signature, dxbc, messages);
1457
1458 if (messages)
1459 *messages = NULL;
1460
1461 memset(&context, 0, sizeof(context));
1463
1466 {
1468 WARN("Root signature version %#x not supported.\n", root_signature->version);
1470 "Root signature version %#x is not supported.", root_signature->version);
1471 goto done;
1472 }
1473
1474 if ((ret = validate_root_signature_desc(root_signature, &context.message_context)) < 0)
1475 goto done;
1476
1477 memset(dxbc, 0, sizeof(*dxbc));
1479
1480 if ((ret = shader_write_root_signature(&context, root_signature)) < 0)
1481 {
1482 vkd3d_free(context.buffer.data);
1483 goto done;
1484 }
1485
1486 if (context.buffer.status)
1487 {
1489 "Out of memory while writing root signature.");
1490 vkd3d_free(context.buffer.data);
1491 goto done;
1492 }
1493
1494 total_size = bytecode_get_size(&context.buffer);
1495 chunk_size = get_chunk_offset(&context);
1496 set_u32(&context.buffer, context.total_size_position, total_size);
1497 set_u32(&context.buffer, context.chunk_position - sizeof(uint32_t), chunk_size);
1498
1499 dxbc->code = context.buffer.data;
1500 dxbc->size = total_size;
1501
1502 compute_dxbc_checksum(dxbc->code, dxbc->size, checksum);
1503 for (i = 0; i < 4; ++i)
1504 set_u32(&context.buffer, (i + 1) * sizeof(uint32_t), checksum[i]);
1505
1506 ret = VKD3D_OK;
1507
1508done:
1513 return ret;
1514}
static int validate_root_signature_desc(const struct vkd3d_shader_versioned_root_signature_desc *desc, struct vkd3d_shader_message_context *message_context)
Definition: dxbc.c:1421
static void shader_write_root_signature_header(struct root_signature_writer_context *context)
Definition: dxbc.c:1145
static int shader_write_root_signature(struct root_signature_writer_context *context, const struct vkd3d_shader_versioned_root_signature_desc *desc)
Definition: dxbc.c:1317
enum vkd3d_shader_root_signature_version version
@ VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY
@ VKD3D_SHADER_ERROR_RS_INVALID_VERSION

Referenced by vkd3d_serialize_root_signature(), and vkd3d_serialize_versioned_root_signature().