ReactOS 0.4.17-dev-934-g091855f
vkd3d_shader_main.c File Reference
#include "vkd3d_shader_private.h"
#include "vkd3d_version.h"
#include "hlsl.h"
#include <stdio.h>
#include <math.h>
Include dependency graph for vkd3d_shader_main.c:

Go to the source code of this file.

Classes

struct  shader_dump_data
 
struct  vkd3d_shader_scan_context
 
struct  vkd3d_shader_scan_context::vkd3d_shader_cf_info
 

Functions

static int char_to_int (char c)
 
uint32_t vkd3d_parse_integer (const char *s)
 
void vkd3d_string_buffer_init (struct vkd3d_string_buffer *buffer)
 
void vkd3d_string_buffer_cleanup (struct vkd3d_string_buffer *buffer)
 
void vkd3d_string_buffer_clear (struct vkd3d_string_buffer *buffer)
 
void vkd3d_string_buffer_truncate (struct vkd3d_string_buffer *buffer, size_t size)
 
static bool vkd3d_string_buffer_resize (struct vkd3d_string_buffer *buffer, int rc)
 
int vkd3d_string_buffer_vprintf (struct vkd3d_string_buffer *buffer, const char *format, va_list args)
 
int vkd3d_string_buffer_printf (struct vkd3d_string_buffer *buffer, const char *format,...)
 
int vkd3d_string_buffer_print_f32 (struct vkd3d_string_buffer *buffer, float f)
 
int vkd3d_string_buffer_print_f64 (struct vkd3d_string_buffer *buffer, double d)
 
void vkd3d_string_buffer_trace_ (const struct vkd3d_string_buffer *buffer, const char *function)
 
void vkd3d_shader_trace_text_ (const char *text, size_t size, const char *function)
 
void vkd3d_string_buffer_cache_init (struct vkd3d_string_buffer_cache *cache)
 
void vkd3d_string_buffer_cache_cleanup (struct vkd3d_string_buffer_cache *cache)
 
struct vkd3d_string_buffer * vkd3d_string_buffer_get (struct vkd3d_string_buffer_cache *cache)
 
void vkd3d_string_buffer_release (struct vkd3d_string_buffer_cache *cache, struct vkd3d_string_buffer *buffer)
 
void vkd3d_shader_code_from_string_buffer (struct vkd3d_shader_code *code, struct vkd3d_string_buffer *buffer)
 
void vkd3d_shader_message_context_init (struct vkd3d_shader_message_context *context, enum vkd3d_shader_log_level log_level)
 
void vkd3d_shader_message_context_cleanup (struct vkd3d_shader_message_context *context)
 
void vkd3d_shader_message_context_trace_messages_ (const struct vkd3d_shader_message_context *context, const char *function)
 
bool vkd3d_shader_message_context_copy_messages (struct vkd3d_shader_message_context *context, char **out)
 
void vkd3d_shader_vnote (struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location, enum vkd3d_shader_log_level level, const char *format, va_list args)
 
void vkd3d_shader_vwarning (struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location, enum vkd3d_shader_error error, const char *format, va_list args)
 
void vkd3d_shader_warning (struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location, enum vkd3d_shader_error error, const char *format,...)
 
void vkd3d_shader_verror (struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location, enum vkd3d_shader_error error, const char *format, va_list args)
 
void vkd3d_shader_error (struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location, enum vkd3d_shader_error error, const char *format,...)
 
size_t bytecode_align (struct vkd3d_bytecode_buffer *buffer)
 
size_t bytecode_put_bytes_unaligned (struct vkd3d_bytecode_buffer *buffer, const void *bytes, size_t size)
 
size_t bytecode_put_bytes (struct vkd3d_bytecode_buffer *buffer, const void *bytes, size_t size)
 
size_t bytecode_reserve_bytes (struct vkd3d_bytecode_buffer *buffer, size_t size)
 
static void bytecode_set_bytes (struct vkd3d_bytecode_buffer *buffer, size_t offset, const void *value, size_t size)
 
void set_u32 (struct vkd3d_bytecode_buffer *buffer, size_t offset, uint32_t value)
 
void set_string (struct vkd3d_bytecode_buffer *buffer, size_t offset, const char *string, size_t length)
 
static void vkd3d_shader_dump_shader (const struct shader_dump_data *dump_data, const void *data, size_t size, bool source)
 
static const char * shader_get_source_type_suffix (enum vkd3d_shader_source_type type)
 
static const char * shader_get_target_type_suffix (enum vkd3d_shader_target_type type)
 
static void fill_shader_dump_data (const struct vkd3d_shader_compile_info *compile_info, struct shader_dump_data *data)
 
static void init_scan_signature_info (const struct vkd3d_shader_compile_info *info)
 
uint64_t vkd3d_shader_init_config_flags (void)
 
void vkd3d_shader_parser_init (struct vkd3d_shader_parser *parser, struct vsir_program *program, struct vkd3d_shader_message_context *message_context, const char *source_name)
 
void VKD3D_PRINTF_FUNC (3, 4)
 
static int vkd3d_shader_validate_compile_info (const struct vkd3d_shader_compile_info *compile_info, bool validate_target_type)
 
static enum vkd3d_result vsir_parse (const struct vkd3d_shader_compile_info *compile_info, uint64_t config_flags, struct vkd3d_shader_message_context *message_context, struct vsir_program *program)
 
void vkd3d_shader_free_messages (char *messages)
 
static bool vkd3d_shader_signature_from_shader_signature (struct vkd3d_shader_signature *signature, const struct shader_signature *src)
 
static void vkd3d_shader_scan_context_init (struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_version *version, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_scan_descriptor_info1 *scan_descriptor_info, struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info, struct vkd3d_shader_message_context *message_context)
 
static void vkd3d_shader_scan_context_cleanup (struct vkd3d_shader_scan_context *context)
 
static struct vkd3d_shader_cf_info * vkd3d_shader_scan_get_current_cf_info (struct vkd3d_shader_scan_context *context)
 
static struct vkd3d_shader_cf_info * vkd3d_shader_scan_push_cf_info (struct vkd3d_shader_scan_context *context)
 
static void vkd3d_shader_scan_pop_cf_info (struct vkd3d_shader_scan_context *context)
 
static struct vkd3d_shader_cf_info * vkd3d_shader_scan_find_innermost_breakable_cf_info (struct vkd3d_shader_scan_context *context)
 
static struct vkd3d_shader_cf_info * vkd3d_shader_scan_find_innermost_loop_cf_info (struct vkd3d_shader_scan_context *context)
 
static void vkd3d_shader_scan_add_uav_flag (const struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_register *reg, uint32_t flag)
 
static bool vkd3d_shader_instruction_is_uav_read (const struct vkd3d_shader_instruction *instruction)
 
static void vkd3d_shader_scan_record_uav_read (struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_register *reg)
 
static bool vkd3d_shader_instruction_is_uav_counter (const struct vkd3d_shader_instruction *instruction)
 
static void vkd3d_shader_scan_record_uav_counter (struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_register *reg)
 
static bool vkd3d_shader_instruction_is_uav_atomic_op (const struct vkd3d_shader_instruction *instruction)
 
static void vkd3d_shader_scan_record_uav_atomic_op (struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_register *reg)
 
static struct vkd3d_shader_descriptor_info1 * vkd3d_shader_scan_add_descriptor (struct vkd3d_shader_scan_context *context, enum vkd3d_shader_descriptor_type type, const struct vkd3d_shader_register *reg, const struct vkd3d_shader_register_range *range, enum vkd3d_shader_resource_type resource_type, enum vkd3d_shader_resource_data_type resource_data_type)
 
static void vkd3d_shader_scan_constant_buffer_declaration (struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_instruction *instruction)
 
static void vkd3d_shader_scan_sampler_declaration (struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_instruction *instruction)
 
static void vkd3d_shader_scan_combined_sampler_declaration (struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_semantic *semantic)
 
static const struct vkd3d_shader_descriptor_info1 * find_descriptor (const struct vkd3d_shader_scan_descriptor_info1 *info, enum vkd3d_shader_descriptor_type type, unsigned int register_id)
 
static void vkd3d_shader_scan_combined_sampler_usage (struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_register *resource, const struct vkd3d_shader_register *sampler)
 
static void vkd3d_shader_scan_resource_declaration (struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_resource *resource, enum vkd3d_shader_resource_type resource_type, enum vkd3d_shader_resource_data_type resource_data_type, unsigned int sample_count, unsigned int structure_stride, bool raw, uint32_t flags)
 
static void vkd3d_shader_scan_typed_resource_declaration (struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_instruction *instruction)
 
static int vkd3d_shader_scan_instruction (struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_instruction *instruction)
 
static enum vkd3d_result convert_descriptor_info (struct vkd3d_shader_scan_descriptor_info *info, const struct vkd3d_shader_scan_descriptor_info1 *info1)
 
static void vkd3d_shader_free_scan_descriptor_info1 (struct vkd3d_shader_scan_descriptor_info1 *scan_descriptor_info)
 
static int vsir_program_scan (struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_message_context *message_context, struct vkd3d_shader_scan_descriptor_info1 *descriptor_info1)
 
int vkd3d_shader_scan (const struct vkd3d_shader_compile_info *compile_info, char **messages)
 
int vsir_program_compile (struct vsir_program *program, uint64_t config_flags, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
 
static int compile_hlsl (const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
 
int vkd3d_shader_compile (const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, char **messages)
 
void vkd3d_shader_free_scan_combined_resource_sampler_info (struct vkd3d_shader_scan_combined_resource_sampler_info *info)
 
void vkd3d_shader_free_scan_descriptor_info (struct vkd3d_shader_scan_descriptor_info *scan_descriptor_info)
 
void vkd3d_shader_free_scan_signature_info (struct vkd3d_shader_scan_signature_info *info)
 
void vkd3d_shader_free_shader_code (struct vkd3d_shader_code *shader_code)
 
static void vkd3d_shader_free_root_signature_v_1_0 (struct vkd3d_shader_root_signature_desc *root_signature)
 
static void vkd3d_shader_free_root_signature_v_1_1 (struct vkd3d_shader_root_signature_desc1 *root_signature)
 
void vkd3d_shader_free_root_signature (struct vkd3d_shader_versioned_root_signature_desc *desc)
 
void shader_signature_cleanup (struct shader_signature *signature)
 
int vkd3d_shader_parse_input_signature (const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_signature *signature, char **messages)
 
struct vkd3d_shader_signature_element * vkd3d_shader_find_signature_element (const struct vkd3d_shader_signature *signature, const char *semantic_name, unsigned int semantic_index, unsigned int stream_index)
 
void vkd3d_shader_free_shader_signature (struct vkd3d_shader_signature *signature)
 
const char * vkd3d_shader_get_version (unsigned int *major, unsigned int *minor)
 
enum vkd3d_shader_source_type * vkd3d_shader_get_supported_source_types (unsigned int *count)
 
enum vkd3d_shader_target_type * vkd3d_shader_get_supported_target_types (enum vkd3d_shader_source_type source_type, unsigned int *count)
 
int vkd3d_shader_preprocess (const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, char **messages)
 
void vkd3d_shader_set_log_callback (PFN_vkd3d_log callback)
 
static struct vkd3d_shader_param_node * shader_param_allocator_node_create (struct vkd3d_shader_param_allocator *allocator)
 
static void shader_param_allocator_init (struct vkd3d_shader_param_allocator *allocator, unsigned int count, unsigned int stride)
 
static void shader_param_allocator_destroy (struct vkd3d_shader_param_allocator *allocator)
 
void * shader_param_allocator_get (struct vkd3d_shader_param_allocator *allocator, unsigned int count)
 
bool shader_instruction_array_init (struct vkd3d_shader_instruction_array *instructions, unsigned int reserve)
 
bool shader_instruction_array_reserve (struct vkd3d_shader_instruction_array *instructions, unsigned int reserve)
 
bool shader_instruction_array_insert_at (struct vkd3d_shader_instruction_array *instructions, unsigned int idx, unsigned int count)
 
bool shader_instruction_array_add_icb (struct vkd3d_shader_instruction_array *instructions, struct vkd3d_shader_immediate_constant_buffer *icb)
 
static struct vkd3d_shader_src_param * shader_instruction_array_clone_src_params (struct vkd3d_shader_instruction_array *instructions, const struct vkd3d_shader_src_param *params, unsigned int count)
 
static bool shader_register_clone_relative_addresses (struct vkd3d_shader_register *reg, struct vkd3d_shader_instruction_array *instructions)
 
static struct vkd3d_shader_dst_param * shader_instruction_array_clone_dst_params (struct vkd3d_shader_instruction_array *instructions, const struct vkd3d_shader_dst_param *params, unsigned int count)
 
bool shader_instruction_array_clone_instruction (struct vkd3d_shader_instruction_array *instructions, unsigned int dst, unsigned int src)
 
void shader_instruction_array_destroy (struct vkd3d_shader_instruction_array *instructions)
 
void vkd3d_shader_build_varying_map (const struct vkd3d_shader_signature *output_signature, const struct vkd3d_shader_signature *input_signature, unsigned int *ret_count, struct vkd3d_shader_varying_map *varyings)
 

Variables

static const struct vkd3d_debug_option vkd3d_shader_config_options []
 

Function Documentation

◆ bytecode_align()

size_t bytecode_align ( struct vkd3d_bytecode_buffer *  buffer)

Definition at line 370 of file vkd3d_shader_main.c.

371{
372 size_t aligned_size = align(buffer->size, 4);
373
374 if (!vkd3d_array_reserve((void **)&buffer->data, &buffer->capacity, aligned_size, 1))
375 {
377 return aligned_size;
378 }
379
380 memset(buffer->data + buffer->size, 0xab, aligned_size - buffer->size);
381 buffer->size = aligned_size;
382 return aligned_size;
383}
GLuint buffer
Definition: glext.h:5915
#define memset(x, y, z)
Definition: compat.h:39
bool vkd3d_array_reserve(void **elements, size_t *capacity, size_t element_count, size_t element_size)
Definition: memory.c:22
@ VKD3D_ERROR_OUT_OF_MEMORY
Definition: vkd3d_types.h:49
static size_t align(size_t addr, size_t alignment)

Referenced by add_section(), bytecode_put_bytes(), bytecode_reserve_bytes(), shader_write_root_parameters(), vkd3d_shader_serialize_dxbc(), write_sm1_type(), write_sm1_uniforms(), write_sm4_rdef(), and write_sm4_type().

◆ bytecode_put_bytes()

size_t bytecode_put_bytes ( struct vkd3d_bytecode_buffer *  buffer,
const void *  bytes,
size_t  size 
)

Definition at line 402 of file vkd3d_shader_main.c.

403{
406}
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
GLsizeiptr size
Definition: glext.h:5919
size_t bytecode_put_bytes_unaligned(struct vkd3d_bytecode_buffer *buffer, const void *bytes, size_t size)
size_t bytecode_align(struct vkd3d_bytecode_buffer *buffer)

Referenced by d3dbc_compile(), hlsl_fx_2_write(), hlsl_fx_4_write(), hlsl_fx_5_write(), put_f32(), put_string(), put_u32(), vkd3d_shader_serialize_dxbc(), write_fx_2_object_initializer(), and write_fx_2_string().

◆ bytecode_put_bytes_unaligned()

size_t bytecode_put_bytes_unaligned ( struct vkd3d_bytecode_buffer *  buffer,
const void *  bytes,
size_t  size 
)

Definition at line 385 of file vkd3d_shader_main.c.

386{
387 size_t offset = buffer->size;
388
389 if (buffer->status)
390 return offset;
391
392 if (!vkd3d_array_reserve((void **)&buffer->data, &buffer->capacity, offset + size, 1))
393 {
395 return offset;
396 }
397 memcpy(buffer->data + offset, bytes, size);
398 buffer->size = offset + size;
399 return offset;
400}
GLintptr offset
Definition: glext.h:5920
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878

Referenced by bytecode_put_bytes(), hlsl_fx_4_write(), hlsl_fx_5_write(), put_u32_unaligned(), write_fx_2_string(), and write_fx_4_string().

◆ bytecode_reserve_bytes()

size_t bytecode_reserve_bytes ( struct vkd3d_bytecode_buffer *  buffer,
size_t  size 
)

Definition at line 408 of file vkd3d_shader_main.c.

409{
410 size_t offset = bytecode_align(buffer);
411
412 if (buffer->status)
413 return offset;
414
415 if (!vkd3d_array_reserve((void **)&buffer->data, &buffer->capacity, offset + size, 1))
416 {
418 return offset;
419 }
420
421 memset(buffer->data + offset, 0, size);
422 buffer->size = offset + size;
423 return offset;
424}

Referenced by write_sm1_uniforms(), and write_sm4_rdef().

◆ bytecode_set_bytes()

static void bytecode_set_bytes ( struct vkd3d_bytecode_buffer *  buffer,
size_t  offset,
const void *  value,
size_t  size 
)
static

Definition at line 426 of file vkd3d_shader_main.c.

428{
429 if (buffer->status)
430 return;
431
433 memcpy(buffer->data + offset, value, size);
434}
Definition: pdh_main.c:64
static bool vkd3d_bound_range(size_t start, size_t count, size_t limit)
Definition: vkd3d_common.h:360
#define VKD3D_ASSERT(cond)
Definition: vkd3d_common.h:49

Referenced by set_string(), and set_u32().

◆ char_to_int()

static int char_to_int ( char  c)
inlinestatic

Definition at line 26 of file vkd3d_shader_main.c.

27{
28 if ('0' <= c && c <= '9')
29 return c - '0';
30 if ('A' <= c && c <= 'F')
31 return c - 'A' + 10;
32 if ('a' <= c && c <= 'f')
33 return c - 'a' + 10;
34 return -1;
35}
const GLubyte * c
Definition: glext.h:8905

Referenced by vkd3d_parse_integer().

◆ compile_hlsl()

static int compile_hlsl ( const struct vkd3d_shader_compile_info *  compile_info,
struct vkd3d_shader_code *  out,
struct vkd3d_shader_message_context *  message_context 
)
static

Definition at line 1693 of file vkd3d_shader_main.c.

1695{
1696 struct vkd3d_shader_code preprocessed;
1697 int ret;
1698
1699 if ((ret = preproc_lexer_parse(compile_info, &preprocessed, message_context)))
1700 return ret;
1701
1702 ret = hlsl_compile_shader(&preprocessed, compile_info, out, message_context);
1703
1704 vkd3d_shader_free_shader_code(&preprocessed);
1705 return ret;
1706}
return ret
Definition: mutex.c:147
int hlsl_compile_shader(const struct vkd3d_shader_code *hlsl, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
Definition: hlsl.c:4496
void vkd3d_shader_free_shader_code(struct vkd3d_shader_code *shader_code)
int preproc_lexer_parse(const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

Referenced by vkd3d_shader_compile().

◆ convert_descriptor_info()

static enum vkd3d_result convert_descriptor_info ( struct vkd3d_shader_scan_descriptor_info *  info,
const struct vkd3d_shader_scan_descriptor_info1 *  info1 
)
static

Definition at line 1467 of file vkd3d_shader_main.c.

1469{
1470 unsigned int i;
1471
1472 if (!(info->descriptors = vkd3d_calloc(info1->descriptor_count, sizeof(*info->descriptors))))
1474
1475 for (i = 0; i < info1->descriptor_count; ++i)
1476 {
1477 const struct vkd3d_shader_descriptor_info1 *src = &info1->descriptors[i];
1478 struct vkd3d_shader_descriptor_info *dst = &info->descriptors[i];
1479
1480 dst->type = src->type;
1481 dst->register_space = src->register_space;
1482 dst->register_index = src->register_index;
1483 dst->resource_type = src->resource_type;
1484 dst->resource_data_type = src->resource_data_type;
1485 dst->flags = src->flags;
1486 dst->count = src->count;
1487 }
1488 info->descriptor_count = info1->descriptor_count;
1489
1490 return VKD3D_OK;
1491}
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340
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
unsigned int count
Definition: notification.c:73
struct vkd3d_shader_descriptor_info1 * descriptors
static void * vkd3d_calloc(size_t count, size_t size)
Definition: vkd3d_memory.h:43
@ VKD3D_OK
Definition: vkd3d_types.h:43

Referenced by vsir_program_scan().

◆ fill_shader_dump_data()

static void fill_shader_dump_data ( const struct vkd3d_shader_compile_info *  compile_info,
struct shader_dump_data *  data 
)
static

Definition at line 544 of file vkd3d_shader_main.c.

546{
547 static bool enabled = true;
548
549 data->path = NULL;
550
551 if (!enabled)
552 return;
553
554 if (!(data->path = getenv("VKD3D_SHADER_DUMP_PATH")))
555 {
556 enabled = false;
557 return;
558 }
559
560 data->profile = NULL;
561 if (compile_info->source_type == VKD3D_SHADER_SOURCE_HLSL)
562 {
563 const struct vkd3d_shader_hlsl_source_info *hlsl_source_info;
564
565 if ((hlsl_source_info = vkd3d_find_struct(compile_info->next, HLSL_SOURCE_INFO)))
566 data->profile = hlsl_source_info->profile;
567 }
568
569 vkd3d_compute_md5(compile_info->source.code, compile_info->source.size,
570 (uint32_t *)data->checksum, VKD3D_MD5_STANDARD);
571 data->source_suffix = shader_get_source_type_suffix(compile_info->source_type);
572 data->target_suffix = shader_get_target_type_suffix(compile_info->target_type);
573}
#define NULL
Definition: types.h:112
UINT32 uint32_t
Definition: types.h:75
char *CDECL getenv(const char *name)
Definition: environ.c:227
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLenum GLenum GLsizei const GLuint GLboolean enabled
Definition: glext.h:7750
void vkd3d_compute_md5(const void *data, size_t size, uint32_t checksum[4], enum vkd3d_md5_variant variant)
Definition: checksum.c:305
struct vkd3d_shader_code source
enum vkd3d_shader_source_type source_type
enum vkd3d_shader_target_type target_type
@ VKD3D_SHADER_SOURCE_HLSL
static const char * shader_get_source_type_suffix(enum vkd3d_shader_source_type type)
static const char * shader_get_target_type_suffix(enum vkd3d_shader_target_type type)
#define vkd3d_find_struct(c, t)
@ VKD3D_MD5_STANDARD

Referenced by vkd3d_shader_compile(), and vkd3d_shader_scan().

◆ find_descriptor()

Definition at line 1057 of file vkd3d_shader_main.c.

1060{
1061 for (unsigned int i = 0; i < info->descriptor_count; ++i)
1062 {
1063 const struct vkd3d_shader_descriptor_info1 *d = &info->descriptors[i];
1064
1065 if (d->type == type && d->register_id == register_id)
1066 return d;
1067 }
1068
1069 return NULL;
1070}
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
#define d
Definition: ke_i.h:81

Referenced by vkd3d_shader_scan_combined_sampler_usage().

◆ init_scan_signature_info()

static void init_scan_signature_info ( const struct vkd3d_shader_compile_info *  info)
static

Definition at line 575 of file vkd3d_shader_main.c.

576{
577 struct vkd3d_shader_scan_signature_info *signature_info;
578
579 if ((signature_info = vkd3d_find_struct(info->next, SCAN_SIGNATURE_INFO)))
580 {
581 memset(&signature_info->input, 0, sizeof(signature_info->input));
582 memset(&signature_info->output, 0, sizeof(signature_info->output));
583 memset(&signature_info->patch_constant, 0, sizeof(signature_info->patch_constant));
584 }
585}
struct vkd3d_shader_signature patch_constant
struct vkd3d_shader_signature output
struct vkd3d_shader_signature input

Referenced by vkd3d_shader_compile(), and vkd3d_shader_scan().

◆ set_string()

void set_string ( struct vkd3d_bytecode_buffer *  buffer,
size_t  offset,
const char *  string,
size_t  length 
)

Definition at line 441 of file vkd3d_shader_main.c.

442{
444}
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
static void bytecode_set_bytes(struct vkd3d_bytecode_buffer *buffer, size_t offset, const void *value, size_t size)

◆ set_u32()

◆ shader_get_source_type_suffix()

static const char * shader_get_source_type_suffix ( enum vkd3d_shader_source_type  type)
static

Definition at line 500 of file vkd3d_shader_main.c.

501{
502 switch (type)
503 {
505 return "dxbc";
507 return "hlsl";
509 return "d3dbc";
511 return "dxil";
512 default:
513 FIXME("Unhandled source type %#x.\n", type);
514 return "bin";
515 }
516}
#define FIXME(fmt,...)
Definition: precomp.h:53
@ VKD3D_SHADER_SOURCE_DXBC_DXIL
@ VKD3D_SHADER_SOURCE_D3D_BYTECODE
@ VKD3D_SHADER_SOURCE_DXBC_TPF

Referenced by fill_shader_dump_data().

◆ shader_get_target_type_suffix()

static const char * shader_get_target_type_suffix ( enum vkd3d_shader_target_type  type)
static

Definition at line 518 of file vkd3d_shader_main.c.

519{
520 switch (type)
521 {
523 return "spv";
525 return "spv.s";
527 return "d3d.s";
529 return "d3dbc";
531 return "dxbc";
533 return "glsl";
535 return "fx";
537 return "msl";
538 default:
539 FIXME("Unhandled target type %#x.\n", type);
540 return "bin";
541 }
542}
@ VKD3D_SHADER_TARGET_SPIRV_BINARY
@ VKD3D_SHADER_TARGET_D3D_ASM
@ VKD3D_SHADER_TARGET_SPIRV_TEXT
@ VKD3D_SHADER_TARGET_DXBC_TPF
@ VKD3D_SHADER_TARGET_GLSL
@ VKD3D_SHADER_TARGET_MSL
@ VKD3D_SHADER_TARGET_D3D_BYTECODE
@ VKD3D_SHADER_TARGET_FX

Referenced by fill_shader_dump_data().

◆ shader_instruction_array_add_icb()

bool shader_instruction_array_add_icb ( struct vkd3d_shader_instruction_array *  instructions,
struct vkd3d_shader_immediate_constant_buffer *  icb 
)

Definition at line 2171 of file vkd3d_shader_main.c.

2173{
2174 if (!vkd3d_array_reserve((void **)&instructions->icbs, &instructions->icb_capacity, instructions->icb_count + 1,
2175 sizeof(*instructions->icbs)))
2176 return false;
2177 instructions->icbs[instructions->icb_count++] = icb;
2178 return true;
2179}
struct vkd3d_shader_immediate_constant_buffer ** icbs

Referenced by shader_sm4_read_shader_data(), and value_allocate_constant_array().

◆ shader_instruction_array_clone_dst_params()

static struct vkd3d_shader_dst_param * shader_instruction_array_clone_dst_params ( struct vkd3d_shader_instruction_array *  instructions,
const struct vkd3d_shader_dst_param *  params,
unsigned int  count 
)
static

Definition at line 2202 of file vkd3d_shader_main.c.

2205{
2206 struct vkd3d_shader_dst_param *dst_params;
2207 unsigned int i;
2208
2209 if (!(dst_params = shader_dst_param_allocator_get(&instructions->dst_params, count)))
2210 return NULL;
2211
2212 memcpy(dst_params, params, count * sizeof(*params));
2213 for (i = 0; i < count; ++i)
2214 {
2215 if (!shader_register_clone_relative_addresses(&dst_params[i].reg, instructions))
2216 return NULL;
2217 }
2218
2219 return dst_params;
2220}
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum const GLfloat * params
Definition: glext.h:5645
static int reg
Definition: i386-dis.c:1290
struct vkd3d_shader_param_allocator dst_params
static bool shader_register_clone_relative_addresses(struct vkd3d_shader_register *reg, struct vkd3d_shader_instruction_array *instructions)
static struct vkd3d_shader_dst_param * shader_dst_param_allocator_get(struct vkd3d_shader_param_allocator *allocator, unsigned int count)

Referenced by shader_instruction_array_clone_instruction().

◆ shader_instruction_array_clone_instruction()

bool shader_instruction_array_clone_instruction ( struct vkd3d_shader_instruction_array *  instructions,
unsigned int  dst,
unsigned int  src 
)

Definition at line 2244 of file vkd3d_shader_main.c.

2246{
2247 struct vkd3d_shader_instruction *ins = &instructions->elements[dst];
2248
2249 *ins = instructions->elements[src];
2250
2251 if (ins->dst_count && ins->dst && !(ins->dst = shader_instruction_array_clone_dst_params(instructions,
2252 ins->dst, ins->dst_count)))
2253 return false;
2254
2255 return !ins->src_count || !!(ins->src = shader_instruction_array_clone_src_params(instructions,
2256 ins->src, ins->src_count));
2257}
struct vkd3d_shader_instruction * elements
struct vkd3d_shader_src_param * src
struct vkd3d_shader_dst_param * dst
static struct vkd3d_shader_dst_param * shader_instruction_array_clone_dst_params(struct vkd3d_shader_instruction_array *instructions, const struct vkd3d_shader_dst_param *params, unsigned int count)
static struct vkd3d_shader_src_param * shader_instruction_array_clone_src_params(struct vkd3d_shader_instruction_array *instructions, const struct vkd3d_shader_src_param *params, unsigned int count)

Referenced by flattener_flatten_phases().

◆ shader_instruction_array_clone_src_params()

static struct vkd3d_shader_src_param * shader_instruction_array_clone_src_params ( struct vkd3d_shader_instruction_array *  instructions,
const struct vkd3d_shader_src_param *  params,
unsigned int  count 
)
static

Definition at line 2222 of file vkd3d_shader_main.c.

2225{
2226 struct vkd3d_shader_src_param *src_params;
2227 unsigned int i;
2228
2229 if (!(src_params = shader_src_param_allocator_get(&instructions->src_params, count)))
2230 return NULL;
2231
2232 memcpy(src_params, params, count * sizeof(*params));
2233 for (i = 0; i < count; ++i)
2234 {
2235 if (!shader_register_clone_relative_addresses(&src_params[i].reg, instructions))
2236 return NULL;
2237 }
2238
2239 return src_params;
2240}
struct vkd3d_shader_param_allocator src_params
static struct vkd3d_shader_src_param * shader_src_param_allocator_get(struct vkd3d_shader_param_allocator *allocator, unsigned int count)

Referenced by shader_instruction_array_clone_instruction(), and shader_register_clone_relative_addresses().

◆ shader_instruction_array_destroy()

void shader_instruction_array_destroy ( struct vkd3d_shader_instruction_array *  instructions)

Definition at line 2259 of file vkd3d_shader_main.c.

2260{
2261 unsigned int i;
2262
2263 vkd3d_free(instructions->elements);
2266 for (i = 0; i < instructions->icb_count; ++i)
2267 vkd3d_free(instructions->icbs[i]);
2268 vkd3d_free(instructions->icbs);
2269}
static void vkd3d_free(void *ptr)
Definition: vkd3d_memory.h:52
static void shader_param_allocator_destroy(struct vkd3d_shader_param_allocator *allocator)

Referenced by spirv_compiler_generate_spirv(), and vsir_program_cleanup().

◆ shader_instruction_array_init()

bool shader_instruction_array_init ( struct vkd3d_shader_instruction_array *  instructions,
unsigned int  reserve 
)

Definition at line 2132 of file vkd3d_shader_main.c.

2133{
2134 memset(instructions, 0, sizeof(*instructions));
2135 /* Size the parameter initial allocations so they are large enough for most shaders. The
2136 * code path for chained allocations will be tested if a few shaders need to use it. */
2138 sizeof(*instructions->elements->dst));
2139 shader_param_allocator_init(&instructions->src_params, reserve * 2u, sizeof(*instructions->elements->src));
2140 return shader_instruction_array_reserve(instructions, reserve);
2141}
static BOOL reserve(struct dynamic_array *array, int count, int itemsize)
Definition: mesh.c:5499
static void shader_param_allocator_init(struct vkd3d_shader_param_allocator *allocator, unsigned int count, unsigned int stride)
bool shader_instruction_array_reserve(struct vkd3d_shader_instruction_array *instructions, unsigned int reserve)

Referenced by vsir_program_init().

◆ shader_instruction_array_insert_at()

bool shader_instruction_array_insert_at ( struct vkd3d_shader_instruction_array *  instructions,
unsigned int  idx,
unsigned int  count 
)

Definition at line 2154 of file vkd3d_shader_main.c.

2156{
2157 VKD3D_ASSERT(idx <= instructions->count);
2158
2159 if (!shader_instruction_array_reserve(instructions, instructions->count + count))
2160 return false;
2161
2162 memmove(&instructions->elements[idx + count], &instructions->elements[idx],
2163 (instructions->count - idx) * sizeof(*instructions->elements));
2164 memset(&instructions->elements[idx], 0, count * sizeof(*instructions->elements));
2165
2166 instructions->count += count;
2167
2168 return true;
2169}
unsigned int idx
Definition: utils.c:40
#define memmove(s1, s2, n)
Definition: mkisofs.h:881

Referenced by insert_alpha_test_before_ret(), insert_clip_planes_before_ret(), insert_point_size_before_ret(), vsir_program_ensure_diffuse(), vsir_program_ensure_ret(), vsir_program_insert_point_coord(), vsir_program_insert_point_size_clamp(), vsir_program_lower_ifc(), vsir_program_lower_precise_mad(), vsir_program_lower_sm1_sincos(), vsir_program_lower_texkill(), and vsir_program_remap_output_signature().

◆ shader_instruction_array_reserve()

bool shader_instruction_array_reserve ( struct vkd3d_shader_instruction_array *  instructions,
unsigned int  reserve 
)

Definition at line 2143 of file vkd3d_shader_main.c.

2144{
2145 if (!vkd3d_array_reserve((void **)&instructions->elements, &instructions->capacity, reserve,
2146 sizeof(*instructions->elements)))
2147 {
2148 ERR("Failed to allocate instructions.\n");
2149 return false;
2150 }
2151 return true;
2152}
#define ERR(fmt,...)
Definition: precomp.h:57

Referenced by control_point_normaliser_emit_hs_input(), d3dbc_parse(), flattener_flatten_phases(), generate_vsir_add_program_instruction(), shader_instruction_array_init(), shader_instruction_array_insert_at(), sm1_generate_vsir_constant_defs(), sm1_generate_vsir_sampler_dcls(), sm6_parser_require_space(), tpf_parse(), and vsir_program_flatten_hull_shader_phases().

◆ shader_param_allocator_destroy()

static void shader_param_allocator_destroy ( struct vkd3d_shader_param_allocator *  allocator)
static

Definition at line 2094 of file vkd3d_shader_main.c.

2095{
2097
2098 while (current)
2099 {
2100 struct vkd3d_shader_param_node *next = current->next;
2102 current = next;
2103 }
2104}
struct task_struct * current
Definition: linux.c:32
static unsigned __int64 next
Definition: rand_nt.c:6

Referenced by shader_instruction_array_destroy().

◆ shader_param_allocator_get()

void * shader_param_allocator_get ( struct vkd3d_shader_param_allocator *  allocator,
unsigned int  count 
)

Definition at line 2106 of file vkd3d_shader_main.c.

2107{
2108 void *params;
2109
2110 if (!allocator->current || count > allocator->count - allocator->index)
2111 {
2113
2114 /* Monolithic switch has no definite parameter count limit. */
2115 allocator->count = max(allocator->count, count);
2116
2118 return NULL;
2119 if (allocator->current)
2120 allocator->current->next = next;
2121 else
2122 allocator->head = next;
2123 allocator->current = next;
2124 allocator->index = 0;
2125 }
2126
2127 params = &allocator->current->param[allocator->index * allocator->stride];
2128 allocator->index += count;
2129 return params;
2130}
#define max(a, b)
Definition: svc.c:63
static struct vkd3d_shader_param_node * shader_param_allocator_node_create(struct vkd3d_shader_param_allocator *allocator)

Referenced by shader_dst_param_allocator_get(), and shader_src_param_allocator_get().

◆ shader_param_allocator_init()

static void shader_param_allocator_init ( struct vkd3d_shader_param_allocator *  allocator,
unsigned int  count,
unsigned int  stride 
)
static

Definition at line 2084 of file vkd3d_shader_main.c.

2086{
2087 allocator->count = max(count, MAX_REG_OUTPUT);
2088 allocator->stride = stride;
2089 allocator->head = NULL;
2090 allocator->current = NULL;
2091 allocator->index = allocator->count;
2092}
GLsizei stride
Definition: glext.h:5848
#define MAX_REG_OUTPUT

Referenced by shader_instruction_array_init().

◆ shader_param_allocator_node_create()

static struct vkd3d_shader_param_node * shader_param_allocator_node_create ( struct vkd3d_shader_param_allocator *  allocator)
static

Definition at line 2073 of file vkd3d_shader_main.c.

2075{
2077
2078 if (!(node = vkd3d_malloc(offsetof(struct vkd3d_shader_param_node, param[allocator->count * allocator->stride]))))
2079 return NULL;
2080 node->next = NULL;
2081 return node;
2082}
GLfloat param
Definition: glext.h:5796
#define offsetof(TYPE, MEMBER)
Definition: dlist.c:348
void * next
Definition: dlist.c:360
static void * vkd3d_malloc(size_t size)
Definition: vkd3d_memory.h:28

Referenced by shader_param_allocator_get().

◆ shader_register_clone_relative_addresses()

static bool shader_register_clone_relative_addresses ( struct vkd3d_shader_register *  reg,
struct vkd3d_shader_instruction_array *  instructions 
)
static

Definition at line 2185 of file vkd3d_shader_main.c.

2187{
2188 unsigned int i;
2189
2190 for (i = 0; i < reg->idx_count; ++i)
2191 {
2192 if (!reg->idx[i].rel_addr)
2193 continue;
2194
2195 if (!(reg->idx[i].rel_addr = shader_instruction_array_clone_src_params(instructions, reg->idx[i].rel_addr, 1)))
2196 return false;
2197 }
2198
2199 return true;
2200}

Referenced by shader_instruction_array_clone_dst_params(), and shader_instruction_array_clone_src_params().

◆ shader_signature_cleanup()

void shader_signature_cleanup ( struct shader_signature *  signature)

Definition at line 1846 of file vkd3d_shader_main.c.

1847{
1848 for (unsigned int i = 0; i < signature->element_count; ++i)
1849 {
1850 vkd3d_free((void *)signature->elements[i].semantic_name);
1851 }
1852 vkd3d_free(signature->elements);
1853 signature->elements = NULL;
1854 signature->elements_capacity = 0;
1855 signature->element_count = 0;
1856}

Referenced by free_dxbc_shader_desc(), isgn_handler(), sm6_parser_init(), sm6_parser_read_signature(), spirv_compiler_destroy(), tpf_parse(), vkd3d_shader_parse_input_signature(), and vsir_program_cleanup().

◆ vkd3d_parse_integer()

uint32_t vkd3d_parse_integer ( const char *  s)

Definition at line 37 of file vkd3d_shader_main.c.

38{
39 uint32_t base = 10, ret = 0;
40 int digit;
41
42 if (*s == '0')
43 {
44 base = 8;
45 ++s;
46 if (*s == 'x' || *s == 'X')
47 {
48 base = 16;
49 ++s;
50 }
51 }
52
53 while ((digit = char_to_int(*s++)) >= 0)
54 ret = ret * base + (uint32_t)digit;
55 return ret;
56}
GLdouble s
Definition: gl.h:2039
#define uint32_t
Definition: nsiface.idl:61
static int char_to_int(char c)

◆ VKD3D_PRINTF_FUNC()

static void VKD3D_PRINTF_FUNC ( 3  ,
4   
)

Definition at line 616 of file vkd3d_shader_main.c.

618{
620
622 vkd3d_shader_verror(parser->message_context, &parser->location, error, format, args);
623 va_end(args);
624
625 parser->failed = true;
626}
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
char * va_list
Definition: vadefs.h:50
#define error(str)
Definition: mkdosfs.c:1605
#define args
Definition: format.c:66
Definition: match.c:390
Definition: import.c:81
void vkd3d_shader_verror(struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location, enum vkd3d_shader_error error, const char *format, va_list args)

◆ vkd3d_shader_build_varying_map()

void vkd3d_shader_build_varying_map ( const struct vkd3d_shader_signature *  output_signature,
const struct vkd3d_shader_signature *  input_signature,
unsigned int *  count,
struct vkd3d_shader_varying_map *  varyings 
)

Build a mapping of output varyings in a shader stage to input varyings in the following shader stage.

This mapping should be used in struct vkd3d_shader_varying_map_info to compile the first shader.

Parameters
output_signatureThe output signature of the first shader.
input_signatureThe input signature of the second shader.
countOn output, contains the number of entries written into "varyings".
varyingsPointer to an output array of varyings. This must point to space for N varyings, where N is the number of elements in the input signature.
Remarks
Valid legacy Direct3D pixel shaders have at most 12 varying inputs: 10 inter-stage varyings, face, and position. Therefore, in practice, it is safe to call this function with a pre-allocated array with a fixed size of 12.
Since
1.9

Definition at line 2271 of file vkd3d_shader_main.c.

2274{
2275 unsigned int count = 0;
2276 unsigned int i;
2277
2278 TRACE("output_signature %p, input_signature %p, ret_count %p, varyings %p.\n",
2279 output_signature, input_signature, ret_count, varyings);
2280
2281 for (i = 0; i < input_signature->element_count; ++i)
2282 {
2283 const struct vkd3d_shader_signature_element *input_element, *output_element;
2284
2285 input_element = &input_signature->elements[i];
2286
2287 if (input_element->sysval_semantic != VKD3D_SHADER_SV_NONE)
2288 continue;
2289
2290 varyings[count].input_register_index = input_element->register_index;
2291 varyings[count].input_mask = input_element->mask;
2292
2293 if ((output_element = vkd3d_shader_find_signature_element(output_signature,
2294 input_element->semantic_name, input_element->semantic_index, 0)))
2295 {
2296 varyings[count].output_signature_index = output_element - output_signature->elements;
2297 }
2298 else
2299 {
2300 varyings[count].output_signature_index = output_signature->element_count;
2301 }
2302
2303 ++count;
2304 }
2305
2306 *ret_count = count;
2307}
GLsizei const GLchar *const * varyings
Definition: glext.h:6214
#define TRACE(s)
Definition: solgame.cpp:4
enum vkd3d_shader_sysval_semantic sysval_semantic
struct vkd3d_shader_signature_element * elements
unsigned int element_count
@ VKD3D_SHADER_SV_NONE
struct vkd3d_shader_signature_element * vkd3d_shader_find_signature_element(const struct vkd3d_shader_signature *signature, const char *semantic_name, unsigned int semantic_index, unsigned int stream_index)

Referenced by shader_spirv_compile_arguments_init().

◆ vkd3d_shader_code_from_string_buffer()

void vkd3d_shader_code_from_string_buffer ( struct vkd3d_shader_code *  code,
struct vkd3d_string_buffer *  buffer 
)

Definition at line 235 of file vkd3d_shader_main.c.

236{
237 code->code = buffer->buffer;
238 code->size = buffer->content_size;
239
240 buffer->buffer = NULL;
241 buffer->buffer_size = 0;
242 buffer->content_size = 0;
243}
Definition: inflate.c:139

Referenced by d3d_asm_compile(), fx_parse(), and msl_generator_generate().

◆ vkd3d_shader_compile()

int vkd3d_shader_compile ( const struct vkd3d_shader_compile_info *  compile_info,
struct vkd3d_shader_code *  out,
char **  messages 
)

Transform a form of GPU shader source code or byte code into another form of source code or byte code.

This version of vkd3d-shader supports the following transformations:

  • VKD3D_SHADER_SOURCE_DXBC_TPF to VKD3D_SHADER_TARGET_SPIRV_BINARY
  • VKD3D_SHADER_SOURCE_DXBC_TPF to VKD3D_SHADER_TARGET_SPIRV_TEXT (if vkd3d was compiled with SPIRV-Tools)
  • VKD3D_SHADER_SOURCE_DXBC_TPF to VKD3D_SHADER_TARGET_D3D_ASM
  • VKD3D_SHADER_SOURCE_D3D_BYTECODE to VKD3D_SHADER_TARGET_SPIRV_BINARY
  • VKD3D_SHADER_SOURCE_D3D_BYTECODE to VKD3D_SHADER_TARGET_SPIRV_TEXT (if vkd3d was compiled with SPIRV-Tools)
  • VKD3D_SHADER_SOURCE_D3D_BYTECODE to VKD3D_SHADER_TARGET_D3D_ASM
  • VKD3D_SHADER_SOURCE_HLSL to VKD3D_SHADER_TARGET_SPIRV_BINARY
  • VKD3D_SHADER_SOURCE_HLSL to VKD3D_SHADER_TARGET_SPIRV_TEXT (if vkd3d was compiled with SPIRV-Tools)
  • VKD3D_SHADER_SOURCE_HLSL to VKD3D_SHADER_TARGET_D3D_ASM
  • VKD3D_SHADER_SOURCE_HLSL to VKD3D_SHADER_TARGET_D3D_BYTECODE
  • VKD3D_SHADER_SOURCE_HLSL to VKD3D_SHADER_TARGET_DXBC_TPF
  • VKD3D_SHADER_SOURCE_HLSL to VKD3D_SHADER_TARGET_FX
  • VKD3D_SHADER_SOURCE_FX to VKD3D_SHADER_TARGET_D3D_ASM

Supported transformations can also be detected at runtime with the functions vkd3d_shader_get_supported_source_types() and vkd3d_shader_get_supported_target_types().

Depending on the source and target types, this function may support the following chained structures:

Parameters
compile_infoA chained structure containing compilation parameters.
outA pointer to a vkd3d_shader_code structure in which the compiled code will be stored.
The compiled shader 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 compiler.
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.
The messages returned can be regulated with the log_level member of struct vkd3d_shader_compile_info. Regardless of the requested level, if this parameter is NULL, no compilation messages will be returned.
If no messages are produced by the compiler, this parameter may receive NULL instead of a valid string pointer.
Returns
A member of vkd3d_result.

Definition at line 1708 of file vkd3d_shader_main.c.

1710{
1711 struct vkd3d_shader_message_context message_context;
1712 struct shader_dump_data dump_data;
1713 int ret;
1714
1715 TRACE("compile_info %p, out %p, messages %p.\n", compile_info, out, messages);
1716
1717 if (messages)
1718 *messages = NULL;
1719
1720 if ((ret = vkd3d_shader_validate_compile_info(compile_info, true)) < 0)
1721 return ret;
1722
1723 init_scan_signature_info(compile_info);
1724
1725 vkd3d_shader_message_context_init(&message_context, compile_info->log_level);
1726
1727 fill_shader_dump_data(compile_info, &dump_data);
1728 vkd3d_shader_dump_shader(&dump_data, compile_info->source.code, compile_info->source.size, true);
1729
1730 if (compile_info->source_type == VKD3D_SHADER_SOURCE_HLSL)
1731 {
1732 ret = compile_hlsl(compile_info, out, &message_context);
1733 }
1734 else if (compile_info->source_type == VKD3D_SHADER_SOURCE_FX)
1735 {
1736 ret = fx_parse(compile_info, out, &message_context);
1737 }
1738 else
1739 {
1741 struct vsir_program program;
1742
1743 if (!(ret = vsir_parse(compile_info, config_flags, &message_context, &program)))
1744 {
1745 ret = vsir_program_compile(&program, config_flags, compile_info, out, &message_context);
1747 }
1748 }
1749
1750 if (ret >= 0)
1751 vkd3d_shader_dump_shader(&dump_data, out->code, out->size, false);
1752
1756 vkd3d_shader_message_context_cleanup(&message_context);
1757 return ret;
1758}
UINT64 uint64_t
Definition: types.h:77
int fx_parse(const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
Definition: fx.c:3789
GLuint program
Definition: glext.h:6723
void vsir_program_cleanup(struct vsir_program *program)
Definition: ir.c:105
enum vkd3d_shader_log_level log_level
@ VKD3D_SHADER_SOURCE_FX
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)
static void init_scan_signature_info(const struct vkd3d_shader_compile_info *info)
static int vkd3d_shader_validate_compile_info(const struct vkd3d_shader_compile_info *compile_info, bool validate_target_type)
static void fill_shader_dump_data(const struct vkd3d_shader_compile_info *compile_info, struct shader_dump_data *data)
void vkd3d_shader_message_context_init(struct vkd3d_shader_message_context *context, enum vkd3d_shader_log_level log_level)
static void vkd3d_shader_dump_shader(const struct shader_dump_data *dump_data, const void *data, size_t size, bool source)
static enum vkd3d_result vsir_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t config_flags, struct vkd3d_shader_message_context *message_context, struct vsir_program *program)
uint64_t vkd3d_shader_init_config_flags(void)
int vsir_program_compile(struct vsir_program *program, uint64_t config_flags, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
static int compile_hlsl(const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
#define vkd3d_shader_message_context_trace_messages(context)

Referenced by compile_hlsl_cs(), compile_hlsl_shader(), create_shader_stage(), D3DCompile2(), D3DDisassemble(), fx_4_parse_shader_initializer(), shader_glsl_generate_vkd3d_shader(), shader_spirv_compile_shader(), and shader_trace().

◆ vkd3d_shader_dump_shader()

static void vkd3d_shader_dump_shader ( const struct shader_dump_data *  dump_data,
const void *  data,
size_t  size,
bool  source 
)
static

Definition at line 455 of file vkd3d_shader_main.c.

457{
458 static const char hexadecimal_digits[] = "0123456789abcdef";
459 const uint8_t *checksum = dump_data->checksum;
460 char str_checksum[33];
461 unsigned int pos = 0;
462 char filename[1024];
463 unsigned int i;
464 FILE *f;
465
466 if (!dump_data->path)
467 return;
468
469 for (i = 0; i < ARRAY_SIZE(dump_data->checksum); ++i)
470 {
471 str_checksum[2 * i] = hexadecimal_digits[checksum[i] >> 4];
472 str_checksum[2 * i + 1] = hexadecimal_digits[checksum[i] & 0xf];
473 }
474 str_checksum[32] = '\0';
475
476 pos = snprintf(filename, ARRAY_SIZE(filename), "%s/vkd3d-shader-%s", dump_data->path, str_checksum);
477
478 if (dump_data->profile)
479 pos += snprintf(filename + pos, ARRAY_SIZE(filename) - pos, "-%s", dump_data->profile);
480
481 if (source)
482 pos += snprintf(filename + pos, ARRAY_SIZE(filename) - pos, "-source.%s", dump_data->source_suffix);
483 else
484 pos += snprintf(filename + pos, ARRAY_SIZE(filename) - pos, "-target.%s", dump_data->target_suffix);
485
486 TRACE("Dumping shader to \"%s\".\n", filename);
487 if ((f = fopen(filename, "wb")))
488 {
489 if (fwrite(data, 1, size, f) != size)
490 WARN("Failed to write shader to %s.\n", filename);
491 if (fclose(f))
492 WARN("Failed to close stream %s.\n", filename);
493 }
494 else
495 {
496 WARN("Failed to open %s for dumping shader.\n", filename);
497 }
498}
#define ARRAY_SIZE(A)
Definition: main.h:20
#define WARN(fmt,...)
Definition: precomp.h:61
static cab_ULONG checksum(const cab_UBYTE *data, cab_UWORD bytes, cab_ULONG csum)
Definition: fdi.c:353
int CDECL fclose(FILE *file)
Definition: file.c:3757
FILE *CDECL fopen(const char *path, const char *mode)
Definition: file.c:4310
size_t CDECL fwrite(const void *ptr, size_t size, size_t nmemb, FILE *file)
Definition: file.c:4129
unsigned char uint8_t
Definition: stdint.h:33
GLfloat f
Definition: glext.h:7540
const char * filename
Definition: ioapi.h:137
#define f
Definition: ke_i.h:83
const char * target_suffix
const char * source_suffix
const char * profile
#define snprintf
Definition: wintirpc.h:48

Referenced by vkd3d_shader_compile(), and vkd3d_shader_scan().

◆ vkd3d_shader_error()

Definition at line 360 of file vkd3d_shader_main.c.

◆ vkd3d_shader_find_signature_element()

struct vkd3d_shader_signature_element * vkd3d_shader_find_signature_element ( const struct vkd3d_shader_signature *  signature,
const char *  semantic_name,
unsigned int  semantic_index,
unsigned int  stream_index 
)

Find a single element of a parsed input signature.

Parameters
signatureThe parsed input signature. This structure is normally populated by vkd3d_shader_parse_input_signature().
semantic_nameSemantic name of the desired element. This function performs a case-insensitive comparison with respect to the ASCII plane.
semantic_indexSemantic index of the desired element.
stream_indexGeometry shader stream index of the desired element. If the signature is not a geometry shader output signature, this parameter must be set to 0.
Returns
A description of the element matching the requested parameters, or NULL if no such element was found. If not NULL, the return value points into the signature parameter and should not be explicitly freed.

Definition at line 1885 of file vkd3d_shader_main.c.

1888{
1890 unsigned int i;
1891
1892 TRACE("signature %p, semantic_name %s, semantic_index %u, stream_index %u.\n",
1894
1895 e = signature->elements;
1896 for (i = 0; i < signature->element_count; ++i)
1897 {
1901 return &e[i];
1902 }
1903
1904 return NULL;
1905}
#define e
Definition: ke_i.h:82
#define debugstr_a
Definition: kernel32.h:31
static int ascii_strcasecmp(const char *a, const char *b)
Definition: vkd3d_common.h:437

Referenced by d3d12_pipeline_state_init_graphics(), and vkd3d_shader_build_varying_map().

◆ vkd3d_shader_free_messages()

void vkd3d_shader_free_messages ( char *  messages)

Free shader messages allocated by another vkd3d-shader function, such as vkd3d_shader_compile().

Parameters
messagesMessages to free. This pointer is optional and may be NULL, in which case no action will be taken.

Definition at line 728 of file vkd3d_shader_main.c.

729{
730 TRACE("messages %p.\n", messages);
731
733}

Referenced by compile_hlsl_shader(), D3DCompile2(), D3DDisassemble(), preprocess_shader(), shader_glsl_generate_vkd3d_shader(), shader_spirv_compile_shader(), shader_spirv_scan_shader(), shader_trace(), vkd3d_serialize_root_signature(), and vkd3d_serialize_versioned_root_signature().

◆ vkd3d_shader_free_root_signature()

void vkd3d_shader_free_root_signature ( struct vkd3d_shader_versioned_root_signature_desc *  root_signature)

Free a structural representation of a shader root signature allocated by vkd3d_shader_convert_root_signature() or vkd3d_shader_parse_root_signature().

This function may free members of struct vkd3d_shader_versioned_root_signature_desc, but does not free the structure itself.

Parameters
root_signatureSignature description to free.

Definition at line 1825 of file vkd3d_shader_main.c.

1826{
1827 TRACE("desc %p.\n", desc);
1828
1830 {
1832 }
1833 else if (desc->version == VKD3D_SHADER_ROOT_SIGNATURE_VERSION_1_1)
1834 {
1836 }
1837 else if (desc->version)
1838 {
1839 FIXME("Unknown version %#x.\n", desc->version);
1840 return;
1841 }
1842
1843 desc->version = 0;
1844}
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683
@ VKD3D_SHADER_ROOT_SIGNATURE_VERSION_1_1
@ VKD3D_SHADER_ROOT_SIGNATURE_VERSION_1_0
static void vkd3d_shader_free_root_signature_v_1_1(struct vkd3d_shader_root_signature_desc1 *root_signature)
static void vkd3d_shader_free_root_signature_v_1_0(struct vkd3d_shader_root_signature_desc *root_signature)

Referenced by d3d12_root_signature_create(), d3d12_root_signature_deserializer_Release(), d3d12_versioned_root_signature_deserializer_Release(), vkd3d_parse_root_signature_v_1_0(), and vkd3d_shader_parse_root_signature().

◆ vkd3d_shader_free_root_signature_v_1_0()

static void vkd3d_shader_free_root_signature_v_1_0 ( struct vkd3d_shader_root_signature_desc *  root_signature)
static

Definition at line 1791 of file vkd3d_shader_main.c.

1792{
1793 unsigned int i;
1794
1795 for (i = 0; i < root_signature->parameter_count; ++i)
1796 {
1797 const struct vkd3d_shader_root_parameter *parameter = &root_signature->parameters[i];
1798
1800 vkd3d_free((void *)parameter->u.descriptor_table.descriptor_ranges);
1801 }
1802 vkd3d_free((void *)root_signature->parameters);
1803 vkd3d_free((void *)root_signature->static_samplers);
1804
1805 memset(root_signature, 0, sizeof(*root_signature));
1806}
union vkd3d_shader_root_parameter::@5987 u
enum vkd3d_shader_root_parameter_type parameter_type
struct vkd3d_shader_root_descriptor_table descriptor_table
const struct vkd3d_shader_root_parameter * parameters
const struct vkd3d_shader_static_sampler_desc * static_samplers
@ VKD3D_SHADER_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE

Referenced by vkd3d_shader_free_root_signature().

◆ vkd3d_shader_free_root_signature_v_1_1()

static void vkd3d_shader_free_root_signature_v_1_1 ( struct vkd3d_shader_root_signature_desc1 *  root_signature)
static

Definition at line 1808 of file vkd3d_shader_main.c.

1809{
1810 unsigned int i;
1811
1812 for (i = 0; i < root_signature->parameter_count; ++i)
1813 {
1814 const struct vkd3d_shader_root_parameter1 *parameter = &root_signature->parameters[i];
1815
1817 vkd3d_free((void *)parameter->u.descriptor_table.descriptor_ranges);
1818 }
1819 vkd3d_free((void *)root_signature->parameters);
1820 vkd3d_free((void *)root_signature->static_samplers);
1821
1822 memset(root_signature, 0, sizeof(*root_signature));
1823}
struct vkd3d_shader_root_descriptor_table1 descriptor_table
enum vkd3d_shader_root_parameter_type parameter_type
union vkd3d_shader_root_parameter1::@5988 u
const struct vkd3d_shader_static_sampler_desc * static_samplers
const struct vkd3d_shader_root_parameter1 * parameters

Referenced by vkd3d_shader_free_root_signature().

◆ vkd3d_shader_free_scan_combined_resource_sampler_info()

void vkd3d_shader_free_scan_combined_resource_sampler_info ( struct vkd3d_shader_scan_combined_resource_sampler_info *  info)

Free members of struct vkd3d_shader_scan_combined_resource_sampler_info allocated by vkd3d_shader_scan().

This function may free members of vkd3d_shader_scan_combined_resource_sampler_info, but does not free the structure itself.

Parameters
infoCombined resource-sampler information to free.
Since
1.10

Definition at line 1760 of file vkd3d_shader_main.c.

1762{
1763 TRACE("info %p.\n", info);
1764
1765 vkd3d_free(info->combined_samplers);
1766}

Referenced by vsir_program_compile(), and vsir_program_scan().

◆ vkd3d_shader_free_scan_descriptor_info()

void vkd3d_shader_free_scan_descriptor_info ( struct vkd3d_shader_scan_descriptor_info *  scan_descriptor_info)

Free members of struct vkd3d_shader_scan_descriptor_info() allocated by vkd3d_shader_scan().

This function may free members of vkd3d_shader_scan_descriptor_info, but does not free the structure itself.

Parameters
scan_descriptor_infoDescriptor information to free.

Definition at line 1768 of file vkd3d_shader_main.c.

1769{
1770 TRACE("scan_descriptor_info %p.\n", scan_descriptor_info);
1771
1772 vkd3d_free(scan_descriptor_info->descriptors);
1773}
struct vkd3d_shader_descriptor_info * descriptors

Referenced by d3d12_pipeline_state_find_and_init_uav_counters(), shader_spirv_destroy(), shader_spirv_destroy_compute_vk(), and vsir_program_scan().

◆ vkd3d_shader_free_scan_descriptor_info1()

static void vkd3d_shader_free_scan_descriptor_info1 ( struct vkd3d_shader_scan_descriptor_info1 *  scan_descriptor_info)
static

Definition at line 1493 of file vkd3d_shader_main.c.

1494{
1495 TRACE("scan_descriptor_info %p.\n", scan_descriptor_info);
1496
1497 vkd3d_free(scan_descriptor_info->descriptors);
1498}

Referenced by vsir_program_compile(), and vsir_program_scan().

◆ vkd3d_shader_free_scan_signature_info()

void vkd3d_shader_free_scan_signature_info ( struct vkd3d_shader_scan_signature_info *  info)

Free members of struct vkd3d_shader_scan_signature_info allocated by vkd3d_shader_scan().

This function may free members of vkd3d_shader_scan_signature_info, but does not free the structure itself.

Parameters
infoScan information to free.
Since
1.9

Definition at line 1775 of file vkd3d_shader_main.c.

1776{
1777 TRACE("info %p.\n", info);
1778
1781 vkd3d_shader_free_shader_signature(&info->patch_constant);
1782}
void vkd3d_shader_free_shader_signature(struct vkd3d_shader_signature *signature)

Referenced by shader_spirv_destroy(), and vsir_program_scan().

◆ vkd3d_shader_free_shader_code()

◆ vkd3d_shader_free_shader_signature()

void vkd3d_shader_free_shader_signature ( struct vkd3d_shader_signature *  signature)

Free a structural representation of a shader input signature allocated by vkd3d_shader_parse_input_signature().

This function may free members of struct vkd3d_shader_signature, but does not free the structure itself.

Parameters
signatureSignature description to free.

Definition at line 1907 of file vkd3d_shader_main.c.

1908{
1909 TRACE("signature %p.\n", signature);
1910
1911 for (unsigned int i = 0; i < signature->element_count; ++i)
1912 {
1913 vkd3d_free((void *)signature->elements[i].semantic_name);
1914 }
1915 vkd3d_free(signature->elements);
1916 signature->elements = NULL;
1917}

Referenced by d3d11_input_layout_to_wined3d_declaration(), d3d12_pipeline_state_init_graphics(), and vkd3d_shader_free_scan_signature_info().

◆ vkd3d_shader_get_supported_source_types()

enum vkd3d_shader_source_type * vkd3d_shader_get_supported_source_types ( unsigned int *  count)

Returns the source types supported, with any target type, by vkd3d_shader_compile(). Future versions of the library may introduce additional source types; callers should ignore unrecognised source types.

Use vkd3d_shader_get_supported_target_types() to determine which target types are supported for each source type.

Parameters
countOutput location for the size, in elements, of the returned array.
Returns
Pointer to an array of source types supported by this version of vkd3d-shader. This array may be a pointer to static data in libvkd3d-shader; it should not be freed.

Definition at line 1937 of file vkd3d_shader_main.c.

1938{
1939 static const enum vkd3d_shader_source_type types[] =
1940 {
1944#ifdef VKD3D_SHADER_UNSUPPORTED_DXIL
1946#endif
1948 };
1949
1950 TRACE("count %p.\n", count);
1951
1953 return types;
1954}
Definition: cmds.c:130
vkd3d_shader_source_type

Referenced by vkd3d_shader_validate_compile_info().

◆ vkd3d_shader_get_supported_target_types()

enum vkd3d_shader_target_type * vkd3d_shader_get_supported_target_types ( enum vkd3d_shader_source_type  source_type,
unsigned int *  count 
)

Returns the target types supported, with the given source type, by vkd3d_shader_compile(). Future versions of the library may introduce additional target types; callers should ignore unrecognised target types.

Parameters
source_typeSource type for which to enumerate supported target types.
countOutput location for the size, in elements, of the returned array.
Returns
Pointer to an array of target types supported by this version of vkd3d-shader. This array may be a pointer to static data in libvkd3d-shader; it should not be freed.

Definition at line 1956 of file vkd3d_shader_main.c.

1958{
1959 static const enum vkd3d_shader_target_type dxbc_tpf_types[] =
1960 {
1962#ifdef HAVE_SPIRV_TOOLS
1964#endif
1966#ifdef VKD3D_SHADER_UNSUPPORTED_GLSL
1968#endif
1969#ifdef VKD3D_SHADER_UNSUPPORTED_MSL
1971#endif
1972 };
1973
1974 static const enum vkd3d_shader_target_type hlsl_types[] =
1975 {
1977#ifdef HAVE_SPIRV_TOOLS
1979#endif
1984 };
1985
1986 static const enum vkd3d_shader_target_type d3dbc_types[] =
1987 {
1989#ifdef HAVE_SPIRV_TOOLS
1991#endif
1993 };
1994
1995#ifdef VKD3D_SHADER_UNSUPPORTED_DXIL
1996 static const enum vkd3d_shader_target_type dxbc_dxil_types[] =
1997 {
1999# ifdef HAVE_SPIRV_TOOLS
2001# endif
2003 };
2004#endif
2005
2006 static const enum vkd3d_shader_target_type fx_types[] =
2007 {
2009 };
2010
2011 TRACE("source_type %#x, count %p.\n", source_type, count);
2012
2013 switch (source_type)
2014 {
2016 *count = ARRAY_SIZE(dxbc_tpf_types);
2017 return dxbc_tpf_types;
2018
2020 *count = ARRAY_SIZE(hlsl_types);
2021 return hlsl_types;
2022
2024 *count = ARRAY_SIZE(d3dbc_types);
2025 return d3dbc_types;
2026
2027#ifdef VKD3D_SHADER_UNSUPPORTED_DXIL
2029 *count = ARRAY_SIZE(dxbc_dxil_types);
2030 return dxbc_dxil_types;
2031#endif
2032
2034 *count = ARRAY_SIZE(fx_types);
2035 return fx_types;
2036
2037 default:
2038 *count = 0;
2039 return NULL;
2040 }
2041}
vkd3d_shader_target_type

Referenced by vkd3d_shader_validate_compile_info().

◆ vkd3d_shader_get_version()

const char * vkd3d_shader_get_version ( unsigned int *  major,
unsigned int *  minor 
)

Returns the current version of this library.

Parameters
majorOutput location for the major version of this library.
minorOutput location for the minor version of this library.
Returns
A human-readable string describing the library name and version. This string is null-terminated and UTF-8 encoded. This may be a pointer to static data in libvkd3d-shader; it should not be freed.

Definition at line 1919 of file vkd3d_shader_main.c.

1920{
1921 int x, y;
1922
1923 TRACE("major %p, minor %p.\n", major, minor);
1924
1925 if (major || minor)
1926 {
1928 if (major)
1929 *major = x;
1930 if (minor)
1931 *minor = y;
1932 }
1933
1934 return "vkd3d-shader " PACKAGE_VERSION VKD3D_VCS_ID;
1935}
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define minor(rdev)
Definition: propsheet.cpp:929
#define major(rdev)
Definition: propsheet.cpp:928
static void vkd3d_parse_version(const char *version, int *major, int *minor)
Definition: vkd3d_common.h:678
#define VKD3D_VCS_ID
Definition: vkd3d_version.h:1

Referenced by msl_generator_generate(), shader_glsl_alloc(), vkd3d_glsl_generator_generate(), wined3d_spirv_shader_backend_init_vk(), write_sm1_uniforms(), and write_sm4_rdef().

◆ vkd3d_shader_init_config_flags()

uint64_t vkd3d_shader_init_config_flags ( void  )

Definition at line 592 of file vkd3d_shader_main.c.

593{
594 uint64_t config_flags;
595 const char *config;
596
597 config = getenv("VKD3D_SHADER_CONFIG");
599
600 if (config_flags)
601 TRACE("VKD3D_SHADER_CONFIG='%s'.\n", config);
602
603 return config_flags;
604}
struct config_s config
uint64_t vkd3d_parse_debug_options(const char *string, const struct vkd3d_debug_option *options, unsigned int option_count)
Definition: debug.c:370
static const struct vkd3d_debug_option vkd3d_shader_config_options[]

Referenced by hlsl_compile_shader(), hlsl_emit_bytecode(), vkd3d_shader_compile(), and vkd3d_shader_scan().

◆ vkd3d_shader_instruction_is_uav_atomic_op()

static bool vkd3d_shader_instruction_is_uav_atomic_op ( const struct vkd3d_shader_instruction *  instruction)
static

Definition at line 976 of file vkd3d_shader_main.c.

977{
979
980 return (VKD3DSIH_ATOMIC_AND <= opcode && opcode <= VKD3DSIH_ATOMIC_XOR)
981 || (VKD3DSIH_IMM_ATOMIC_ALLOC <= opcode && opcode <= VKD3DSIH_IMM_ATOMIC_XOR);
982}
vkd3d_shader_opcode
@ VKD3DSIH_IMM_ATOMIC_XOR
@ VKD3DSIH_ATOMIC_XOR
@ VKD3DSIH_ATOMIC_AND
@ VKD3DSIH_IMM_ATOMIC_ALLOC

Referenced by vkd3d_shader_scan_instruction().

◆ vkd3d_shader_instruction_is_uav_counter()

static bool vkd3d_shader_instruction_is_uav_counter ( const struct vkd3d_shader_instruction *  instruction)
static

Definition at line 963 of file vkd3d_shader_main.c.

964{
966
967 return opcode == VKD3DSIH_IMM_ATOMIC_ALLOC || opcode == VKD3DSIH_IMM_ATOMIC_CONSUME;
968}
@ VKD3DSIH_IMM_ATOMIC_CONSUME

Referenced by vkd3d_shader_scan_instruction().

◆ vkd3d_shader_instruction_is_uav_read()

static bool vkd3d_shader_instruction_is_uav_read ( const struct vkd3d_shader_instruction *  instruction)
static

Definition at line 946 of file vkd3d_shader_main.c.

947{
949
950 return (VKD3DSIH_ATOMIC_AND <= opcode && opcode <= VKD3DSIH_ATOMIC_XOR)
951 || (VKD3DSIH_IMM_ATOMIC_ALLOC <= opcode && opcode <= VKD3DSIH_IMM_ATOMIC_XOR)
952 || opcode == VKD3DSIH_LD_UAV_TYPED
953 || (opcode == VKD3DSIH_LD_RAW && instruction->src[1].reg.type == VKD3DSPR_UAV)
954 || (opcode == VKD3DSIH_LD_STRUCTURED && instruction->src[2].reg.type == VKD3DSPR_UAV);
955}
struct shader_reg * src
@ VKD3DSPR_UAV
@ VKD3DSIH_LD_UAV_TYPED
@ VKD3DSIH_LD_STRUCTURED
@ VKD3DSIH_LD_RAW

Referenced by vkd3d_shader_scan_instruction().

◆ vkd3d_shader_message_context_cleanup()

◆ vkd3d_shader_message_context_copy_messages()

bool vkd3d_shader_message_context_copy_messages ( struct vkd3d_shader_message_context *  context,
char **  out 
)

Definition at line 263 of file vkd3d_shader_main.c.

264{
265 char *messages;
266
267 if (!out)
268 return true;
269
270 *out = NULL;
271
272 if (!context->messages.content_size)
273 return true;
274
275 if (!(messages = vkd3d_malloc(context->messages.content_size + 1)))
276 return false;
277 memcpy(messages, context->messages.buffer, context->messages.content_size + 1);
278 *out = messages;
279 return true;
280}

Referenced by vkd3d_shader_compile(), vkd3d_shader_parse_dxbc(), vkd3d_shader_parse_input_signature(), vkd3d_shader_parse_root_signature(), vkd3d_shader_preprocess(), vkd3d_shader_scan(), and vkd3d_shader_serialize_root_signature().

◆ vkd3d_shader_message_context_init()

void vkd3d_shader_message_context_init ( struct vkd3d_shader_message_context *  context,
enum vkd3d_shader_log_level  log_level 
)

◆ vkd3d_shader_message_context_trace_messages_()

void vkd3d_shader_message_context_trace_messages_ ( const struct vkd3d_shader_message_context *  context,
const char *  function 
)

Definition at line 257 of file vkd3d_shader_main.c.

259{
260 vkd3d_string_buffer_trace_(&context->messages, function);
261}
void vkd3d_string_buffer_trace_(const struct vkd3d_string_buffer *buffer, const char *function)

◆ vkd3d_shader_parse_input_signature()

int vkd3d_shader_parse_input_signature ( const struct vkd3d_shader_code *  dxbc,
struct vkd3d_shader_signature *  signature,
char **  messages 
)

Read the input signature of a compiled DXBC shader, returning a structural description which can be easily parsed by C code.

This function parses a compiled shader. To parse a standalone root signature, use vkd3d_shader_parse_root_signature().

This function only parses DXBC shaders, and only retrieves the input signature. To retrieve signatures from other shader types, or other signature types, use vkd3d_shader_scan() and struct vkd3d_shader_scan_signature_info. This function returns the same input signature that is returned in struct vkd3d_shader_scan_signature_info.

Parameters
dxbcCompiled byte code, in DXBC format.
signatureOutput location in which the parsed root signature will be stored.
Members of signature may be allocated by vkd3d-shader. The signature should be freed with vkd3d_shader_free_shader_signature() when no longer needed.
The signature may contain pointers into the input shader, and should only be accessed while the input shader remains valid.
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 1858 of file vkd3d_shader_main.c.

1860{
1861 struct vkd3d_shader_message_context message_context;
1863 int ret;
1864
1865 TRACE("dxbc {%p, %zu}, signature %p, messages %p.\n", dxbc->code, dxbc->size, signature, messages);
1866
1867 if (messages)
1868 *messages = NULL;
1870
1871 ret = shader_parse_input_signature(dxbc, &message_context, &shader_signature);
1875
1876 vkd3d_shader_message_context_cleanup(&message_context);
1877
1880
1882 return ret;
1883}
int shader_parse_input_signature(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_message_context *message_context, struct shader_signature *signature)
Definition: dxbc.c:493
@ VKD3D_SHADER_LOG_INFO
static bool vkd3d_shader_signature_from_shader_signature(struct vkd3d_shader_signature *signature, const struct shader_signature *src)
void shader_signature_cleanup(struct shader_signature *signature)

Referenced by d3d11_input_layout_to_wined3d_declaration(), and d3d12_pipeline_state_init_graphics().

◆ vkd3d_shader_parser_init()

void vkd3d_shader_parser_init ( struct vkd3d_shader_parser *  parser,
struct vsir_program *  program,
struct vkd3d_shader_message_context *  message_context,
const char *  source_name 
)

Definition at line 606 of file vkd3d_shader_main.c.

608{
609 parser->message_context = message_context;
610 parser->location.source_name = source_name;
611 parser->location.line = 1;
612 parser->location.column = 0;
613 parser->program = program;
614}
PINFCACHELINE line
Definition: inffile.c:95

Referenced by shader_sm1_init(), shader_sm4_init(), and sm6_parser_init().

◆ vkd3d_shader_preprocess()

int vkd3d_shader_preprocess ( const struct vkd3d_shader_compile_info *  compile_info,
struct vkd3d_shader_code *  out,
char **  messages 
)

Preprocess the given source code.

This function supports the following chained structures:

Parameters
compile_infoA chained structure containing compilation parameters.
outA pointer to a vkd3d_shader_code structure in which the preprocessed code will be stored.
The preprocessed shader 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 preprocessor.
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.
The messages returned can be regulated with the log_level member of struct vkd3d_shader_compile_info. Regardless of the requested level, if this parameter is NULL, no compilation messages will be returned.
If no messages are produced by the preprocessor, this parameter may receive NULL instead of a valid string pointer.
Returns
A member of vkd3d_result.
Since
1.3

Definition at line 2043 of file vkd3d_shader_main.c.

2045{
2046 struct vkd3d_shader_message_context message_context;
2047 int ret;
2048
2049 TRACE("compile_info %p, out %p, messages %p.\n", compile_info, out, messages);
2050
2051 if (messages)
2052 *messages = NULL;
2053
2054 if ((ret = vkd3d_shader_validate_compile_info(compile_info, false)) < 0)
2055 return ret;
2056
2057 vkd3d_shader_message_context_init(&message_context, compile_info->log_level);
2058
2059 ret = preproc_lexer_parse(compile_info, out, &message_context);
2060
2064 vkd3d_shader_message_context_cleanup(&message_context);
2065 return ret;
2066}

Referenced by preprocess_shader().

◆ vkd3d_shader_scan()

int vkd3d_shader_scan ( const struct vkd3d_shader_compile_info *  compile_info,
char **  messages 
)

Parse shader source code or byte code, returning various types of requested information.

The source_type member of compile_info must be set to the type of the shader.

The target_type member may be set to VKD3D_SHADER_TARGET_NONE, in which case vkd3d_shader_scan() will return information about the shader in isolation. Alternatively, it may be set to a valid compilation target for the shader, in which case vkd3d_shader_scan() will return information that reflects the interface for a shader as it will be compiled to that target. In this case other chained structures may be appended to compile_info as they would be passed to vkd3d_shader_compile(), and interpreted accordingly, such as vkd3d_shader_spirv_target_info.

(For a hypothetical example, suppose the source shader distinguishes float and integer texture data, but the target environment does not support integer textures. In this case vkd3d_shader_compile() might translate integer operations to float. Accordingly using VKD3D_SHADER_TARGET_NONE would accurately report whether the texture expects integer or float data, but using the relevant specific target type would report VKD3D_SHADER_RESOURCE_DATA_FLOAT.)

Currently this function supports the following code types:

  • VKD3D_SHADER_SOURCE_DXBC_TPF
  • VKD3D_SHADER_SOURCE_D3D_BYTECODE
Parameters
compile_infoA chained structure containing scan parameters.
The scanner supports the following chained structures:
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.
The messages returned can be regulated with the log_level member of struct vkd3d_shader_compile_info. Regardless of the requested level, if this parameter is NULL, no compilation messages will be returned.
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 1595 of file vkd3d_shader_main.c.

1596{
1597 struct vkd3d_shader_message_context message_context;
1598 struct shader_dump_data dump_data;
1599 int ret;
1600
1601 TRACE("compile_info %p, messages %p.\n", compile_info, messages);
1602
1603 if (messages)
1604 *messages = NULL;
1605
1606 if ((ret = vkd3d_shader_validate_compile_info(compile_info, false)) < 0)
1607 return ret;
1608
1609 init_scan_signature_info(compile_info);
1610
1611 vkd3d_shader_message_context_init(&message_context, compile_info->log_level);
1612
1613 fill_shader_dump_data(compile_info, &dump_data);
1614 vkd3d_shader_dump_shader(&dump_data, compile_info->source.code, compile_info->source.size, true);
1615
1616 if (compile_info->source_type == VKD3D_SHADER_SOURCE_HLSL)
1617 {
1618 FIXME("HLSL support not implemented.\n");
1620 }
1621 else
1622 {
1624 struct vsir_program program;
1625
1626 if (!(ret = vsir_parse(compile_info, config_flags, &message_context, &program)))
1627 {
1628 ret = vsir_program_scan(&program, compile_info, &message_context, NULL);
1630 }
1631 }
1632
1636 vkd3d_shader_message_context_cleanup(&message_context);
1637 return ret;
1638}
static int vsir_program_scan(struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_message_context *message_context, struct vkd3d_shader_scan_descriptor_info1 *descriptor_info1)
@ VKD3D_ERROR_NOT_IMPLEMENTED
Definition: vkd3d_types.h:55

Referenced by shader_spirv_scan_shader(), and vkd3d_scan_dxbc().

◆ vkd3d_shader_scan_add_descriptor()

Definition at line 990 of file vkd3d_shader_main.c.

994{
995 struct vkd3d_shader_scan_descriptor_info1 *info = context->scan_descriptor_info;
997
998 if (!info)
999 return NULL;
1000
1001 if (!vkd3d_array_reserve((void **)&info->descriptors, &context->descriptors_size,
1002 info->descriptor_count + 1, sizeof(*info->descriptors)))
1003 {
1004 ERR("Failed to allocate descriptor info.\n");
1005 return NULL;
1006 }
1007
1008 d = &info->descriptors[info->descriptor_count];
1009 memset(d, 0, sizeof(*d));
1010 d->type = type;
1011 d->register_id = reg->idx[0].offset;
1012 d->register_space = range->space;
1013 d->register_index = range->first;
1014 d->resource_type = resource_type;
1015 d->resource_data_type = resource_data_type;
1016 d->count = (range->last == ~0u) ? ~0u : range->last - range->first + 1;
1017 ++info->descriptor_count;
1018
1019 return d;
1020}
range
Definition: d3dx9_private.h:58
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
enum vkd3d_shader_resource_data_type resource_data_type
enum vkd3d_shader_resource_type resource_type

Referenced by vkd3d_shader_scan_combined_sampler_declaration(), vkd3d_shader_scan_constant_buffer_declaration(), vkd3d_shader_scan_resource_declaration(), vkd3d_shader_scan_sampler_declaration(), and vsir_program_scan().

◆ vkd3d_shader_scan_add_uav_flag()

static void vkd3d_shader_scan_add_uav_flag ( const struct vkd3d_shader_scan_context *  context,
const struct vkd3d_shader_register *  reg,
uint32_t  flag 
)
static

Definition at line 926 of file vkd3d_shader_main.c.

928{
929 unsigned int range_id = reg->idx[0].offset;
930 unsigned int i;
931
932 if (!context->scan_descriptor_info)
933 return;
934
935 for (i = 0; i < context->scan_descriptor_info->descriptor_count; ++i)
936 {
937 if (context->scan_descriptor_info->descriptors[i].type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV
938 && context->scan_descriptor_info->descriptors[i].register_id == range_id)
939 {
940 context->scan_descriptor_info->descriptors[i].flags |= flag;
941 break;
942 }
943 }
944}
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 flag
Definition: glfuncs.h:52
@ VKD3D_SHADER_DESCRIPTOR_TYPE_UAV
Definition: vkd3d_shader.h:430

Referenced by vkd3d_shader_scan_record_uav_atomic_op(), vkd3d_shader_scan_record_uav_counter(), and vkd3d_shader_scan_record_uav_read().

◆ vkd3d_shader_scan_combined_sampler_declaration()

static void vkd3d_shader_scan_combined_sampler_declaration ( struct vkd3d_shader_scan_context *  context,
const struct vkd3d_shader_semantic *  semantic 
)
static

Definition at line 1048 of file vkd3d_shader_main.c.

1050{
1054 &semantic->resource.range, semantic->resource_type, VKD3D_SHADER_RESOURCE_DATA_FLOAT);
1055}
enum vkd3d_shader_resource_type resource_type
struct vkd3d_shader_resource resource
@ VKD3D_SHADER_RESOURCE_DATA_UINT
@ VKD3D_SHADER_RESOURCE_DATA_FLOAT
@ VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER
Definition: vkd3d_shader.h:440
@ VKD3D_SHADER_DESCRIPTOR_TYPE_SRV
Definition: vkd3d_shader.h:425
@ VKD3D_SHADER_RESOURCE_NONE
static struct vkd3d_shader_descriptor_info1 * vkd3d_shader_scan_add_descriptor(struct vkd3d_shader_scan_context *context, enum vkd3d_shader_descriptor_type type, const struct vkd3d_shader_register *reg, const struct vkd3d_shader_register_range *range, enum vkd3d_shader_resource_type resource_type, enum vkd3d_shader_resource_data_type resource_data_type)

Referenced by vkd3d_shader_scan_instruction().

◆ vkd3d_shader_scan_combined_sampler_usage()

static void vkd3d_shader_scan_combined_sampler_usage ( struct vkd3d_shader_scan_context *  context,
const struct vkd3d_shader_register *  resource,
const struct vkd3d_shader_register *  sampler 
)
static

Definition at line 1072 of file vkd3d_shader_main.c.

1074{
1077 unsigned resource_space = 0, sampler_space = 0;
1078 unsigned int resource_idx, sampler_idx, i;
1079
1080 if (!(info = context->combined_sampler_info))
1081 return;
1082
1083 if (resource->type == VKD3DSPR_RESOURCE)
1084 resource_idx = resource->idx[1].offset;
1085 else
1086 resource_idx = resource->idx[0].offset;
1087
1088 if (!sampler)
1090 else if (sampler->type == VKD3DSPR_SAMPLER)
1091 sampler_idx = sampler->idx[1].offset;
1092 else
1093 sampler_idx = sampler->idx[0].offset;
1094
1095 if (vkd3d_shader_ver_ge(context->version, 5, 1))
1096 {
1097 const struct vkd3d_shader_descriptor_info1 *d;
1098 bool dynamic_resource, dynamic_sampler;
1099
1100 if ((dynamic_resource = resource->idx[1].rel_addr))
1102 "Resource descriptor array %u is being dynamically indexed, "
1103 "not recording a combined resource-sampler pair.", resource->idx[0].offset);
1104 if ((dynamic_sampler = sampler && sampler->idx[1].rel_addr))
1106 "Sampler descriptor array %u is being dynamically indexed, "
1107 "not recording a combined resource-sampler pair.", sampler->idx[0].offset);
1108 if (dynamic_resource || dynamic_sampler)
1109 return;
1110
1111 if ((d = find_descriptor(context->scan_descriptor_info,
1113 resource_space = d->register_space;
1114
1115 if (sampler && (d = find_descriptor(context->scan_descriptor_info,
1117 sampler_space = d->register_space;
1118 }
1119
1120 for (i = 0; i < info->combined_sampler_count; ++i)
1121 {
1122 s = &info->combined_samplers[i];
1123 if (s->resource_space == resource_space && s->resource_index == resource_idx
1124 && s->sampler_space == sampler_space && s->sampler_index == sampler_idx)
1125 return;
1126 }
1127
1128 if (!vkd3d_array_reserve((void **)&info->combined_samplers, &context->combined_samplers_size,
1129 info->combined_sampler_count + 1, sizeof(*info->combined_samplers)))
1130 {
1131 ERR("Failed to allocate combined sampler info.\n");
1132 return;
1133 }
1134
1135 s = &info->combined_samplers[info->combined_sampler_count++];
1136 s->resource_space = resource_space;
1137 s->resource_index = resource_idx;
1138 s->sampler_space = sampler_space;
1139 s->sampler_index = sampler_idx;
1140}
GLuint sampler
Definition: glext.h:7283
#define VKD3D_SHADER_DUMMY_SAMPLER_INDEX
Definition: vkd3d_shader.h:964
static const struct vkd3d_shader_descriptor_info1 * find_descriptor(const struct vkd3d_shader_scan_descriptor_info1 *info, enum vkd3d_shader_descriptor_type type, unsigned int register_id)
static bool vkd3d_shader_ver_ge(const struct vkd3d_shader_version *v, unsigned int major, unsigned int minor)
@ VKD3DSPR_RESOURCE
@ VKD3DSPR_SAMPLER
@ VKD3D_SHADER_WARNING_VSIR_DYNAMIC_DESCRIPTOR_ARRAY

Referenced by vkd3d_shader_scan_instruction().

◆ vkd3d_shader_scan_constant_buffer_declaration()

static void vkd3d_shader_scan_constant_buffer_declaration ( struct vkd3d_shader_scan_context *  context,
const struct vkd3d_shader_instruction *  instruction 
)
static

Definition at line 1022 of file vkd3d_shader_main.c.

1024{
1025 const struct vkd3d_shader_constant_buffer *cb = &instruction->declaration.cb;
1027
1030 return;
1031 d->buffer_size = cb->size;
1032}
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
@ VKD3D_SHADER_DESCRIPTOR_TYPE_CBV
Definition: vkd3d_shader.h:435
@ VKD3D_SHADER_RESOURCE_BUFFER

Referenced by vkd3d_shader_scan_instruction().

◆ vkd3d_shader_scan_context_cleanup()

static void vkd3d_shader_scan_context_cleanup ( struct vkd3d_shader_scan_context *  context)
static

Definition at line 857 of file vkd3d_shader_main.c.

858{
859 vkd3d_free(context->cf_info);
860}

Referenced by vsir_program_scan().

◆ vkd3d_shader_scan_context_init()

static void vkd3d_shader_scan_context_init ( struct vkd3d_shader_scan_context *  context,
const struct vkd3d_shader_version *  version,
const struct vkd3d_shader_compile_info *  compile_info,
struct vkd3d_shader_scan_descriptor_info1 *  scan_descriptor_info,
struct vkd3d_shader_scan_combined_resource_sampler_info *  combined_sampler_info,
struct vkd3d_shader_message_context *  message_context 
)
static

Definition at line 830 of file vkd3d_shader_main.c.

836{
837 unsigned int i;
838
839 memset(context, 0, sizeof(*context));
840 context->version = version;
841 context->scan_descriptor_info = scan_descriptor_info;
842 context->message_context = message_context;
843 context->location.source_name = compile_info->source_name;
844 context->location.line = 2; /* Line 1 is the version token. */
846 context->combined_sampler_info = combined_sampler_info;
847
848 for (i = 0; i < compile_info->option_count; ++i)
849 {
850 const struct vkd3d_shader_compile_option *option = &compile_info->options[i];
851
853 context->api_version = option->value;
854 }
855}
static const WCHAR version[]
Definition: asmname.c:66
Definition: getopt.h:109
WCHAR * name
Definition: getopt.h:110
const struct vkd3d_shader_compile_option * options
@ VKD3D_SHADER_COMPILE_OPTION_API_VERSION
Definition: vkd3d_shader.h:279
@ VKD3D_SHADER_API_VERSION_1_2
Definition: vkd3d_shader.h:47

Referenced by vsir_program_scan().

◆ vkd3d_shader_scan_find_innermost_breakable_cf_info()

static struct vkd3d_shader_cf_info * vkd3d_shader_scan_find_innermost_breakable_cf_info ( struct vkd3d_shader_scan_context *  context)
static

Definition at line 893 of file vkd3d_shader_main.c.

895{
896 size_t count = context->cf_info_count;
897 struct vkd3d_shader_cf_info *cf_info;
898
899 while (count)
900 {
901 cf_info = &context->cf_info[--count];
902 if (cf_info->type == VKD3D_SHADER_BLOCK_LOOP
903 || cf_info->type == VKD3D_SHADER_BLOCK_SWITCH)
904 return cf_info;
905 }
906
907 return NULL;
908}

Referenced by vkd3d_shader_scan_instruction().

◆ vkd3d_shader_scan_find_innermost_loop_cf_info()

static struct vkd3d_shader_cf_info * vkd3d_shader_scan_find_innermost_loop_cf_info ( struct vkd3d_shader_scan_context *  context)
static

Definition at line 910 of file vkd3d_shader_main.c.

912{
913 size_t count = context->cf_info_count;
914 struct vkd3d_shader_cf_info *cf_info;
915
916 while (count)
917 {
918 cf_info = &context->cf_info[--count];
919 if (cf_info->type == VKD3D_SHADER_BLOCK_LOOP)
920 return cf_info;
921 }
922
923 return NULL;
924}

Referenced by vkd3d_shader_scan_instruction().

◆ vkd3d_shader_scan_get_current_cf_info()

static struct vkd3d_shader_cf_info * vkd3d_shader_scan_get_current_cf_info ( struct vkd3d_shader_scan_context *  context)
static

Definition at line 862 of file vkd3d_shader_main.c.

863{
864 if (!context->cf_info_count)
865 return NULL;
866 return &context->cf_info[context->cf_info_count - 1];
867}

Referenced by vkd3d_shader_scan_instruction().

◆ vkd3d_shader_scan_instruction()

static int vkd3d_shader_scan_instruction ( struct vkd3d_shader_scan_context *  context,
const struct vkd3d_shader_instruction *  instruction 
)
static

Definition at line 1224 of file vkd3d_shader_main.c.

1226{
1227 const struct vkd3d_shader_register *sampler_reg;
1228 struct vkd3d_shader_cf_info *cf_info;
1229 unsigned int i;
1230
1231 context->location = instruction->location;
1232
1233 switch (instruction->opcode)
1234 {
1237 break;
1240 break;
1241 case VKD3DSIH_DCL:
1242 if (instruction->declaration.semantic.resource_type == VKD3D_SHADER_RESOURCE_NONE)
1243 break;
1244
1245 if (instruction->declaration.semantic.resource.reg.reg.type == VKD3DSPR_COMBINED_SAMPLER)
1246 {
1248 break;
1249 }
1250 /* fall through */
1253 break;
1256 vkd3d_shader_scan_resource_declaration(context, &instruction->declaration.raw_resource.resource,
1258 break;
1261 vkd3d_shader_scan_resource_declaration(context, &instruction->declaration.structured_resource.resource,
1263 instruction->declaration.structured_resource.byte_stride, false, instruction->flags);
1264 break;
1265 case VKD3DSIH_IF:
1266 case VKD3DSIH_IFC:
1268 cf_info->type = VKD3D_SHADER_BLOCK_IF;
1269 cf_info->inside_block = true;
1270 break;
1271 case VKD3DSIH_ELSE:
1272 if (!(cf_info = vkd3d_shader_scan_get_current_cf_info(context)) || cf_info->type != VKD3D_SHADER_BLOCK_IF)
1273 {
1274 vkd3d_shader_scan_error(context, VKD3D_SHADER_ERROR_TPF_MISMATCHED_CF,
1275 "Encountered ‘else’ instruction without corresponding ‘if’ block.");
1277 }
1278 cf_info->inside_block = true;
1279 break;
1280 case VKD3DSIH_ENDIF:
1281 if (!(cf_info = vkd3d_shader_scan_get_current_cf_info(context)) || cf_info->type != VKD3D_SHADER_BLOCK_IF)
1282 {
1283 vkd3d_shader_scan_error(context, VKD3D_SHADER_ERROR_TPF_MISMATCHED_CF,
1284 "Encountered ‘endif’ instruction without corresponding ‘if’ block.");
1286 }
1288 break;
1289 case VKD3DSIH_LOOP:
1291 cf_info->type = VKD3D_SHADER_BLOCK_LOOP;
1292 cf_info->inside_block = true;
1293 break;
1294 case VKD3DSIH_ENDLOOP:
1295 if (!(cf_info = vkd3d_shader_scan_get_current_cf_info(context)) || cf_info->type != VKD3D_SHADER_BLOCK_LOOP)
1296 {
1297 vkd3d_shader_scan_error(context, VKD3D_SHADER_ERROR_TPF_MISMATCHED_CF,
1298 "Encountered ‘endloop’ instruction without corresponding ‘loop’ block.");
1300 }
1302 break;
1303 case VKD3DSIH_SWITCH:
1305 cf_info->type = VKD3D_SHADER_BLOCK_SWITCH;
1306 break;
1307 case VKD3DSIH_ENDSWITCH:
1309 || cf_info->type != VKD3D_SHADER_BLOCK_SWITCH || cf_info->inside_block)
1310 {
1311 vkd3d_shader_scan_error(context, VKD3D_SHADER_ERROR_TPF_MISMATCHED_CF,
1312 "Encountered ‘endswitch’ instruction without corresponding ‘switch’ block.");
1314 }
1316 break;
1317 case VKD3DSIH_CASE:
1319 || cf_info->type != VKD3D_SHADER_BLOCK_SWITCH)
1320 {
1321 vkd3d_shader_scan_error(context, VKD3D_SHADER_ERROR_TPF_MISMATCHED_CF,
1322 "Encountered ‘case’ instruction outside switch block.");
1324 }
1325 cf_info->inside_block = true;
1326 break;
1327 case VKD3DSIH_DEFAULT:
1329 || cf_info->type != VKD3D_SHADER_BLOCK_SWITCH)
1330 {
1331 vkd3d_shader_scan_error(context, VKD3D_SHADER_ERROR_TPF_MISMATCHED_CF,
1332 "Encountered ‘default’ instruction outside switch block.");
1334 }
1335 if (cf_info->has_default)
1336 {
1337 vkd3d_shader_scan_error(context, VKD3D_SHADER_ERROR_TPF_MISMATCHED_CF,
1338 "Encountered duplicate ‘default’ instruction inside the current switch block.");
1340 }
1341 cf_info->inside_block = true;
1342 cf_info->has_default = true;
1343 break;
1344 case VKD3DSIH_BREAK:
1346 {
1347 vkd3d_shader_scan_error(context, VKD3D_SHADER_ERROR_TPF_MISMATCHED_CF,
1348 "Encountered ‘break’ instruction outside breakable block.");
1350 }
1351 cf_info->inside_block = false;
1352 break;
1353 case VKD3DSIH_BREAKP:
1355 {
1356 vkd3d_shader_scan_error(context, VKD3D_SHADER_ERROR_TPF_MISMATCHED_CF,
1357 "Encountered ‘breakp’ instruction outside loop.");
1359 }
1360 break;
1361 case VKD3DSIH_CONTINUE:
1363 {
1364 vkd3d_shader_scan_error(context, VKD3D_SHADER_ERROR_TPF_MISMATCHED_CF,
1365 "Encountered ‘continue’ instruction outside loop.");
1367 }
1368 cf_info->inside_block = false;
1369 break;
1370 case VKD3DSIH_CONTINUEP:
1372 {
1373 vkd3d_shader_scan_error(context, VKD3D_SHADER_ERROR_TPF_MISMATCHED_CF,
1374 "Encountered ‘continue’ instruction outside loop.");
1376 }
1377 break;
1378 case VKD3DSIH_RET:
1379 if (context->cf_info_count)
1380 context->cf_info[context->cf_info_count - 1].inside_block = false;
1381 break;
1382 case VKD3DSIH_TEX:
1383 if (context->version->major == 1)
1384 sampler_reg = &instruction->dst[0].reg;
1385 else
1386 sampler_reg = &instruction->src[1].reg;
1387 vkd3d_shader_scan_combined_sampler_usage(context, sampler_reg, sampler_reg);
1388 break;
1389 case VKD3DSIH_TEXBEM:
1390 case VKD3DSIH_TEXBEML:
1391 case VKD3DSIH_TEXDP3TEX:
1396 case VKD3DSIH_TEXREG2AR:
1397 case VKD3DSIH_TEXREG2GB:
1399 sampler_reg = &instruction->dst[0].reg;
1400 vkd3d_shader_scan_combined_sampler_usage(context, sampler_reg, sampler_reg);
1401 break;
1402 case VKD3DSIH_GATHER4:
1403 case VKD3DSIH_GATHER4_C:
1404 case VKD3DSIH_SAMPLE:
1405 case VKD3DSIH_SAMPLE_B:
1406 case VKD3DSIH_SAMPLE_C:
1411 break;
1415 break;
1416 case VKD3DSIH_LD:
1417 case VKD3DSIH_LD2DMS:
1419 break;
1420 case VKD3DSIH_BUFINFO:
1422 if (instruction->src[0].reg.type == VKD3DSPR_RESOURCE)
1424 break;
1425 case VKD3DSIH_LD_RAW:
1426 case VKD3DSIH_RESINFO:
1427 if (instruction->src[1].reg.type == VKD3DSPR_RESOURCE)
1429 break;
1431 if (instruction->src[2].reg.type == VKD3DSPR_RESOURCE)
1433 break;
1434 default:
1435 break;
1436 }
1437
1439 {
1440 for (i = 0; i < instruction->dst_count; ++i)
1441 {
1442 if (instruction->dst[i].reg.type == VKD3DSPR_UAV)
1444 }
1445 for (i = 0; i < instruction->src_count; ++i)
1446 {
1447 if (instruction->src[i].reg.type == VKD3DSPR_UAV)
1449 }
1450 }
1451
1454
1456 {
1457 for (i = 0; i < instruction->dst_count; ++i)
1458 {
1459 if (instruction->dst[i].reg.type == VKD3DSPR_UAV)
1461 }
1462 }
1463
1464 return VKD3D_OK;
1465}
struct shader_reg dst
static void vkd3d_shader_scan_resource_declaration(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_resource *resource, enum vkd3d_shader_resource_type resource_type, enum vkd3d_shader_resource_data_type resource_data_type, unsigned int sample_count, unsigned int structure_stride, bool raw, uint32_t flags)
static struct vkd3d_shader_cf_info * vkd3d_shader_scan_get_current_cf_info(struct vkd3d_shader_scan_context *context)
static struct vkd3d_shader_cf_info * vkd3d_shader_scan_find_innermost_loop_cf_info(struct vkd3d_shader_scan_context *context)
static bool vkd3d_shader_instruction_is_uav_read(const struct vkd3d_shader_instruction *instruction)
static void vkd3d_shader_scan_record_uav_atomic_op(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_register *reg)
static void vkd3d_shader_scan_typed_resource_declaration(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_instruction *instruction)
static void vkd3d_shader_scan_constant_buffer_declaration(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_instruction *instruction)
static struct vkd3d_shader_cf_info * vkd3d_shader_scan_find_innermost_breakable_cf_info(struct vkd3d_shader_scan_context *context)
static void vkd3d_shader_scan_sampler_declaration(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_instruction *instruction)
static void vkd3d_shader_scan_record_uav_counter(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_register *reg)
static bool vkd3d_shader_instruction_is_uav_atomic_op(const struct vkd3d_shader_instruction *instruction)
static void vkd3d_shader_scan_pop_cf_info(struct vkd3d_shader_scan_context *context)
static bool vkd3d_shader_instruction_is_uav_counter(const struct vkd3d_shader_instruction *instruction)
static void vkd3d_shader_scan_combined_sampler_declaration(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_semantic *semantic)
static void vkd3d_shader_scan_combined_sampler_usage(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_register *resource, const struct vkd3d_shader_register *sampler)
static struct vkd3d_shader_cf_info * vkd3d_shader_scan_push_cf_info(struct vkd3d_shader_scan_context *context)
static void vkd3d_shader_scan_record_uav_read(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_register *reg)
@ VKD3DSPR_COMBINED_SAMPLER
@ VKD3D_SHADER_ERROR_TPF_MISMATCHED_CF
@ VKD3DSIH_RESINFO
@ VKD3DSIH_ENDSWITCH
@ VKD3DSIH_TEXM3x3SPEC
@ VKD3DSIH_TEXREG2RGB
@ VKD3DSIH_TEXDP3TEX
@ VKD3DSIH_TEX
@ VKD3DSIH_GATHER4_PO_C
@ VKD3DSIH_SAMPLE_C_LZ
@ VKD3DSIH_LOOP
@ VKD3DSIH_SAMPLE_INFO
@ VKD3DSIH_TEXREG2AR
@ VKD3DSIH_SWITCH
@ VKD3DSIH_SAMPLE
@ VKD3DSIH_SAMPLE_C
@ VKD3DSIH_DCL_RESOURCE_RAW
@ VKD3DSIH_DCL_SAMPLER
@ VKD3DSIH_GATHER4_PO
@ VKD3DSIH_TEXREG2GB
@ VKD3DSIH_BREAK
@ VKD3DSIH_DCL_UAV_RAW
@ VKD3DSIH_LD2DMS
@ VKD3DSIH_TEXBEM
@ VKD3DSIH_IFC
@ VKD3DSIH_SAMPLE_LOD
@ VKD3DSIH_CASE
@ VKD3DSIH_CONTINUE
@ VKD3DSIH_IF
@ VKD3DSIH_TEXM3x2TEX
@ VKD3DSIH_ENDIF
@ VKD3DSIH_DCL_UAV_STRUCTURED
@ VKD3DSIH_TEXM3x3VSPEC
@ VKD3DSIH_GATHER4_C
@ VKD3DSIH_CONTINUEP
@ VKD3DSIH_SAMPLE_B
@ VKD3DSIH_DCL_RESOURCE_STRUCTURED
@ VKD3DSIH_TEXBEML
@ VKD3DSIH_BUFINFO
@ VKD3DSIH_ENDLOOP
@ VKD3DSIH_DCL
@ VKD3DSIH_DCL_UAV_TYPED
@ VKD3DSIH_TEXM3x3TEX
@ VKD3DSIH_SAMPLE_GRAD
@ VKD3DSIH_ELSE
@ VKD3DSIH_DCL_CONSTANT_BUFFER
@ VKD3DSIH_LD
@ VKD3DSIH_BREAKP
@ VKD3DSIH_DEFAULT
@ VKD3DSIH_RET
@ VKD3DSIH_GATHER4
@ VKD3D_ERROR_INVALID_SHADER
Definition: vkd3d_types.h:53

Referenced by vsir_program_scan().

◆ vkd3d_shader_scan_pop_cf_info()

static void vkd3d_shader_scan_pop_cf_info ( struct vkd3d_shader_scan_context *  context)
static

Definition at line 886 of file vkd3d_shader_main.c.

887{
888 VKD3D_ASSERT(context->cf_info_count);
889
890 --context->cf_info_count;
891}

Referenced by vkd3d_shader_scan_instruction().

◆ vkd3d_shader_scan_push_cf_info()

static struct vkd3d_shader_cf_info * vkd3d_shader_scan_push_cf_info ( struct vkd3d_shader_scan_context *  context)
static

Definition at line 869 of file vkd3d_shader_main.c.

870{
871 struct vkd3d_shader_cf_info *cf_info;
872
873 if (!vkd3d_array_reserve((void **)&context->cf_info, &context->cf_info_size,
874 context->cf_info_count + 1, sizeof(*context->cf_info)))
875 {
876 ERR("Failed to allocate UAV range.\n");
877 return false;
878 }
879
880 cf_info = &context->cf_info[context->cf_info_count++];
881 memset(cf_info, 0, sizeof(*cf_info));
882
883 return cf_info;
884}

Referenced by vkd3d_shader_scan_instruction().

◆ vkd3d_shader_scan_record_uav_atomic_op()

static void vkd3d_shader_scan_record_uav_atomic_op ( struct vkd3d_shader_scan_context *  context,
const struct vkd3d_shader_register *  reg 
)
static

Definition at line 984 of file vkd3d_shader_main.c.

986{
988}
@ VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_ATOMICS
static void vkd3d_shader_scan_add_uav_flag(const struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_register *reg, uint32_t flag)

Referenced by vkd3d_shader_scan_instruction().

◆ vkd3d_shader_scan_record_uav_counter()

static void vkd3d_shader_scan_record_uav_counter ( struct vkd3d_shader_scan_context *  context,
const struct vkd3d_shader_register *  reg 
)
static

◆ vkd3d_shader_scan_record_uav_read()

static void vkd3d_shader_scan_record_uav_read ( struct vkd3d_shader_scan_context *  context,
const struct vkd3d_shader_register *  reg 
)
static

◆ vkd3d_shader_scan_resource_declaration()

static void vkd3d_shader_scan_resource_declaration ( struct vkd3d_shader_scan_context *  context,
const struct vkd3d_shader_resource *  resource,
enum vkd3d_shader_resource_type  resource_type,
enum vkd3d_shader_resource_data_type  resource_data_type,
unsigned int  sample_count,
unsigned int  structure_stride,
bool  raw,
uint32_t  flags 
)
static

Definition at line 1142 of file vkd3d_shader_main.c.

1146{
1149
1150 if (resource->reg.reg.type == VKD3DSPR_UAV)
1152 else
1156 return;
1157 d->sample_count = sample_count;
1158 d->structure_stride = structure_stride;
1159 if (raw)
1162 d->uav_flags = flags;
1163}
GLbitfield flags
Definition: glext.h:7161
@ VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_RAW_BUFFER
vkd3d_shader_descriptor_type
Definition: vkd3d_shader.h:420

Referenced by vkd3d_shader_scan_instruction(), and vkd3d_shader_scan_typed_resource_declaration().

◆ vkd3d_shader_scan_sampler_declaration()

static void vkd3d_shader_scan_sampler_declaration ( struct vkd3d_shader_scan_context *  context,
const struct vkd3d_shader_instruction *  instruction 
)
static

Definition at line 1034 of file vkd3d_shader_main.c.

Referenced by vkd3d_shader_scan_instruction().

◆ vkd3d_shader_scan_typed_resource_declaration()

static void vkd3d_shader_scan_typed_resource_declaration ( struct vkd3d_shader_scan_context *  context,
const struct vkd3d_shader_instruction *  instruction 
)
static

Definition at line 1165 of file vkd3d_shader_main.c.

1167{
1168 const struct vkd3d_shader_semantic *semantic = &instruction->declaration.semantic;
1170
1171 if (semantic->resource_data_type[0] != semantic->resource_data_type[1] ||
1172 semantic->resource_data_type[0] != semantic->resource_data_type[2] ||
1173 semantic->resource_data_type[0] != semantic->resource_data_type[3])
1174 FIXME("Resource data types are different (%d, %d, %d, %d).\n",
1175 semantic->resource_data_type[0],
1176 semantic->resource_data_type[1],
1177 semantic->resource_data_type[2],
1178 semantic->resource_data_type[3]);
1179
1180 switch (semantic->resource_data_type[0])
1181 {
1182 case VKD3D_DATA_UNORM:
1184 break;
1185 case VKD3D_DATA_SNORM:
1187 break;
1188 case VKD3D_DATA_INT:
1190 break;
1191 case VKD3D_DATA_UINT:
1193 break;
1194 case VKD3D_DATA_FLOAT:
1196 break;
1197 case VKD3D_DATA_MIXED:
1199 break;
1200 case VKD3D_DATA_DOUBLE:
1202 break;
1205 break;
1206 default:
1207 ERR("Invalid resource data type %#x.\n", semantic->resource_data_type[0]);
1209 break;
1210 }
1211
1212 if (context->api_version < VKD3D_SHADER_API_VERSION_1_3
1214 {
1215 ERR("Invalid resource data type %#x for API version %#x.\n",
1216 semantic->resource_data_type[0], context->api_version);
1218 }
1219
1221 semantic->resource_type, resource_data_type, semantic->sample_count, 0, false, instruction->flags);
1222}
enum vkd3d_data_type resource_data_type[VKD3D_VEC4_SIZE]
vkd3d_shader_resource_data_type
@ VKD3D_SHADER_RESOURCE_DATA_DOUBLE
@ VKD3D_SHADER_RESOURCE_DATA_MIXED
@ VKD3D_SHADER_RESOURCE_DATA_SNORM
@ VKD3D_SHADER_RESOURCE_DATA_CONTINUED
@ VKD3D_SHADER_RESOURCE_DATA_UNORM
@ VKD3D_SHADER_RESOURCE_DATA_INT
@ VKD3D_SHADER_API_VERSION_1_3
Definition: vkd3d_shader.h:48
@ VKD3D_DATA_SNORM
@ VKD3D_DATA_INT
@ VKD3D_DATA_DOUBLE
@ VKD3D_DATA_UINT
@ VKD3D_DATA_UNORM
@ VKD3D_DATA_FLOAT
@ VKD3D_DATA_MIXED
@ VKD3D_DATA_CONTINUED

Referenced by vkd3d_shader_scan_instruction().

◆ vkd3d_shader_set_log_callback()

void vkd3d_shader_set_log_callback ( PFN_vkd3d_log  callback)

Set a callback to be called when vkd3d-shader outputs debug logging.

If NULL, or if this function has not been called, libvkd3d-shader will print all enabled log output to stderr.

Parameters
callbackCallback function to set.
Since
1.4

Definition at line 2068 of file vkd3d_shader_main.c.

2069{
2071}
static IPrintDialogCallback callback
Definition: printdlg.c:325
void void vkd3d_dbg_set_log_callback(PFN_vkd3d_log callback)
Definition: debug.c:119

Referenced by vkd3d_set_log_callback().

◆ vkd3d_shader_signature_from_shader_signature()

static bool vkd3d_shader_signature_from_shader_signature ( struct vkd3d_shader_signature *  signature,
const struct shader_signature *  src 
)
static

Definition at line 735 of file vkd3d_shader_main.c.

737{
738 unsigned int i;
739
740 signature->element_count = src->element_count;
741 if (!src->elements)
742 {
743 VKD3D_ASSERT(!signature->element_count);
744 signature->elements = NULL;
745 return true;
746 }
747
748 if (!(signature->elements = vkd3d_calloc(signature->element_count, sizeof(*signature->elements))))
749 return false;
750
751 for (i = 0; i < signature->element_count; ++i)
752 {
753 struct vkd3d_shader_signature_element *d = &signature->elements[i];
754 struct signature_element *e = &src->elements[i];
755
756 if (!(d->semantic_name = vkd3d_strdup(e->semantic_name)))
757 {
758 for (unsigned int j = 0; j < i; ++j)
759 {
760 vkd3d_free((void *)signature->elements[j].semantic_name);
761 }
762 vkd3d_free(signature->elements);
763 return false;
764 }
765 d->semantic_index = e->semantic_index;
766 d->stream_index = e->stream_index;
767 d->sysval_semantic = e->sysval_semantic;
768 d->component_type = e->component_type;
769 d->register_index = e->register_index;
770 if (e->register_count > 1)
771 FIXME("Arrayed elements are not supported yet.\n");
772 d->mask = e->mask;
773 d->used_mask = e->used_mask;
774 d->min_precision = e->min_precision;
775 }
776
777 return true;
778}
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
static char * vkd3d_strdup(const char *string)
Definition: vkd3d_memory.h:57

Referenced by vkd3d_shader_parse_input_signature(), and vsir_program_scan().

◆ vkd3d_shader_trace_text_()

void vkd3d_shader_trace_text_ ( const char *  text,
size_t  size,
const char *  function 
)

Definition at line 169 of file vkd3d_shader_main.c.

170{
171 const char *p, *q, *end = text + size;
172
173 if (!TRACE_ON())
174 return;
175
176 for (p = text; p < end; p = q)
177 {
178 if (!(q = memchr(p, '\n', end - p)))
179 q = end;
180 else
181 ++q;
182 vkd3d_dbg_printf(VKD3D_DBG_LEVEL_TRACE, function, "%.*s", (int)(q - p), p);
183 }
184}
#define TRACE_ON(x)
Definition: compat.h:75
const WCHAR * text
Definition: package.c:1826
GLuint GLuint end
Definition: gl.h:1545
GLdouble GLdouble GLdouble GLdouble q
Definition: gl.h:2063
GLfloat GLfloat p
Definition: glext.h:8902
#define memchr(s, c, n)
Definition: mkisofs.h:875
void vkd3d_dbg_printf(enum vkd3d_dbg_level level, const char *function, const char *fmt,...) VKD3D_PRINTF_FUNC(3
@ VKD3D_DBG_LEVEL_TRACE
Definition: vkd3d_common.h:149

Referenced by vkd3d_string_buffer_trace_().

◆ vkd3d_shader_validate_compile_info()

static int vkd3d_shader_validate_compile_info ( const struct vkd3d_shader_compile_info *  compile_info,
bool  validate_target_type 
)
static

Definition at line 638 of file vkd3d_shader_main.c.

640{
641 const enum vkd3d_shader_source_type *source_types;
642 const enum vkd3d_shader_target_type *target_types;
643 unsigned int count, i;
644
646 {
647 WARN("Invalid structure type %#x.\n", compile_info->type);
649 }
650
652 for (i = 0; i < count; ++i)
653 {
654 if (source_types[i] == compile_info->source_type)
655 break;
656 }
657 if (i == count)
658 {
659 WARN("Invalid shader source type %#x.\n", compile_info->source_type);
661 }
662
663 if (validate_target_type)
664 {
665 target_types = vkd3d_shader_get_supported_target_types(compile_info->source_type, &count);
666 for (i = 0; i < count; ++i)
667 {
668 if (target_types[i] == compile_info->target_type)
669 break;
670 }
671 if (i == count)
672 {
673 WARN("Invalid shader target type %#x.\n", compile_info->target_type);
675 }
676 }
677
678 return VKD3D_OK;
679}
enum vkd3d_shader_structure_type type
@ VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO
Definition: vkd3d_shader.h:68
enum vkd3d_shader_target_type * vkd3d_shader_get_supported_target_types(enum vkd3d_shader_source_type source_type, unsigned int *count)
enum vkd3d_shader_source_type * vkd3d_shader_get_supported_source_types(unsigned int *count)
@ VKD3D_ERROR_INVALID_ARGUMENT
Definition: vkd3d_types.h:51

Referenced by vkd3d_shader_compile(), vkd3d_shader_preprocess(), and vkd3d_shader_scan().

◆ vkd3d_shader_verror()

void vkd3d_shader_verror ( struct vkd3d_shader_message_context *  context,
const struct vkd3d_shader_location *  location,
enum vkd3d_shader_error  error,
const char *  format,
va_list  args 
)

Definition at line 336 of file vkd3d_shader_main.c.

338{
339 if (context->log_level < VKD3D_SHADER_LOG_ERROR)
340 return;
341
342 if (location)
343 {
344 const char *source_name = location->source_name ? location->source_name : "<anonymous>";
345
346 if (location->line)
347 vkd3d_string_buffer_printf(&context->messages, "%s:%u:%u: E%04u: ",
348 source_name, location->line, location->column, error);
349 else
350 vkd3d_string_buffer_printf(&context->messages, "%s: E%04u: ", source_name, error);
351 }
352 else
353 {
354 vkd3d_string_buffer_printf(&context->messages, "E%04u: ", error);
355 }
357 vkd3d_string_buffer_printf(&context->messages, "\n");
358}
@ VKD3D_SHADER_LOG_ERROR
int vkd3d_string_buffer_vprintf(struct vkd3d_string_buffer *buffer, const char *format, va_list args)
int vkd3d_string_buffer_printf(struct vkd3d_string_buffer *buffer, const char *format,...)

Referenced by hlsl_error(), VKD3D_PRINTF_FUNC(), and vkd3d_shader_error().

◆ vkd3d_shader_vnote()

void vkd3d_shader_vnote ( struct vkd3d_shader_message_context *  context,
const struct vkd3d_shader_location *  location,
enum vkd3d_shader_log_level  level,
const char *  format,
va_list  args 
)

Definition at line 282 of file vkd3d_shader_main.c.

284{
285 if (context->log_level < level)
286 return;
287
288 if (location)
289 {
290 const char *source_name = location->source_name ? location->source_name : "<anonymous>";
291
292 if (location->line)
293 vkd3d_string_buffer_printf(&context->messages, "%s:%u:%u: ",
294 source_name, location->line, location->column);
295 else
296 vkd3d_string_buffer_printf(&context->messages, "%s: ", source_name);
297 }
299 vkd3d_string_buffer_printf(&context->messages, "\n");
300}
GLint level
Definition: gl.h:1546

Referenced by hlsl_note().

◆ vkd3d_shader_vwarning()

void vkd3d_shader_vwarning ( struct vkd3d_shader_message_context *  context,
const struct vkd3d_shader_location *  location,
enum vkd3d_shader_error  error,
const char *  format,
va_list  args 
)

Definition at line 302 of file vkd3d_shader_main.c.

304{
305 if (context->log_level < VKD3D_SHADER_LOG_WARNING)
306 return;
307
308 if (location)
309 {
310 const char *source_name = location->source_name ? location->source_name : "<anonymous>";
311
312 if (location->line)
313 vkd3d_string_buffer_printf(&context->messages, "%s:%u:%u: W%04u: ",
314 source_name, location->line, location->column, error);
315 else
316 vkd3d_string_buffer_printf(&context->messages, "%s: W%04u: ", source_name, error);
317 }
318 else
319 {
320 vkd3d_string_buffer_printf(&context->messages, "W%04u: ", error);
321 }
323 vkd3d_string_buffer_printf(&context->messages, "\n");
324}
@ VKD3D_SHADER_LOG_WARNING

Referenced by hlsl_warning(), and vkd3d_shader_warning().

◆ vkd3d_shader_warning()

void vkd3d_shader_warning ( struct vkd3d_shader_message_context *  context,
const struct vkd3d_shader_location *  location,
enum vkd3d_shader_error  error,
const char *  format,
  ... 
)

Definition at line 326 of file vkd3d_shader_main.c.

328{
330
333 va_end(args);
334}
void vkd3d_shader_vwarning(struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location, enum vkd3d_shader_error error, const char *format, va_list args)

Referenced by sm6_parser_init().

◆ vkd3d_string_buffer_cache_cleanup()

void vkd3d_string_buffer_cache_cleanup ( struct vkd3d_string_buffer_cache *  cache)

Definition at line 191 of file vkd3d_shader_main.c.

192{
193 unsigned int i;
194
195 for (i = 0; i < cache->count; ++i)
196 {
198 vkd3d_free(cache->buffers[i]);
199 }
200 vkd3d_free(cache->buffers);
202}
Definition: cache.c:41
void vkd3d_string_buffer_cache_init(struct vkd3d_string_buffer_cache *cache)

Referenced by hlsl_ctx_cleanup(), msl_generator_cleanup(), msl_generator_init(), spirv_compiler_destroy(), and vkd3d_glsl_generator_cleanup().

◆ vkd3d_string_buffer_cache_init()

void vkd3d_string_buffer_cache_init ( struct vkd3d_string_buffer_cache *  cache)

◆ vkd3d_string_buffer_cleanup()

◆ vkd3d_string_buffer_clear()

void vkd3d_string_buffer_clear ( struct vkd3d_string_buffer *  buffer)

Definition at line 72 of file vkd3d_shader_main.c.

73{
75}
void vkd3d_string_buffer_truncate(struct vkd3d_string_buffer *buffer, size_t size)

Referenced by declare_predefined_types(), trace_signature(), vkd3d_string_buffer_get(), vsir_cfg_compute_dominators(), vsir_cfg_compute_loops(), and vsir_cfg_sort_nodes().

◆ vkd3d_string_buffer_get()

struct vkd3d_string_buffer * vkd3d_string_buffer_get ( struct vkd3d_string_buffer_cache *  cache)

Definition at line 204 of file vkd3d_shader_main.c.

205{
207
208 if (!cache->count)
209 {
210 if (!vkd3d_array_reserve((void **)&cache->buffers, &cache->capacity,
211 cache->max_count + 1, sizeof(*cache->buffers)))
212 return NULL;
213 ++cache->max_count;
214
215 if (!(buffer = vkd3d_malloc(sizeof(*buffer))))
216 return NULL;
218 }
219 else
220 {
221 buffer = cache->buffers[--cache->count];
222 }
224 return buffer;
225}
void vkd3d_string_buffer_clear(struct vkd3d_string_buffer *buffer)

Referenced by glsl_dst_init(), glsl_src_init(), hlsl_get_string_buffer(), msl_dst_init(), msl_generator_init(), msl_src_init(), shader_glsl_intrinsic(), shader_glsl_ld(), shader_glsl_load_uav_typed(), shader_glsl_print_src(), shader_glsl_sample(), shader_glsl_store_uav_typed(), vkd3d_glsl_generator_init(), and vkd3d_shader_register_range_string().

◆ vkd3d_string_buffer_init()

void vkd3d_string_buffer_init ( struct vkd3d_string_buffer *  buffer)

◆ vkd3d_string_buffer_print_f32()

int vkd3d_string_buffer_print_f32 ( struct vkd3d_string_buffer *  buffer,
float  f 
)

Definition at line 134 of file vkd3d_shader_main.c.

135{
136 unsigned int idx = buffer->content_size + 1;
137 int ret;
138
139 if (!(ret = vkd3d_string_buffer_printf(buffer, "%.8e", f)) && isfinite(f))
140 {
141 if (signbit(f))
142 ++idx;
143 buffer->buffer[idx] = '.';
144 }
145
146 return ret;
147}
#define isfinite(x)
Definition: math.h:363
#define signbit(x)
Definition: math.h:362

Referenced by shader_print_float_literal().

◆ vkd3d_string_buffer_print_f64()

int vkd3d_string_buffer_print_f64 ( struct vkd3d_string_buffer *  buffer,
double  d 
)

Definition at line 149 of file vkd3d_shader_main.c.

150{
151 unsigned int idx = buffer->content_size + 1;
152 int ret;
153
154 if (!(ret = vkd3d_string_buffer_printf(buffer, "%.16e", d)) && isfinite(d))
155 {
156 if (signbit(d))
157 ++idx;
158 buffer->buffer[idx] = '.';
159 }
160
161 return ret;
162}

Referenced by shader_print_double_literal().

◆ vkd3d_string_buffer_printf()

int vkd3d_string_buffer_printf ( struct vkd3d_string_buffer *  buffer,
const char *  format,
  ... 
)

Definition at line 122 of file vkd3d_shader_main.c.

123{
125 int ret;
126
129 va_end(args);
130
131 return ret;
132}

Referenced by d3d_asm_compile(), declare_predefined_types(), dump_block(), dump_deref(), dump_dxbc_signature(), dump_dxbc_signatures(), dump_instr(), dump_ir_call(), dump_ir_compile(), dump_ir_constant(), dump_ir_expr(), dump_ir_if(), dump_ir_index(), dump_ir_jump(), dump_ir_loop(), dump_ir_resource_load(), dump_ir_resource_store(), dump_ir_sampler_state(), dump_ir_stateblock_constant(), dump_ir_store(), dump_ir_string(), dump_ir_switch(), dump_ir_swizzle(), dump_ir_var(), dump_src(), fx_4_parse_object_initializer(), fx_4_parse_objects(), fx_4_parse_shader_initializer(), fx_4_parse_state_object_initializer(), fx_4_parse_string_initializer(), fx_parse_buffers(), fx_parse_fx_4_annotations(), fx_parse_fx_4_numeric_variables(), fx_parse_fx_4_technique(), fx_parse_groups(), hlsl_compile_internal_function(), hlsl_component_to_string(), hlsl_dump_function(), hlsl_dump_var_default_values(), hlsl_fixme(), hlsl_modifiers_to_string(), hlsl_new_synthetic_var(), hlsl_type_to_string(), lower_combined_samples(), msl_generate_cbv_declaration(), msl_generate_descriptor_struct_declarations(), msl_generate_entrypoint(), msl_generate_entrypoint_epilogue(), msl_generate_entrypoint_prologue(), msl_generate_input_struct_declarations(), msl_generate_output_struct_declarations(), msl_generate_pixel_output_element_attribute(), msl_generate_vertex_output_element_attribute(), msl_generator_generate(), msl_print_indent(), msl_print_register_datatype(), msl_print_register_name(), msl_print_swizzle(), msl_print_write_mask(), msl_ret(), msl_unhandled(), parse_fx_4_numeric_value(), parse_fx_print_indent(), shader_dump_atomic_op_flags(), shader_dump_data_type(), shader_dump_global_flags(), shader_dump_icb(), shader_dump_ins_modifiers(), shader_dump_instruction(), shader_dump_instruction_flags(), shader_dump_precise_flags(), shader_dump_resource_data_type(), shader_dump_resource_type(), shader_dump_sync_flags(), shader_dump_uav_flags(), shader_glsl_begin_block(), shader_glsl_break(), shader_glsl_case(), shader_glsl_continue(), shader_glsl_dcl_indexable_temp(), shader_glsl_default(), shader_glsl_else(), shader_glsl_end_block(), shader_glsl_generate_cbv_declaration(), shader_glsl_generate_declarations(), shader_glsl_generate_descriptor_declarations(), shader_glsl_generate_input_declarations(), shader_glsl_generate_interface_block(), shader_glsl_generate_output_declarations(), shader_glsl_generate_sampler_declaration(), shader_glsl_generate_uav_declaration(), shader_glsl_handle_global_flags(), shader_glsl_if(), shader_glsl_intrinsic(), shader_glsl_ld(), shader_glsl_load_uav_typed(), shader_glsl_loop(), shader_glsl_print_bitcast(), shader_glsl_print_combined_sampler_name(), shader_glsl_print_image_name(), shader_glsl_print_indent(), shader_glsl_print_register_name(), shader_glsl_print_shadow_coord(), shader_glsl_print_src(), shader_glsl_print_subscript(), shader_glsl_print_swizzle(), shader_glsl_print_sysval_name(), shader_glsl_print_texel_offset(), shader_glsl_print_write_mask(), shader_glsl_ret(), shader_glsl_sample(), shader_glsl_shader_epilogue(), shader_glsl_shader_prologue(), shader_glsl_store_uav_typed(), shader_glsl_switch(), shader_glsl_unhandled(), shader_print_bool_literal(), shader_print_dcl_usage(), shader_print_double_literal(), shader_print_float_literal(), shader_print_hex_literal(), shader_print_input_sysval_semantic(), shader_print_int_literal(), shader_print_interpolation_mode(), shader_print_non_uniform(), shader_print_opcode(), shader_print_precision(), shader_print_primitive_type(), shader_print_reg_type(), shader_print_register(), shader_print_src_param(), shader_print_subscript_range(), shader_print_tessellator_domain(), shader_print_tessellator_output_primitive(), shader_print_tessellator_partitioning(), shader_print_uint64_literal(), shader_print_uint_literal(), shader_print_write_mask(), trace_signature(), vkd3d_glsl_generator_generate(), VKD3D_PRINTF_FUNC(), vkd3d_shader_register_range_string(), vkd3d_shader_verror(), vkd3d_shader_vnote(), vkd3d_shader_vwarning(), vkd3d_string_buffer_print_f32(), vkd3d_string_buffer_print_f64(), vsir_cfg_compute_dominators(), vsir_cfg_compute_loops(), vsir_cfg_sort_nodes(), and vsir_cfg_structure_list_dump().

◆ vkd3d_string_buffer_release()

◆ vkd3d_string_buffer_resize()

static bool vkd3d_string_buffer_resize ( struct vkd3d_string_buffer *  buffer,
int  rc 
)
static

Definition at line 86 of file vkd3d_shader_main.c.

87{
88 unsigned int new_buffer_size = rc >= 0 ? buffer->content_size + rc + 1 : buffer->buffer_size * 2;
89
90 if (!vkd3d_array_reserve((void **)&buffer->buffer, &buffer->buffer_size, new_buffer_size, 1))
91 {
92 ERR("Failed to grow buffer.\n");
93 buffer->buffer[buffer->content_size] = '\0';
94 return false;
95 }
96 return true;
97}

Referenced by vkd3d_string_buffer_vprintf().

◆ vkd3d_string_buffer_trace_()

void vkd3d_string_buffer_trace_ ( const struct vkd3d_string_buffer *  buffer,
const char *  function 
)

Definition at line 164 of file vkd3d_shader_main.c.

165{
166 vkd3d_shader_trace_text_(buffer->buffer, buffer->content_size, function);
167}
void vkd3d_shader_trace_text_(const char *text, size_t size, const char *function)

Referenced by vkd3d_shader_message_context_trace_messages_().

◆ vkd3d_string_buffer_truncate()

void vkd3d_string_buffer_truncate ( struct vkd3d_string_buffer *  buffer,
size_t  size 
)

Definition at line 77 of file vkd3d_shader_main.c.

78{
79 if (size < buffer->content_size)
80 {
81 buffer->buffer[size] = '\0';
82 buffer->content_size = size;
83 }
84}

Referenced by vkd3d_string_buffer_clear(), and vsir_cfg_structure_list_dump().

◆ vkd3d_string_buffer_vprintf()

int vkd3d_string_buffer_vprintf ( struct vkd3d_string_buffer *  buffer,
const char *  format,
va_list  args 
)

Definition at line 99 of file vkd3d_shader_main.c.

100{
101 unsigned int rem;
102 va_list a;
103 int rc;
104
105 for (;;)
106 {
107 rem = buffer->buffer_size - buffer->content_size;
108 va_copy(a, args);
109 rc = vsnprintf(&buffer->buffer[buffer->content_size], rem, format, a);
110 va_end(a);
111 if (rc >= 0 && (unsigned int)rc < rem)
112 {
113 buffer->content_size += rc;
114 return 0;
115 }
116
118 return -1;
119 }
120}
#define vsnprintf
Definition: acwin.h:108
#define va_copy(d, s)
Definition: stdarg.h:29
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
#define a
Definition: ke_i.h:78
static bool vkd3d_string_buffer_resize(struct vkd3d_string_buffer *buffer, int rc)

Referenced by hlsl_fixme(), hlsl_sprintf_alloc(), VKD3D_PRINTF_FUNC(), vkd3d_shader_verror(), vkd3d_shader_vnote(), vkd3d_shader_vwarning(), and vkd3d_string_buffer_printf().

◆ vsir_parse()

static enum vkd3d_result vsir_parse ( const struct vkd3d_shader_compile_info *  compile_info,
uint64_t  config_flags,
struct vkd3d_shader_message_context *  message_context,
struct vsir_program *  program 
)
static

Definition at line 681 of file vkd3d_shader_main.c.

683{
684 enum vkd3d_result ret;
685
686 switch (compile_info->source_type)
687 {
689 ret = d3dbc_parse(compile_info, config_flags, message_context, program);
690 break;
691
693 ret = tpf_parse(compile_info, config_flags, message_context, program);
694 break;
695
697 ret = dxil_parse(compile_info, config_flags, message_context, program);
698 break;
699
700 default:
701 ERR("Unsupported source type %#x.\n", compile_info->source_type);
703 break;
704 }
705
706 if (ret < 0)
707 {
708 WARN("Failed to parse shader.\n");
709 return ret;
710 }
711
712 if ((ret = vsir_program_validate(program, config_flags, compile_info->source_name, message_context)) < 0)
713 {
714 WARN("Failed to validate shader after parsing, ret %d.\n", ret);
715
716 if (TRACE_ON())
718
720 return ret;
721 }
722
723 if (compile_info->target_type != VKD3D_SHADER_TARGET_NONE)
724 ret = vsir_program_transform_early(program, config_flags, compile_info, message_context);
725 return ret;
726}
void vsir_program_trace(const struct vsir_program *program)
Definition: d3d_asm.c:2550
int d3dbc_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t config_flags, struct vkd3d_shader_message_context *message_context, struct vsir_program *program)
Definition: d3dbc.c:1349
int dxil_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t config_flags, struct vkd3d_shader_message_context *message_context, struct vsir_program *program)
Definition: dxil.c:10606
enum vkd3d_result vsir_program_validate(struct vsir_program *program, uint64_t config_flags, const char *source_name, struct vkd3d_shader_message_context *message_context)
Definition: ir.c:8169
enum vkd3d_result vsir_program_transform_early(struct vsir_program *program, uint64_t config_flags, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_message_context *message_context)
Definition: ir.c:8305
int tpf_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t config_flags, struct vkd3d_shader_message_context *message_context, struct vsir_program *program)
Definition: tpf.c:2900
@ VKD3D_SHADER_TARGET_NONE
vkd3d_result
Definition: vkd3d_types.h:41

Referenced by vkd3d_shader_compile(), and vkd3d_shader_scan().

◆ vsir_program_compile()

int vsir_program_compile ( struct vsir_program *  program,
uint64_t  config_flags,
const struct vkd3d_shader_compile_info *  compile_info,
struct vkd3d_shader_code *  out,
struct vkd3d_shader_message_context *  message_context 
)

Definition at line 1640 of file vkd3d_shader_main.c.

1643{
1644 struct vkd3d_shader_scan_combined_resource_sampler_info combined_sampler_info;
1645 struct vkd3d_shader_scan_descriptor_info1 scan_descriptor_info;
1646 struct vkd3d_shader_compile_info scan_info;
1647 int ret;
1648
1649 scan_info = *compile_info;
1650
1651 switch (compile_info->target_type)
1652 {
1655 break;
1656
1659 combined_sampler_info.next = scan_info.next;
1660 scan_info.next = &combined_sampler_info;
1661 if ((ret = vsir_program_scan(program, &scan_info, message_context, &scan_descriptor_info)) < 0)
1662 return ret;
1663 ret = glsl_compile(program, config_flags, &scan_descriptor_info,
1664 &combined_sampler_info, compile_info, out, message_context);
1666 vkd3d_shader_free_scan_descriptor_info1(&scan_descriptor_info);
1667 break;
1668
1671 if ((ret = vsir_program_scan(program, &scan_info, message_context, &scan_descriptor_info)) < 0)
1672 return ret;
1673 ret = spirv_compile(program, config_flags, &scan_descriptor_info,
1674 compile_info, out, message_context);
1675 vkd3d_shader_free_scan_descriptor_info1(&scan_descriptor_info);
1676 break;
1677
1679 if ((ret = vsir_program_scan(program, &scan_info, message_context, &scan_descriptor_info)) < 0)
1680 return ret;
1681 ret = msl_compile(program, config_flags, &scan_descriptor_info, compile_info, out, message_context);
1682 vkd3d_shader_free_scan_descriptor_info1(&scan_descriptor_info);
1683 break;
1684
1685 default:
1686 /* Validation should prevent us from reaching this. */
1688 }
1689
1690 return ret;
1691}
enum vkd3d_result d3d_asm_compile(const struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, enum vsir_asm_flags flags)
Definition: d3d_asm.c:2370
int glsl_compile(struct vsir_program *program, uint64_t config_flags, const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info, const struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
Definition: glsl.c:2467
int msl_compile(struct vsir_program *program, uint64_t config_flags, const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
Definition: msl.c:879
int spirv_compile(struct vsir_program *program, uint64_t config_flags, const struct vkd3d_shader_scan_descriptor_info1 *scan_descriptor_info, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
Definition: spirv.c:10835
#define vkd3d_unreachable()
Definition: vkd3d_common.h:119
@ VKD3D_SHADER_STRUCTURE_TYPE_SCAN_COMBINED_RESOURCE_SAMPLER_INFO
Definition: vkd3d_shader.h:109
void vkd3d_shader_free_scan_combined_resource_sampler_info(struct vkd3d_shader_scan_combined_resource_sampler_info *info)
static void vkd3d_shader_free_scan_descriptor_info1(struct vkd3d_shader_scan_descriptor_info1 *scan_descriptor_info)
@ VSIR_ASM_FLAG_NONE

Referenced by hlsl_compile_shader(), and vkd3d_shader_compile().

◆ vsir_program_scan()

static int vsir_program_scan ( struct vsir_program *  program,
const struct vkd3d_shader_compile_info *  compile_info,
struct vkd3d_shader_message_context *  message_context,
struct vkd3d_shader_scan_descriptor_info1 *  descriptor_info1 
)
static

Definition at line 1500 of file vkd3d_shader_main.c.

1503{
1504 struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info;
1505 struct vkd3d_shader_scan_descriptor_info1 local_descriptor_info1 = {0};
1506 struct vkd3d_shader_scan_descriptor_info *descriptor_info;
1507 struct vkd3d_shader_scan_signature_info *signature_info;
1510 int ret = VKD3D_OK;
1511 unsigned int i;
1512
1513 descriptor_info = vkd3d_find_struct(compile_info->next, SCAN_DESCRIPTOR_INFO);
1514 if (descriptor_info1)
1515 {
1516 descriptor_info1->descriptors = NULL;
1517 descriptor_info1->descriptor_count = 0;
1518 }
1519 else if (descriptor_info)
1520 {
1521 descriptor_info1 = &local_descriptor_info1;
1522 }
1523 signature_info = vkd3d_find_struct(compile_info->next, SCAN_SIGNATURE_INFO);
1524
1525 if ((combined_sampler_info = vkd3d_find_struct(compile_info->next, SCAN_COMBINED_RESOURCE_SAMPLER_INFO)))
1526 {
1527 combined_sampler_info->combined_samplers = NULL;
1528 combined_sampler_info->combined_sampler_count = 0;
1529 if (!descriptor_info1)
1530 descriptor_info1 = &local_descriptor_info1;
1531 }
1532
1533 vkd3d_shader_scan_context_init(&context, &program->shader_version, compile_info,
1534 descriptor_info1, combined_sampler_info, message_context);
1535
1536 if (TRACE_ON())
1538
1539 for (i = 0; i < program->instructions.count; ++i)
1540 {
1541 instruction = &program->instructions.elements[i];
1543 break;
1544 }
1545
1546 for (i = 0; i < ARRAY_SIZE(program->flat_constant_count); ++i)
1547 {
1548 struct vkd3d_shader_register_range range = {.space = 0, .first = i, .last = i};
1549 struct vkd3d_shader_register reg = {.idx[0].offset = i, .idx_count = 1};
1550 unsigned int size = program->flat_constant_count[i];
1552
1553 if (size)
1554 {
1557 d->buffer_size = size * 16;
1558 }
1559 }
1560
1561 if (!ret && signature_info)
1562 {
1563 if (!vkd3d_shader_signature_from_shader_signature(&signature_info->input, &program->input_signature)
1565 &program->output_signature)
1567 &program->patch_constant_signature))
1568 {
1570 }
1571 }
1572
1573 if (!ret && descriptor_info)
1574 ret = convert_descriptor_info(descriptor_info, descriptor_info1);
1575
1576 if (ret < 0)
1577 {
1578 if (combined_sampler_info)
1580 if (descriptor_info)
1582 if (descriptor_info1)
1584 if (signature_info)
1586 }
1587 else
1588 {
1589 vkd3d_shader_free_scan_descriptor_info1(&local_descriptor_info1);
1590 }
1592 return ret;
1593}
struct vkd3d_shader_scan_combined_resource_sampler_info * combined_sampler_info
struct vkd3d_shader_message_context * message_context
void vkd3d_shader_free_scan_signature_info(struct vkd3d_shader_scan_signature_info *info)
static int vkd3d_shader_scan_instruction(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_instruction *instruction)
static enum vkd3d_result convert_descriptor_info(struct vkd3d_shader_scan_descriptor_info *info, const struct vkd3d_shader_scan_descriptor_info1 *info1)
static void vkd3d_shader_scan_context_init(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_version *version, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_scan_descriptor_info1 *scan_descriptor_info, struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info, struct vkd3d_shader_message_context *message_context)
void vkd3d_shader_free_scan_descriptor_info(struct vkd3d_shader_scan_descriptor_info *scan_descriptor_info)
static void vkd3d_shader_scan_context_cleanup(struct vkd3d_shader_scan_context *context)

Referenced by vkd3d_shader_scan(), and vsir_program_compile().

Variable Documentation

◆ vkd3d_shader_config_options

const struct vkd3d_debug_option vkd3d_shader_config_options[]
static
Initial value:
=
{
}
@ VKD3D_SHADER_CONFIG_FLAG_FORCE_VALIDATION

Definition at line 587 of file vkd3d_shader_main.c.

Referenced by vkd3d_shader_init_config_flags().