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

Go to the source code of this file.

Classes

struct  vkd3d_d3d_asm_colours
 
struct  vkd3d_d3d_asm_compiler
 

Functions

static unsigned int shader_get_float_offset (enum vkd3d_shader_register_type register_type, UINT register_idx)
 
static void shader_dump_global_flags (struct vkd3d_d3d_asm_compiler *compiler, enum vsir_global_flags global_flags)
 
static void shader_dump_atomic_op_flags (struct vkd3d_d3d_asm_compiler *compiler, uint32_t atomic_flags)
 
static void shader_dump_sync_flags (struct vkd3d_d3d_asm_compiler *compiler, uint32_t sync_flags)
 
static void shader_dump_precise_flags (struct vkd3d_d3d_asm_compiler *compiler, uint32_t flags)
 
static void shader_dump_uav_flags (struct vkd3d_d3d_asm_compiler *compiler, uint32_t uav_flags)
 
static void shader_print_tessellator_domain (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, enum vkd3d_tessellator_domain d, const char *suffix)
 
static void shader_print_tessellator_output_primitive (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, enum vkd3d_shader_tessellator_output_primitive p, const char *suffix)
 
static void shader_print_tessellator_partitioning (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, enum vkd3d_shader_tessellator_partitioning p, const char *suffix)
 
static void shader_print_input_sysval_semantic (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, enum vkd3d_shader_input_sysval_semantic semantic, const char *suffix)
 
static void shader_dump_resource_type (struct vkd3d_d3d_asm_compiler *compiler, enum vkd3d_shader_resource_type type)
 
static void shader_dump_data_type (struct vkd3d_d3d_asm_compiler *compiler, enum vkd3d_data_type type)
 
static void shader_dump_resource_data_type (struct vkd3d_d3d_asm_compiler *compiler, const enum vkd3d_data_type *type)
 
static void shader_print_dcl_usage (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, const struct vkd3d_shader_semantic *semantic, uint32_t flags, const char *suffix)
 
static void shader_print_src_param (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, const struct vkd3d_shader_src_param *param, const char *suffix)
 
static void shader_print_float_literal (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, float f, const char *suffix)
 
static void shader_print_double_literal (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, double d, const char *suffix)
 
static void shader_print_int_literal (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, int i, const char *suffix)
 
static void shader_print_uint_literal (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, unsigned int i, const char *suffix)
 
static void shader_print_uint64_literal (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, uint64_t i, const char *suffix)
 
static void shader_print_hex_literal (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, unsigned int i, const char *suffix)
 
static void shader_print_bool_literal (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, unsigned int b, const char *suffix)
 
static void shader_print_untyped_literal (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, uint32_t u, const char *suffix)
 
static void shader_print_subscript (struct vkd3d_d3d_asm_compiler *compiler, unsigned int offset, const struct vkd3d_shader_src_param *rel_addr)
 
static void shader_print_subscript_range (struct vkd3d_d3d_asm_compiler *compiler, unsigned int offset_first, unsigned int offset_last)
 
static void shader_print_register (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, const struct vkd3d_shader_register *reg, bool is_declaration, const char *suffix)
 
static void shader_print_precision (struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_register *reg)
 
static void shader_print_non_uniform (struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_register *reg)
 
static void shader_print_reg_type (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, const struct vkd3d_shader_register *reg, const char *suffix)
 
static void shader_print_write_mask (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, uint32_t mask, const char *suffix)
 
static void shader_print_dst_param (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, const struct vkd3d_shader_dst_param *param, bool is_declaration, const char *suffix)
 
static void shader_dump_ins_modifiers (struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_dst_param *dst)
 
static void shader_print_primitive_type (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, const struct vkd3d_shader_primitive_type *p, const char *suffix)
 
static void shader_print_interpolation_mode (struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, enum vkd3d_shader_interpolation_mode m, const char *suffix)
 
const char * shader_get_type_prefix (enum vkd3d_shader_type type)
 
static void shader_dump_instruction_flags (struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_instruction *ins)
 
static void shader_dump_register_space (struct vkd3d_d3d_asm_compiler *compiler, unsigned int register_space)
 
static void shader_print_opcode (struct vkd3d_d3d_asm_compiler *compiler, enum vkd3d_shader_opcode opcode)
 
static void shader_dump_icb (struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_immediate_constant_buffer *icb)
 
static void shader_dump_instruction (struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_instruction *ins)
 
static const char * get_sysval_semantic_name (enum vkd3d_shader_sysval_semantic semantic)
 
static const char * get_component_type_name (enum vkd3d_shader_component_type type)
 
static const char * get_minimum_precision_name (enum vkd3d_shader_minimum_precision prec)
 
static const char * get_semantic_register_name (enum vkd3d_shader_sysval_semantic semantic)
 
static enum vkd3d_result dump_dxbc_signature (struct vkd3d_d3d_asm_compiler *compiler, const char *name, const char *register_name, const struct shader_signature *signature)
 
static enum vkd3d_result dump_dxbc_signatures (struct vkd3d_d3d_asm_compiler *compiler, const struct vsir_program *program)
 
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)
 
static void trace_signature (const struct shader_signature *signature, const char *signature_type)
 
void vsir_program_trace (const struct vsir_program *program)
 

Variables

static const char *const shader_opcode_names []
 

Function Documentation

◆ d3d_asm_compile()

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 at line 2370 of file d3d_asm.c.

2373{
2374 const struct vkd3d_shader_version *shader_version = &program->shader_version;
2376 struct vkd3d_d3d_asm_compiler compiler =
2377 {
2378 .flags = flags,
2379 };
2382 unsigned int indent, i, j;
2383 const char *indent_str;
2384
2385 static const struct vkd3d_d3d_asm_colours no_colours =
2386 {
2387 .reset = "",
2388 .error = "",
2389 .literal = "",
2390 .modifier = "",
2391 .opcode = "",
2392 .reg = "",
2393 .swizzle = "",
2394 .version = "",
2395 .write_mask = "",
2396 .label = "",
2397 };
2398 static const struct vkd3d_d3d_asm_colours colours =
2399 {
2400 .reset = "\x1b[m",
2401 .error = "\x1b[97;41m",
2402 .literal = "\x1b[95m",
2403 .modifier = "\x1b[36m",
2404 .opcode = "\x1b[96;1m",
2405 .reg = "\x1b[96m",
2406 .swizzle = "\x1b[93m",
2407 .version = "\x1b[36m",
2408 .write_mask = "\x1b[93m",
2409 .label = "\x1b[91m",
2410 };
2411
2414 if (compile_info)
2415 {
2416 for (i = 0; i < compile_info->option_count; ++i)
2417 {
2418 const struct vkd3d_shader_compile_option *option = &compile_info->options[i];
2419
2421 formatting = option->value;
2422 }
2423 }
2424
2426 compiler.colours = colours;
2427 else
2428 compiler.colours = no_colours;
2430 indent_str = " ";
2431 else
2432 indent_str = "";
2433
2434 buffer = &compiler.buffer;
2436
2437 compiler.shader_version = *shader_version;
2438 shader_version = &compiler.shader_version;
2439 vkd3d_string_buffer_printf(buffer, "%s%s_%u_%u%s\n", compiler.colours.version,
2440 shader_get_type_prefix(shader_version->type), shader_version->major,
2441 shader_version->minor, compiler.colours.reset);
2442
2443 /* The signatures we emit only make sense for DXBC shaders. D3DBC
2444 * doesn't even have an explicit concept of signature. */
2445 if (formatting & VKD3D_SHADER_COMPILE_OPTION_FORMATTING_IO_SIGNATURES && shader_version->major >= 4)
2446 {
2447 if ((result = dump_dxbc_signatures(&compiler, program)) < 0)
2448 {
2450 return result;
2451 }
2452 }
2453
2454 indent = 0;
2455 for (i = 0; i < program->instructions.count; ++i)
2456 {
2457 struct vkd3d_shader_instruction *ins = &program->instructions.elements[i];
2458
2459 switch (ins->opcode)
2460 {
2461 case VKD3DSIH_ELSE:
2462 case VKD3DSIH_ENDIF:
2463 case VKD3DSIH_ENDLOOP:
2464 case VKD3DSIH_ENDSWITCH:
2465 if (indent)
2466 --indent;
2467 break;
2468
2469 case VKD3DSIH_LABEL:
2470 case VKD3DSIH_HS_DECLS:
2474 indent = 0;
2475 break;
2476
2477 default:
2478 break;
2479 }
2480
2481 for (j = 0; j < indent; ++j)
2482 {
2483 vkd3d_string_buffer_printf(buffer, "%s", indent_str);
2484 }
2485
2486 shader_dump_instruction(&compiler, ins);
2487
2488 switch (ins->opcode)
2489 {
2490 case VKD3DSIH_ELSE:
2491 case VKD3DSIH_IF:
2492 case VKD3DSIH_IFC:
2493 case VKD3DSIH_LOOP:
2494 case VKD3DSIH_SWITCH:
2495 case VKD3DSIH_LABEL:
2496 ++indent;
2497 break;
2498
2499 default:
2500 break;
2501 }
2502 }
2503
2505
2506 return result;
2507}
static enum vkd3d_result dump_dxbc_signatures(struct vkd3d_d3d_asm_compiler *compiler, const struct vsir_program *program)
Definition: d3d_asm.c:2345
const char * shader_get_type_prefix(enum vkd3d_shader_type type)
Definition: d3d_asm.c:1737
static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_instruction *ins)
Definition: d3d_asm.c:1951
static const WCHAR indent[]
Definition: object.c:1231
GLuint buffer
Definition: glext.h:5915
GLuint program
Definition: glext.h:6723
GLbitfield flags
Definition: glext.h:7161
GLuint64EXT * result
Definition: glext.h:11304
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
Definition: getopt.h:109
WCHAR * name
Definition: getopt.h:110
const char * reset
Definition: d3d_asm.c:359
struct vkd3d_string_buffer buffer
Definition: d3d_asm.c:373
enum vsir_asm_flags flags
Definition: d3d_asm.c:376
struct vkd3d_shader_version shader_version
Definition: d3d_asm.c:374
struct vkd3d_d3d_asm_colours colours
Definition: d3d_asm.c:375
const struct vkd3d_shader_compile_option * options
enum vkd3d_shader_opcode opcode
enum vkd3d_shader_type type
@ VKD3D_SHADER_COMPILE_OPTION_FORMATTING
Definition: vkd3d_shader.h:277
vkd3d_shader_compile_option_formatting_flags
Definition: vkd3d_shader.h:153
@ VKD3D_SHADER_COMPILE_OPTION_FORMATTING_IO_SIGNATURES
Definition: vkd3d_shader.h:165
@ VKD3D_SHADER_COMPILE_OPTION_FORMATTING_HEADER
Definition: vkd3d_shader.h:158
@ VKD3D_SHADER_COMPILE_OPTION_FORMATTING_COLOUR
Definition: vkd3d_shader.h:155
@ VKD3D_SHADER_COMPILE_OPTION_FORMATTING_INDENT
Definition: vkd3d_shader.h:156
void vkd3d_string_buffer_init(struct vkd3d_string_buffer *buffer)
void vkd3d_shader_code_from_string_buffer(struct vkd3d_shader_code *code, struct vkd3d_string_buffer *buffer)
void vkd3d_string_buffer_cleanup(struct vkd3d_string_buffer *buffer)
int vkd3d_string_buffer_printf(struct vkd3d_string_buffer *buffer, const char *format,...)
@ VKD3DSIH_ENDSWITCH
@ VKD3DSIH_HS_JOIN_PHASE
@ VKD3DSIH_LOOP
@ VKD3DSIH_SWITCH
@ VKD3DSIH_IFC
@ VKD3DSIH_HS_DECLS
@ VKD3DSIH_IF
@ VKD3DSIH_ENDIF
@ VKD3DSIH_HS_CONTROL_POINT_PHASE
@ VKD3DSIH_HS_FORK_PHASE
@ VKD3DSIH_ENDLOOP
@ VKD3DSIH_ELSE
@ VKD3DSIH_LABEL
vkd3d_result
Definition: vkd3d_types.h:41
@ VKD3D_OK
Definition: vkd3d_types.h:43
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

Referenced by vsir_program_compile(), and vsir_program_trace().

◆ dump_dxbc_signature()

static enum vkd3d_result dump_dxbc_signature ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  name,
const char *  register_name,
const struct shader_signature *  signature 
)
static

Definition at line 2278 of file d3d_asm.c.

2280{
2281 struct vkd3d_string_buffer *buffer = &compiler->buffer;
2282 unsigned int i;
2283
2284 if (signature->element_count == 0)
2285 return VKD3D_OK;
2286
2288 compiler->colours.opcode, name, compiler->colours.reset);
2289
2290 for (i = 0; i < signature->element_count; ++i)
2291 {
2292 struct signature_element *element = &signature->elements[i];
2293
2294 vkd3d_string_buffer_printf(buffer, "%s.param%s %s", compiler->colours.opcode,
2295 compiler->colours.reset, element->semantic_name);
2296
2297 if (element->semantic_index != 0)
2298 vkd3d_string_buffer_printf(buffer, "%u", element->semantic_index);
2299
2300 if (element->register_index != -1)
2301 {
2302 shader_print_write_mask(compiler, "", element->mask, "");
2303 vkd3d_string_buffer_printf(buffer, ", %s%s%d%s", compiler->colours.reg,
2304 register_name, element->register_index, compiler->colours.reset);
2305 shader_print_write_mask(compiler, "", element->used_mask, "");
2306 }
2307 else
2308 {
2309 vkd3d_string_buffer_printf(buffer, ", %s%s%s", compiler->colours.reg,
2310 get_semantic_register_name(element->sysval_semantic), compiler->colours.reset);
2311 }
2312
2313 if (!element->component_type && !element->sysval_semantic
2314 && !element->min_precision && !element->stream_index)
2315 goto done;
2316
2318 get_component_type_name(element->component_type));
2319
2320 if (!element->sysval_semantic && !element->min_precision && !element->stream_index)
2321 goto done;
2322
2324 get_sysval_semantic_name(element->sysval_semantic));
2325
2326 if (!element->min_precision && !element->stream_index)
2327 goto done;
2328
2330 get_minimum_precision_name(element->min_precision));
2331
2332 if (!element->stream_index)
2333 goto done;
2334
2336 element->stream_index);
2337
2338 done:
2340 }
2341
2342 return VKD3D_OK;
2343}
static const char * get_semantic_register_name(enum vkd3d_shader_sysval_semantic semantic)
Definition: d3d_asm.c:2263
static void shader_print_write_mask(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, uint32_t mask, const char *suffix)
Definition: d3d_asm.c:1467
static const char * get_minimum_precision_name(enum vkd3d_shader_minimum_precision prec)
Definition: d3d_asm.c:2250
static const char * get_component_type_name(enum vkd3d_shader_component_type type)
Definition: d3d_asm.c:2235
static const char * get_sysval_semantic_name(enum vkd3d_shader_sysval_semantic semantic)
Definition: d3d_asm.c:2204
Definition: name.c:39

Referenced by dump_dxbc_signatures().

◆ dump_dxbc_signatures()

static enum vkd3d_result dump_dxbc_signatures ( struct vkd3d_d3d_asm_compiler *  compiler,
const struct vsir_program *  program 
)
static

Definition at line 2345 of file d3d_asm.c.

2347{
2348 enum vkd3d_result ret;
2349
2350 if ((ret = dump_dxbc_signature(compiler, ".input",
2351 program->shader_version.type == VKD3D_SHADER_TYPE_DOMAIN ? "vicp" : "v",
2352 &program->input_signature)) < 0)
2353 return ret;
2354
2355 if ((ret = dump_dxbc_signature(compiler, ".output", "o",
2356 &program->output_signature)) < 0)
2357 return ret;
2358
2359 if ((ret = dump_dxbc_signature(compiler, ".patch_constant",
2360 program->shader_version.type == VKD3D_SHADER_TYPE_DOMAIN ? "vpc" : "o",
2361 &program->patch_constant_signature)) < 0)
2362 return ret;
2363
2364 vkd3d_string_buffer_printf(&compiler->buffer, "%s.text%s\n",
2365 compiler->colours.opcode, compiler->colours.reset);
2366
2367 return VKD3D_OK;
2368}
static enum vkd3d_result dump_dxbc_signature(struct vkd3d_d3d_asm_compiler *compiler, const char *name, const char *register_name, const struct shader_signature *signature)
Definition: d3d_asm.c:2278
return ret
Definition: mutex.c:147
@ VKD3D_SHADER_TYPE_DOMAIN

Referenced by d3d_asm_compile().

◆ get_component_type_name()

static const char * get_component_type_name ( enum vkd3d_shader_component_type  type)
static

Definition at line 2235 of file d3d_asm.c.

2236{
2237 switch (type)
2238 {
2239 case VKD3D_SHADER_COMPONENT_VOID: return "void";
2240 case VKD3D_SHADER_COMPONENT_UINT: return "uint";
2241 case VKD3D_SHADER_COMPONENT_INT: return "int";
2242 case VKD3D_SHADER_COMPONENT_FLOAT: return "float";
2243 case VKD3D_SHADER_COMPONENT_BOOL: return "bool";
2244 case VKD3D_SHADER_COMPONENT_DOUBLE: return "double";
2245 case VKD3D_SHADER_COMPONENT_UINT64: return "uint64";
2246 default: return "??";
2247 }
2248}
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
@ VKD3D_SHADER_COMPONENT_INT
@ VKD3D_SHADER_COMPONENT_UINT
@ VKD3D_SHADER_COMPONENT_DOUBLE
@ VKD3D_SHADER_COMPONENT_UINT64
@ VKD3D_SHADER_COMPONENT_FLOAT
@ VKD3D_SHADER_COMPONENT_VOID
@ VKD3D_SHADER_COMPONENT_BOOL

Referenced by dump_dxbc_signature(), and trace_signature().

◆ get_minimum_precision_name()

static const char * get_minimum_precision_name ( enum vkd3d_shader_minimum_precision  prec)
static

Definition at line 2250 of file d3d_asm.c.

2251{
2252 switch (prec)
2253 {
2254 case VKD3D_SHADER_MINIMUM_PRECISION_NONE: return "NONE";
2255 case VKD3D_SHADER_MINIMUM_PRECISION_FLOAT_16: return "FLOAT_16";
2256 case VKD3D_SHADER_MINIMUM_PRECISION_FIXED_8_2: return "FIXED_8_2";
2257 case VKD3D_SHADER_MINIMUM_PRECISION_INT_16: return "INT_16";
2258 case VKD3D_SHADER_MINIMUM_PRECISION_UINT_16: return "UINT_16";
2259 default: return "??";
2260 }
2261}
@ VKD3D_SHADER_MINIMUM_PRECISION_UINT_16
@ VKD3D_SHADER_MINIMUM_PRECISION_FIXED_8_2
@ VKD3D_SHADER_MINIMUM_PRECISION_NONE
@ VKD3D_SHADER_MINIMUM_PRECISION_FLOAT_16
@ VKD3D_SHADER_MINIMUM_PRECISION_INT_16

Referenced by dump_dxbc_signature(), and trace_signature().

◆ get_semantic_register_name()

static const char * get_semantic_register_name ( enum vkd3d_shader_sysval_semantic  semantic)
static

Definition at line 2263 of file d3d_asm.c.

2264{
2265 switch (semantic)
2266 {
2267 case VKD3D_SHADER_SV_DEPTH: return "oDepth";
2268 case VKD3D_SHADER_SV_DEPTH_GREATER_EQUAL: return "oDepthGE";
2269 case VKD3D_SHADER_SV_DEPTH_LESS_EQUAL: return "oDepthLE";
2270 /* SV_Coverage has name vCoverage when used as an input,
2271 * but it doesn't appear in the signature in that case. */
2272 case VKD3D_SHADER_SV_COVERAGE: return "oMask";
2273 case VKD3D_SHADER_SV_STENCIL_REF: return "oStencilRef";
2274 default: return "??";
2275 }
2276}
@ VKD3D_SHADER_SV_DEPTH_LESS_EQUAL
@ VKD3D_SHADER_SV_COVERAGE
@ VKD3D_SHADER_SV_DEPTH
@ VKD3D_SHADER_SV_DEPTH_GREATER_EQUAL
@ VKD3D_SHADER_SV_STENCIL_REF

Referenced by dump_dxbc_signature().

◆ get_sysval_semantic_name()

static const char * get_sysval_semantic_name ( enum vkd3d_shader_sysval_semantic  semantic)
static

Definition at line 2204 of file d3d_asm.c.

2205{
2206 switch (semantic)
2207 {
2208 case VKD3D_SHADER_SV_NONE: return "NONE";
2209 case VKD3D_SHADER_SV_POSITION: return "POS";
2210 case VKD3D_SHADER_SV_CLIP_DISTANCE: return "CLIPDST";
2211 case VKD3D_SHADER_SV_CULL_DISTANCE: return "CULLDST";
2212 case VKD3D_SHADER_SV_RENDER_TARGET_ARRAY_INDEX: return "RTINDEX";
2213 case VKD3D_SHADER_SV_VIEWPORT_ARRAY_INDEX: return "VPINDEX";
2214 case VKD3D_SHADER_SV_VERTEX_ID: return "VERTID";
2215 case VKD3D_SHADER_SV_PRIMITIVE_ID: return "PRIMID";
2216 case VKD3D_SHADER_SV_INSTANCE_ID: return "INSTID";
2217 case VKD3D_SHADER_SV_IS_FRONT_FACE: return "FFACE";
2218 case VKD3D_SHADER_SV_SAMPLE_INDEX: return "SAMPLE";
2219 case VKD3D_SHADER_SV_TESS_FACTOR_QUADEDGE: return "QUADEDGE";
2220 case VKD3D_SHADER_SV_TESS_FACTOR_QUADINT: return "QUADINT";
2221 case VKD3D_SHADER_SV_TESS_FACTOR_TRIEDGE: return "TRIEDGE";
2222 case VKD3D_SHADER_SV_TESS_FACTOR_TRIINT: return "TRIINT";
2223 case VKD3D_SHADER_SV_TESS_FACTOR_LINEDET: return "LINEDET";
2224 case VKD3D_SHADER_SV_TESS_FACTOR_LINEDEN: return "LINEDEN";
2225 case VKD3D_SHADER_SV_TARGET: return "TARGET";
2226 case VKD3D_SHADER_SV_DEPTH: return "DEPTH";
2227 case VKD3D_SHADER_SV_COVERAGE: return "COVERAGE";
2228 case VKD3D_SHADER_SV_DEPTH_GREATER_EQUAL: return "DEPTHGE";
2229 case VKD3D_SHADER_SV_DEPTH_LESS_EQUAL: return "DEPTHLE";
2230 case VKD3D_SHADER_SV_STENCIL_REF: return "STENCILREF";
2231 default: return "??";
2232 }
2233}
@ VKD3D_SHADER_SV_VERTEX_ID
@ VKD3D_SHADER_SV_RENDER_TARGET_ARRAY_INDEX
@ VKD3D_SHADER_SV_PRIMITIVE_ID
@ VKD3D_SHADER_SV_CULL_DISTANCE
@ VKD3D_SHADER_SV_TESS_FACTOR_TRIEDGE
@ VKD3D_SHADER_SV_TARGET
@ VKD3D_SHADER_SV_NONE
@ VKD3D_SHADER_SV_TESS_FACTOR_LINEDET
@ VKD3D_SHADER_SV_TESS_FACTOR_QUADEDGE
@ VKD3D_SHADER_SV_IS_FRONT_FACE
@ VKD3D_SHADER_SV_VIEWPORT_ARRAY_INDEX
@ VKD3D_SHADER_SV_TESS_FACTOR_QUADINT
@ VKD3D_SHADER_SV_TESS_FACTOR_TRIINT
@ VKD3D_SHADER_SV_TESS_FACTOR_LINEDEN
@ VKD3D_SHADER_SV_INSTANCE_ID
@ VKD3D_SHADER_SV_CLIP_DISTANCE
@ VKD3D_SHADER_SV_SAMPLE_INDEX
@ VKD3D_SHADER_SV_POSITION

Referenced by dump_dxbc_signature(), and trace_signature().

◆ shader_dump_atomic_op_flags()

static void shader_dump_atomic_op_flags ( struct vkd3d_d3d_asm_compiler *  compiler,
uint32_t  atomic_flags 
)
static

Definition at line 431 of file d3d_asm.c.

432{
433 if (atomic_flags & VKD3DARF_SEQ_CST)
434 {
435 vkd3d_string_buffer_printf(&compiler->buffer, "_seqCst");
436 atomic_flags &= ~VKD3DARF_SEQ_CST;
437 }
438 if (atomic_flags & VKD3DARF_VOLATILE)
439 {
440 vkd3d_string_buffer_printf(&compiler->buffer, "_volatile");
441 atomic_flags &= ~VKD3DARF_VOLATILE;
442 }
443
444 if (atomic_flags)
445 vkd3d_string_buffer_printf(&compiler->buffer, "_unknown_flags(%#x)", atomic_flags);
446}
@ VKD3DARF_SEQ_CST
@ VKD3DARF_VOLATILE

Referenced by shader_dump_instruction_flags().

◆ shader_dump_data_type()

static void shader_dump_data_type ( struct vkd3d_d3d_asm_compiler *  compiler,
enum vkd3d_data_type  type 
)
static

Definition at line 671 of file d3d_asm.c.

672{
673 static const char *const data_type_names[] =
674 {
675 [VKD3D_DATA_FLOAT ] = "float",
676 [VKD3D_DATA_INT ] = "int",
677 [VKD3D_DATA_UINT ] = "uint",
678 [VKD3D_DATA_UNORM ] = "unorm",
679 [VKD3D_DATA_SNORM ] = "snorm",
680 [VKD3D_DATA_OPAQUE ] = "opaque",
681 [VKD3D_DATA_MIXED ] = "mixed",
682 [VKD3D_DATA_DOUBLE ] = "double",
683 [VKD3D_DATA_CONTINUED] = "<continued>",
684 [VKD3D_DATA_UNUSED ] = "<unused>",
685 [VKD3D_DATA_UINT8 ] = "uint8",
686 [VKD3D_DATA_UINT64 ] = "uint64",
687 [VKD3D_DATA_BOOL ] = "bool",
688 [VKD3D_DATA_UINT16 ] = "uint16",
689 [VKD3D_DATA_HALF ] = "half",
690 };
691
692 const char *name;
693
694 if (type < ARRAY_SIZE(data_type_names))
695 name = data_type_names[type];
696 else
697 name = "<unknown>";
698
699 vkd3d_string_buffer_printf(&compiler->buffer, "%s", name);
700}
#define ARRAY_SIZE(A)
Definition: main.h:20
@ VKD3D_DATA_UINT64
@ VKD3D_DATA_SNORM
@ VKD3D_DATA_INT
@ VKD3D_DATA_BOOL
@ VKD3D_DATA_UNUSED
@ VKD3D_DATA_DOUBLE
@ VKD3D_DATA_HALF
@ VKD3D_DATA_UINT8
@ VKD3D_DATA_OPAQUE
@ VKD3D_DATA_UINT
@ VKD3D_DATA_UNORM
@ VKD3D_DATA_FLOAT
@ VKD3D_DATA_UINT16
@ VKD3D_DATA_MIXED
@ VKD3D_DATA_CONTINUED

Referenced by shader_dump_resource_data_type(), and shader_print_reg_type().

◆ shader_dump_global_flags()

static void shader_dump_global_flags ( struct vkd3d_d3d_asm_compiler *  compiler,
enum vsir_global_flags  global_flags 
)
static

Definition at line 396 of file d3d_asm.c.

397{
398 unsigned int i;
399
400 static const struct
401 {
403 const char *name;
404 }
405 global_flag_info[] =
406 {
407 {VKD3DSGF_REFACTORING_ALLOWED, "refactoringAllowed"},
408 {VKD3DSGF_FORCE_EARLY_DEPTH_STENCIL, "forceEarlyDepthStencil"},
409 {VKD3DSGF_ENABLE_RAW_AND_STRUCTURED_BUFFERS, "enableRawAndStructuredBuffers"},
410 {VKD3DSGF_ENABLE_MINIMUM_PRECISION, "enableMinimumPrecision"},
411 {VKD3DSGF_SKIP_OPTIMIZATION, "skipOptimization"},
412 {VKD3DSGF_ENABLE_DOUBLE_PRECISION_FLOAT_OPS, "enableDoublePrecisionFloatOps"},
413 {VKD3DSGF_ENABLE_11_1_DOUBLE_EXTENSIONS, "enable11_1DoubleExtensions"},
414 };
415
416 for (i = 0; i < ARRAY_SIZE(global_flag_info); ++i)
417 {
418 if (global_flags & global_flag_info[i].flag)
419 {
420 vkd3d_string_buffer_printf(&compiler->buffer, "%s", global_flag_info[i].name);
421 global_flags &= ~global_flag_info[i].flag;
422 if (global_flags)
423 vkd3d_string_buffer_printf(&compiler->buffer, " | ");
424 }
425 }
426
427 if (global_flags)
428 vkd3d_string_buffer_printf(&compiler->buffer, "unknown_flags(%#"PRIx64")", (uint64_t)global_flags);
429}
UINT64 uint64_t
Definition: types.h:77
#define PRIx64
Definition: inttypes.h:29
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
vsir_global_flags
@ VKD3DSGF_REFACTORING_ALLOWED
@ VKD3DSGF_ENABLE_RAW_AND_STRUCTURED_BUFFERS
@ VKD3DSGF_FORCE_EARLY_DEPTH_STENCIL
@ VKD3DSGF_SKIP_OPTIMIZATION
@ VKD3DSGF_ENABLE_MINIMUM_PRECISION
@ VKD3DSGF_ENABLE_DOUBLE_PRECISION_FLOAT_OPS
@ VKD3DSGF_ENABLE_11_1_DOUBLE_EXTENSIONS

Referenced by shader_dump_instruction().

◆ shader_dump_icb()

static void shader_dump_icb ( struct vkd3d_d3d_asm_compiler *  compiler,
const struct vkd3d_shader_immediate_constant_buffer *  icb 
)
static

Definition at line 1921 of file d3d_asm.c.

1923{
1924 struct vkd3d_string_buffer *buffer = &compiler->buffer;
1925 unsigned int i, j;
1926
1928 if (icb->component_count == 1)
1929 {
1930 for (i = 0; i < icb->element_count; )
1931 {
1932 for (j = 0; i < icb->element_count && j < 4; ++i, ++j)
1933 shader_print_hex_literal(compiler, !j ? " " : ", ", icb->data[i], "");
1935 }
1936 }
1937 else
1938 {
1940 for (i = 0; i < icb->element_count; ++i)
1941 {
1942 shader_print_hex_literal(compiler, " {", icb->data[4 * i + 0], "");
1943 shader_print_hex_literal(compiler, ", ", icb->data[4 * i + 1], "");
1944 shader_print_hex_literal(compiler, ", ", icb->data[4 * i + 2], "");
1945 shader_print_hex_literal(compiler, ", ", icb->data[4 * i + 3], "},\n");
1946 }
1947 }
1949}
static void shader_print_hex_literal(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, unsigned int i, const char *suffix)
Definition: d3d_asm.c:902
#define VKD3D_ASSERT(cond)
Definition: vkd3d_common.h:49
#define VKD3D_VEC4_SIZE

Referenced by shader_dump_instruction().

◆ shader_dump_ins_modifiers()

static void shader_dump_ins_modifiers ( struct vkd3d_d3d_asm_compiler *  compiler,
const struct vkd3d_shader_dst_param *  dst 
)
static

Definition at line 1604 of file d3d_asm.c.

1606{
1607 struct vkd3d_string_buffer *buffer = &compiler->buffer;
1608 uint32_t mmask = dst->modifiers;
1609
1610 switch (dst->shift)
1611 {
1612 case 0:
1613 break;
1614 case 13:
1616 break;
1617 case 14:
1619 break;
1620 case 15:
1622 break;
1623 case 1:
1625 break;
1626 case 2:
1628 break;
1629 case 3:
1631 break;
1632 default:
1633 vkd3d_string_buffer_printf(buffer, "_unhandled_shift(%d)", dst->shift);
1634 break;
1635 }
1636
1637 if (mmask & VKD3DSPDM_SATURATE)
1639 if (mmask & VKD3DSPDM_PARTIALPRECISION)
1641 if (mmask & VKD3DSPDM_MSAMPCENTROID)
1642 vkd3d_string_buffer_printf(buffer, "_centroid");
1643
1644 mmask &= ~VKD3DSPDM_MASK;
1645 if (mmask) FIXME("Unrecognised modifier %#x.\n", mmask);
1646}
#define FIXME(fmt,...)
Definition: precomp.h:53
UINT32 uint32_t
Definition: types.h:75
GLenum GLenum dst
Definition: glext.h:6340
@ VKD3DSPDM_SATURATE
@ VKD3DSPDM_PARTIALPRECISION
@ VKD3DSPDM_MSAMPCENTROID

Referenced by shader_dump_instruction().

◆ shader_dump_instruction()

static void shader_dump_instruction ( struct vkd3d_d3d_asm_compiler *  compiler,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 1951 of file d3d_asm.c.

1953{
1954 struct vkd3d_string_buffer *buffer = &compiler->buffer;
1955 unsigned int i;
1956
1957 compiler->current = ins;
1958
1959 if (ins->predicate)
1960 shader_print_src_param(compiler, "(", ins->predicate, ") ");
1961
1962 /* PixWin marks instructions with the coissue flag with a '+' */
1963 if (ins->coissue)
1965
1966 shader_print_opcode(compiler, ins->opcode);
1967
1968 switch (ins->opcode)
1969 {
1970 case VKD3DSIH_DCL:
1972 vkd3d_string_buffer_printf(buffer, "%s", compiler->colours.opcode);
1973 shader_print_dcl_usage(compiler, "_", &ins->declaration.semantic, ins->flags, "");
1974 shader_dump_ins_modifiers(compiler, &ins->declaration.semantic.resource.reg);
1975 vkd3d_string_buffer_printf(buffer, "%s", compiler->colours.reset);
1976 shader_print_register(compiler, " ", &ins->declaration.semantic.resource.reg.reg, true, "");
1977 shader_dump_register_space(compiler, ins->declaration.semantic.resource.range.space);
1978 break;
1979
1981 shader_print_register(compiler, " ", &ins->declaration.cb.src.reg, true, "");
1982 if (vkd3d_shader_ver_ge(&compiler->shader_version, 6, 0))
1983 shader_print_subscript(compiler, ins->declaration.cb.size, NULL);
1984 else if (vkd3d_shader_ver_ge(&compiler->shader_version, 5, 1))
1985 shader_print_subscript(compiler, ins->declaration.cb.size / VKD3D_VEC4_SIZE / sizeof(float), NULL);
1987 ins->flags & VKD3DSI_INDEXED_DYNAMIC ? "dynamicIndexed" : "immediateIndexed");
1988 shader_dump_register_space(compiler, ins->declaration.cb.range.space);
1989 break;
1990
1993 break;
1994
1996 vkd3d_string_buffer_printf(buffer, " ft%u = {...}", ins->declaration.index);
1997 break;
1998
2002 break;
2003
2006 break;
2007
2009 shader_dump_icb(compiler, ins->declaration.icb);
2010 break;
2011
2013 shader_print_dst_param(compiler, " ", &ins->declaration.index_range.dst, true, "");
2014 shader_print_uint_literal(compiler, " ", ins->declaration.index_range.register_count, "");
2015 break;
2016
2018 vkd3d_string_buffer_printf(buffer, " %sx%u%s", compiler->colours.reg,
2019 ins->declaration.indexable_temp.register_idx, compiler->colours.reset);
2020 shader_print_subscript(compiler, ins->declaration.indexable_temp.register_size, NULL);
2021 shader_print_uint_literal(compiler, ", ", ins->declaration.indexable_temp.component_count, "");
2022 if (ins->declaration.indexable_temp.alignment)
2023 shader_print_uint_literal(compiler, ", align ", ins->declaration.indexable_temp.alignment, "");
2024 if (ins->declaration.indexable_temp.initialiser)
2025 shader_dump_icb(compiler, ins->declaration.indexable_temp.initialiser);
2026 break;
2027
2029 shader_print_interpolation_mode(compiler, " ", ins->flags, "");
2030 shader_print_dst_param(compiler, " ", &ins->declaration.dst, true, "");
2031 break;
2032
2037 shader_print_dst_param(compiler, " ", &ins->declaration.register_semantic.reg, true, "");
2038 shader_print_input_sysval_semantic(compiler, ", ", ins->declaration.register_semantic.sysval_semantic, "");
2039 break;
2040
2042 shader_print_interpolation_mode(compiler, " ", ins->flags, "");
2043 shader_print_dst_param(compiler, " ", &ins->declaration.register_semantic.reg, true, "");
2044 shader_print_input_sysval_semantic(compiler, ", ", ins->declaration.register_semantic.sysval_semantic, "");
2045 break;
2046
2047 case VKD3DSIH_DCL_INPUT:
2049 shader_print_dst_param(compiler, " ", &ins->declaration.dst, true, "");
2050 break;
2051
2054 shader_print_primitive_type(compiler, " ", &ins->declaration.primitive_type, "");
2055 break;
2056
2058 vkd3d_string_buffer_printf(buffer, " fp%u", ins->declaration.fp.index);
2059 shader_print_subscript(compiler, ins->declaration.fp.array_size, NULL);
2060 shader_print_subscript(compiler, ins->declaration.fp.body_count, NULL);
2062 break;
2063
2065 shader_print_dst_param(compiler, " ", &ins->declaration.raw_resource.resource.reg, true, "");
2066 shader_dump_register_space(compiler, ins->declaration.raw_resource.resource.range.space);
2067 break;
2068
2070 shader_print_dst_param(compiler, " ", &ins->declaration.structured_resource.resource.reg, true, "");
2071 shader_print_uint_literal(compiler, ", ", ins->declaration.structured_resource.byte_stride, "");
2072 shader_dump_register_space(compiler, ins->declaration.structured_resource.resource.range.space);
2073 break;
2074
2076 shader_print_register(compiler, " ", &ins->declaration.sampler.src.reg, true,
2077 ins->flags == VKD3DSI_SAMPLER_COMPARISON_MODE ? ", comparisonMode" : "");
2078 shader_dump_register_space(compiler, ins->declaration.sampler.range.space);
2079 break;
2080
2081 case VKD3DSIH_DCL_TEMPS:
2088 shader_print_uint_literal(compiler, " ", ins->declaration.count, "");
2089 break;
2090
2093 break;
2094
2097 break;
2098
2101 break;
2102
2104 shader_print_dst_param(compiler, " ", &ins->declaration.tgsm_raw.reg, true, "");
2105 shader_print_uint_literal(compiler, ", ", ins->declaration.tgsm_raw.byte_count, "");
2106 break;
2107
2109 shader_print_dst_param(compiler, " ", &ins->declaration.tgsm_structured.reg, true, "");
2110 shader_print_uint_literal(compiler, ", ", ins->declaration.tgsm_structured.byte_stride, "");
2111 shader_print_uint_literal(compiler, ", ", ins->declaration.tgsm_structured.structure_count, "");
2112 break;
2113
2115 shader_print_uint_literal(compiler, " ", ins->declaration.thread_group_size.x, "");
2116 shader_print_uint_literal(compiler, ", ", ins->declaration.thread_group_size.y, "");
2117 shader_print_uint_literal(compiler, ", ", ins->declaration.thread_group_size.z, "");
2118 break;
2119
2121 shader_dump_uav_flags(compiler, ins->flags);
2122 shader_print_dst_param(compiler, " ", &ins->declaration.raw_resource.resource.reg, true, "");
2123 shader_dump_register_space(compiler, ins->declaration.raw_resource.resource.range.space);
2124 break;
2125
2127 shader_dump_uav_flags(compiler, ins->flags);
2128 shader_print_dst_param(compiler, " ", &ins->declaration.structured_resource.resource.reg, true, "");
2129 shader_print_uint_literal(compiler, ", ", ins->declaration.structured_resource.byte_stride, "");
2130 shader_dump_register_space(compiler, ins->declaration.structured_resource.resource.range.space);
2131 break;
2132
2133 case VKD3DSIH_DEF:
2134 vkd3d_string_buffer_printf(buffer, " %sc%u%s", compiler->colours.reg,
2135 shader_get_float_offset(ins->dst[0].reg.type, ins->dst[0].reg.idx[0].offset),
2136 compiler->colours.reset);
2137 shader_print_float_literal(compiler, " = ", ins->src[0].reg.u.immconst_f32[0], "");
2138 shader_print_float_literal(compiler, ", ", ins->src[0].reg.u.immconst_f32[1], "");
2139 shader_print_float_literal(compiler, ", ", ins->src[0].reg.u.immconst_f32[2], "");
2140 shader_print_float_literal(compiler, ", ", ins->src[0].reg.u.immconst_f32[3], "");
2141 break;
2142
2143 case VKD3DSIH_DEFI:
2144 vkd3d_string_buffer_printf(buffer, " %si%u%s", compiler->colours.reg,
2145 ins->dst[0].reg.idx[0].offset, compiler->colours.reset);
2146 shader_print_int_literal(compiler, " = ", ins->src[0].reg.u.immconst_u32[0], "");
2147 shader_print_int_literal(compiler, ", ", ins->src[0].reg.u.immconst_u32[1], "");
2148 shader_print_int_literal(compiler, ", ", ins->src[0].reg.u.immconst_u32[2], "");
2149 shader_print_int_literal(compiler, ", ", ins->src[0].reg.u.immconst_u32[3], "");
2150 break;
2151
2152 case VKD3DSIH_DEFB:
2153 vkd3d_string_buffer_printf(buffer, " %sb%u%s", compiler->colours.reg,
2154 ins->dst[0].reg.idx[0].offset, compiler->colours.reset);
2155 shader_print_bool_literal(compiler, " = ", ins->src[0].reg.u.immconst_u32[0], "");
2156 break;
2157
2158 default:
2159 shader_dump_instruction_flags(compiler, ins);
2160
2162 {
2163 vkd3d_string_buffer_printf(buffer, "_indexable(");
2164 if (ins->raw)
2166 if (ins->structured)
2167 vkd3d_string_buffer_printf(buffer, "structured_");
2169 if (ins->resource_stride)
2170 shader_print_uint_literal(compiler, ", stride=", ins->resource_stride, "");
2172 }
2173
2175 {
2176 shader_print_int_literal(compiler, "(", ins->texel_offset.u, "");
2177 shader_print_int_literal(compiler, ",", ins->texel_offset.v, "");
2178 shader_print_int_literal(compiler, ",", ins->texel_offset.w, ")");
2179 }
2180
2186
2187 for (i = 0; i < ins->dst_count; ++i)
2188 {
2189 shader_dump_ins_modifiers(compiler, &ins->dst[i]);
2190 shader_print_dst_param(compiler, !i ? " " : ", ", &ins->dst[i], false, "");
2191 }
2192
2193 /* Other source tokens */
2194 for (i = ins->dst_count; i < (ins->dst_count + ins->src_count); ++i)
2195 {
2196 shader_print_src_param(compiler, !i ? " " : ", ", &ins->src[i - ins->dst_count], "");
2197 }
2198 break;
2199 }
2200
2202}
static void shader_print_bool_literal(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, unsigned int b, const char *suffix)
Definition: d3d_asm.c:909
static void shader_dump_ins_modifiers(struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_dst_param *dst)
Definition: d3d_asm.c:1604
static void shader_print_subscript(struct vkd3d_d3d_asm_compiler *compiler, unsigned int offset, const struct vkd3d_shader_src_param *rel_addr)
Definition: d3d_asm.c:937
static void shader_dump_register_space(struct vkd3d_d3d_asm_compiler *compiler, unsigned int register_space)
Definition: d3d_asm.c:1909
static void shader_print_uint_literal(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, unsigned int i, const char *suffix)
Definition: d3d_asm.c:888
static void shader_print_tessellator_domain(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, enum vkd3d_tessellator_domain d, const char *suffix)
Definition: d3d_asm.c:514
static unsigned int shader_get_float_offset(enum vkd3d_shader_register_type register_type, UINT register_idx)
Definition: d3d_asm.c:382
static void shader_print_dst_param(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, const struct vkd3d_shader_dst_param *param, bool is_declaration, const char *suffix)
Definition: d3d_asm.c:1493
static void shader_print_opcode(struct vkd3d_d3d_asm_compiler *compiler, enum vkd3d_shader_opcode opcode)
Definition: d3d_asm.c:1915
static void shader_dump_resource_type(struct vkd3d_d3d_asm_compiler *compiler, enum vkd3d_shader_resource_type type)
Definition: d3d_asm.c:648
static void shader_print_register(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, const struct vkd3d_shader_register *reg, bool is_declaration, const char *suffix)
Definition: d3d_asm.c:955
static void shader_print_int_literal(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, int i, const char *suffix)
Definition: d3d_asm.c:877
static void shader_dump_global_flags(struct vkd3d_d3d_asm_compiler *compiler, enum vsir_global_flags global_flags)
Definition: d3d_asm.c:396
static void shader_print_primitive_type(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, const struct vkd3d_shader_primitive_type *p, const char *suffix)
Definition: d3d_asm.c:1648
static void shader_print_input_sysval_semantic(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, enum vkd3d_shader_input_sysval_semantic semantic, const char *suffix)
Definition: d3d_asm.c:598
static void shader_print_interpolation_mode(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, enum vkd3d_shader_interpolation_mode m, const char *suffix)
Definition: d3d_asm.c:1700
static void shader_print_float_literal(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, float f, const char *suffix)
Definition: d3d_asm.c:845
static void shader_dump_uav_flags(struct vkd3d_d3d_asm_compiler *compiler, uint32_t uav_flags)
Definition: d3d_asm.c:492
static void shader_print_src_param(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, const struct vkd3d_shader_src_param *param, const char *suffix)
Definition: d3d_asm.c:1513
static void shader_dump_instruction_flags(struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_instruction *ins)
Definition: d3d_asm.c:1774
static void shader_print_tessellator_partitioning(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, enum vkd3d_shader_tessellator_partitioning p, const char *suffix)
Definition: d3d_asm.c:569
static void shader_dump_resource_data_type(struct vkd3d_d3d_asm_compiler *compiler, const enum vkd3d_data_type *type)
Definition: d3d_asm.c:702
static void shader_print_dcl_usage(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, const struct vkd3d_shader_semantic *semantic, uint32_t flags, const char *suffix)
Definition: d3d_asm.c:717
static void shader_print_tessellator_output_primitive(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, enum vkd3d_shader_tessellator_output_primitive p, const char *suffix)
Definition: d3d_asm.c:540
static void shader_dump_icb(struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_immediate_constant_buffer *icb)
Definition: d3d_asm.c:1921
#define NULL
Definition: types.h:112
const struct vkd3d_shader_instruction * current
Definition: d3d_asm.c:377
struct vkd3d_shader_src_param * src
struct vkd3d_shader_sampler sampler
enum vsir_global_flags global_flags
struct vkd3d_shader_constant_buffer cb
const struct vkd3d_shader_src_param * predicate
struct vsir_thread_group_size thread_group_size
const struct vkd3d_shader_immediate_constant_buffer * icb
enum vkd3d_shader_tessellator_partitioning tessellator_partitioning
struct vkd3d_shader_texel_offset texel_offset
struct vkd3d_shader_tgsm_raw tgsm_raw
struct vkd3d_shader_raw_resource raw_resource
struct vkd3d_shader_register_semantic register_semantic
enum vkd3d_shader_tessellator_output_primitive tessellator_output_primitive
enum vkd3d_tessellator_domain tessellator_domain
struct vkd3d_shader_indexable_temp indexable_temp
enum vkd3d_shader_resource_type resource_type
union vkd3d_shader_instruction::@6020 declaration
struct vkd3d_shader_function_table_pointer fp
struct vkd3d_shader_tgsm_structured tgsm_structured
enum vkd3d_data_type resource_data_type[VKD3D_VEC4_SIZE]
struct vkd3d_shader_semantic semantic
struct vkd3d_shader_structured_resource structured_resource
struct vkd3d_shader_dst_param * dst
struct vkd3d_shader_index_range index_range
struct vkd3d_shader_primitive_type primitive_type
@ VKD3D_SHADER_RESOURCE_NONE
static bool vkd3d_shader_instruction_has_texel_offset(const struct vkd3d_shader_instruction *ins)
static bool vkd3d_shader_ver_ge(const struct vkd3d_shader_version *v, unsigned int major, unsigned int minor)
#define VKD3DSI_INDEXED_DYNAMIC
#define VKD3DSI_SAMPLER_COMPARISON_MODE
@ VKD3DSIH_DCL_IMMEDIATE_CONSTANT_BUFFER
@ VKD3DSIH_DCL_HS_JOIN_PHASE_INSTANCE_COUNT
@ VKD3DSIH_DCL_TESSELLATOR_OUTPUT_PRIMITIVE
@ VKD3DSIH_DCL_INPUT_CONTROL_POINT_COUNT
@ VKD3DSIH_DCL_INPUT_PS
@ VKD3DSIH_DCL_INTERFACE
@ VKD3DSIH_DCL_INPUT_PRIMITIVE
@ VKD3DSIH_DCL_OUTPUT
@ VKD3DSIH_DCL_GS_INSTANCES
@ VKD3DSIH_DCL_OUTPUT_SIV
@ VKD3DSIH_DCL_FUNCTION_TABLE
@ VKD3DSIH_DCL_RESOURCE_RAW
@ VKD3DSIH_DCL_VERTICES_OUT
@ VKD3DSIH_DCL_SAMPLER
@ VKD3DSIH_DCL_INPUT_SGV
@ VKD3DSIH_DCL_OUTPUT_TOPOLOGY
@ VKD3DSIH_DCL_UAV_RAW
@ VKD3DSIH_DCL_GLOBAL_FLAGS
@ VKD3DSIH_DCL_FUNCTION_BODY
@ VKD3DSIH_DCL_HS_MAX_TESSFACTOR
@ VKD3DSIH_DCL_TEMPS
@ VKD3DSIH_DCL_UAV_STRUCTURED
@ VKD3DSIH_DCL_INPUT
@ VKD3DSIH_DCL_INPUT_PS_SIV
@ VKD3DSIH_DCL_TGSM_RAW
@ VKD3DSIH_DCL_HS_FORK_PHASE_INSTANCE_COUNT
@ VKD3DSIH_DCL_THREAD_GROUP
@ VKD3DSIH_DEFB
@ VKD3DSIH_DEF
@ VKD3DSIH_DCL_TGSM_STRUCTURED
@ VKD3DSIH_DCL_RESOURCE_STRUCTURED
@ VKD3DSIH_DEFI
@ VKD3DSIH_DCL_INPUT_SIV
@ VKD3DSIH_DCL_TESSELLATOR_DOMAIN
@ VKD3DSIH_DCL_OUTPUT_CONTROL_POINT_COUNT
@ VKD3DSIH_DCL
@ VKD3DSIH_DCL_UAV_TYPED
@ VKD3DSIH_DCL_INDEX_RANGE
@ VKD3DSIH_DCL_INPUT_PS_SGV
@ VKD3DSIH_DCL_CONSTANT_BUFFER
@ VKD3DSIH_DCL_INDEXABLE_TEMP
@ VKD3DSIH_DCL_TESSELLATOR_PARTITIONING

Referenced by d3d_asm_compile().

◆ shader_dump_instruction_flags()

static void shader_dump_instruction_flags ( struct vkd3d_d3d_asm_compiler *  compiler,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 1774 of file d3d_asm.c.

1776{
1777 struct vkd3d_string_buffer *buffer = &compiler->buffer;
1778
1779 switch (ins->opcode)
1780 {
1781 case VKD3DSIH_BREAKP:
1782 case VKD3DSIH_CONTINUEP:
1783 case VKD3DSIH_DISCARD:
1784 case VKD3DSIH_IF:
1785 case VKD3DSIH_RETP:
1786 switch (ins->flags)
1787 {
1790 break;
1793 break;
1794 default:
1795 vkd3d_string_buffer_printf(buffer, "_unrecognized(%#x)", ins->flags);
1796 break;
1797 }
1798 break;
1799
1800 case VKD3DSIH_IFC:
1801 case VKD3DSIH_BREAKC:
1802 switch (ins->flags)
1803 {
1806 break;
1809 break;
1812 break;
1815 break;
1818 break;
1821 break;
1822 default:
1823 vkd3d_string_buffer_printf(buffer, "_(%u)", ins->flags);
1824 break;
1825 }
1826 break;
1827
1828 case VKD3DSIH_RESINFO:
1829 switch (ins->flags)
1830 {
1831 case VKD3DSI_NONE:
1832 break;
1834 vkd3d_string_buffer_printf(buffer, "_rcpFloat");
1835 break;
1838 break;
1839 default:
1840 vkd3d_string_buffer_printf(buffer, "_unrecognized(%#x)", ins->flags);
1841 break;
1842 }
1843 break;
1844
1846 switch (ins->flags)
1847 {
1848 case VKD3DSI_NONE:
1849 break;
1852 break;
1853 default:
1854 vkd3d_string_buffer_printf(buffer, "_unrecognized(%#x)", ins->flags);
1855 break;
1856 }
1857 break;
1858
1869 shader_dump_atomic_op_flags(compiler, ins->flags);
1870 break;
1871
1872 case VKD3DSIH_SYNC:
1873 shader_dump_sync_flags(compiler, ins->flags);
1874 break;
1875
1876 case VKD3DSIH_TEX:
1877 if (vkd3d_shader_ver_ge(&compiler->shader_version, 2, 0))
1878 {
1879 if (ins->flags & VKD3DSI_TEXLD_PROJECT)
1881 else if (ins->flags & VKD3DSI_TEXLD_BIAS)
1883 }
1884 break;
1885
1894 vkd3d_string_buffer_printf(&compiler->buffer, (ins->flags & VKD3DSI_WAVE_PREFIX) ? "_prefix" : "_active");
1895 break;
1896
1897 case VKD3DSIH_ISHL:
1898 case VKD3DSIH_ISHR:
1899 case VKD3DSIH_USHR:
1900 if (ins->flags & VKD3DSI_SHIFT_UNMASKED)
1901 vkd3d_string_buffer_printf(buffer, "_unmasked");
1902 /* fall through */
1903 default:
1904 shader_dump_precise_flags(compiler, ins->flags);
1905 break;
1906 }
1907}
static void shader_dump_sync_flags(struct vkd3d_d3d_asm_compiler *compiler, uint32_t sync_flags)
Definition: d3d_asm.c:448
static void shader_dump_precise_flags(struct vkd3d_d3d_asm_compiler *compiler, uint32_t flags)
Definition: d3d_asm.c:475
static void shader_dump_atomic_op_flags(struct vkd3d_d3d_asm_compiler *compiler, uint32_t atomic_flags)
Definition: d3d_asm.c:431
#define VKD3DSI_TEXLD_BIAS
#define VKD3DSI_WAVE_PREFIX
#define VKD3DSI_TEXLD_PROJECT
@ VKD3DSIH_RESINFO
@ VKD3DSIH_WAVE_OP_IMAX
@ VKD3DSIH_TEX
@ VKD3DSIH_IMM_ATOMIC_UMAX
@ VKD3DSIH_ISHL
@ VKD3DSIH_SAMPLE_INFO
@ VKD3DSIH_WAVE_OP_MAX
@ VKD3DSIH_RETP
@ VKD3DSIH_WAVE_OP_UMIN
@ VKD3DSIH_IMM_ATOMIC_XOR
@ VKD3DSIH_ISHR
@ VKD3DSIH_DISCARD
@ VKD3DSIH_BREAKC
@ VKD3DSIH_IMM_ATOMIC_IADD
@ VKD3DSIH_IMM_ATOMIC_EXCH
@ VKD3DSIH_SYNC
@ VKD3DSIH_WAVE_OP_UMAX
@ VKD3DSIH_IMM_ATOMIC_IMIN
@ VKD3DSIH_IMM_ATOMIC_IMAX
@ VKD3DSIH_CONTINUEP
@ VKD3DSIH_IMM_ATOMIC_AND
@ VKD3DSIH_WAVE_OP_MUL
@ VKD3DSIH_IMM_ATOMIC_OR
@ VKD3DSIH_WAVE_OP_ADD
@ VKD3DSIH_USHR
@ VKD3DSIH_WAVE_OP_IMIN
@ VKD3DSIH_WAVE_OP_MIN
@ VKD3DSIH_IMM_ATOMIC_UMIN
@ VKD3DSIH_BREAKP
@ VKD3DSIH_IMM_ATOMIC_CMP_EXCH
#define VKD3DSI_RESINFO_UINT
#define VKD3DSI_NONE
#define VKD3DSI_SAMPLE_INFO_UINT
@ VKD3D_SHADER_CONDITIONAL_OP_NZ
@ VKD3D_SHADER_CONDITIONAL_OP_Z
#define VKD3DSI_RESINFO_RCP_FLOAT
@ VKD3D_SHADER_REL_OP_LT
@ VKD3D_SHADER_REL_OP_GT
@ VKD3D_SHADER_REL_OP_EQ
@ VKD3D_SHADER_REL_OP_GE
@ VKD3D_SHADER_REL_OP_NE
@ VKD3D_SHADER_REL_OP_LE
#define VKD3DSI_SHIFT_UNMASKED

Referenced by shader_dump_instruction().

◆ shader_dump_precise_flags()

static void shader_dump_precise_flags ( struct vkd3d_d3d_asm_compiler *  compiler,
uint32_t  flags 
)
static

Definition at line 475 of file d3d_asm.c.

476{
478 return;
479
480 vkd3d_string_buffer_printf(&compiler->buffer, " [precise");
482 {
483 vkd3d_string_buffer_printf(&compiler->buffer, "(%s%s%s%s)",
484 flags & VKD3DSI_PRECISE_X ? "x" : "",
485 flags & VKD3DSI_PRECISE_Y ? "y" : "",
486 flags & VKD3DSI_PRECISE_Z ? "z" : "",
487 flags & VKD3DSI_PRECISE_W ? "w" : "");
488 }
489 vkd3d_string_buffer_printf(&compiler->buffer, "]");
490}
#define VKD3DSI_PRECISE_XYZW
#define VKD3DSI_PRECISE_X
#define VKD3DSI_PRECISE_Z
#define VKD3DSI_PRECISE_W
#define VKD3DSI_PRECISE_Y

Referenced by shader_dump_instruction_flags().

◆ shader_dump_register_space()

static void shader_dump_register_space ( struct vkd3d_d3d_asm_compiler *  compiler,
unsigned int  register_space 
)
static

Definition at line 1909 of file d3d_asm.c.

1910{
1911 if (vkd3d_shader_ver_ge(&compiler->shader_version, 5, 1))
1912 shader_print_uint_literal(compiler, ", space=", register_space, "");
1913}

Referenced by shader_dump_instruction().

◆ shader_dump_resource_data_type()

static void shader_dump_resource_data_type ( struct vkd3d_d3d_asm_compiler *  compiler,
const enum vkd3d_data_type *  type 
)
static

Definition at line 702 of file d3d_asm.c.

703{
704 int i;
705
706 vkd3d_string_buffer_printf(&compiler->buffer, "(");
707
708 for (i = 0; i < 4; i++)
709 {
710 vkd3d_string_buffer_printf(&compiler->buffer, "%s", i == 0 ? "" : ",");
711 shader_dump_data_type(compiler, type[i]);
712 }
713
714 vkd3d_string_buffer_printf(&compiler->buffer, ")");
715}
static void shader_dump_data_type(struct vkd3d_d3d_asm_compiler *compiler, enum vkd3d_data_type type)
Definition: d3d_asm.c:671

Referenced by shader_dump_instruction(), and shader_print_dcl_usage().

◆ shader_dump_resource_type()

static void shader_dump_resource_type ( struct vkd3d_d3d_asm_compiler *  compiler,
enum vkd3d_shader_resource_type  type 
)
static

Definition at line 648 of file d3d_asm.c.

649{
650 static const char *const resource_type_names[] =
651 {
652 [VKD3D_SHADER_RESOURCE_NONE ] = "none",
653 [VKD3D_SHADER_RESOURCE_BUFFER ] = "buffer",
654 [VKD3D_SHADER_RESOURCE_TEXTURE_1D ] = "texture1d",
655 [VKD3D_SHADER_RESOURCE_TEXTURE_2D ] = "texture2d",
656 [VKD3D_SHADER_RESOURCE_TEXTURE_2DMS ] = "texture2dms",
657 [VKD3D_SHADER_RESOURCE_TEXTURE_3D ] = "texture3d",
658 [VKD3D_SHADER_RESOURCE_TEXTURE_CUBE ] = "texturecube",
659 [VKD3D_SHADER_RESOURCE_TEXTURE_1DARRAY ] = "texture1darray",
660 [VKD3D_SHADER_RESOURCE_TEXTURE_2DARRAY ] = "texture2darray",
661 [VKD3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY] = "texture2dmsarray",
662 [VKD3D_SHADER_RESOURCE_TEXTURE_CUBEARRAY] = "texturecubearray",
663 };
664
665 if (type < ARRAY_SIZE(resource_type_names))
666 vkd3d_string_buffer_printf(&compiler->buffer, "%s", resource_type_names[type]);
667 else
668 vkd3d_string_buffer_printf(&compiler->buffer, "unknown");
669}
@ VKD3D_SHADER_RESOURCE_TEXTURE_2DARRAY
@ VKD3D_SHADER_RESOURCE_TEXTURE_2DMS
@ VKD3D_SHADER_RESOURCE_TEXTURE_3D
@ VKD3D_SHADER_RESOURCE_TEXTURE_1DARRAY
@ VKD3D_SHADER_RESOURCE_BUFFER
@ VKD3D_SHADER_RESOURCE_TEXTURE_CUBE
@ VKD3D_SHADER_RESOURCE_TEXTURE_1D
@ VKD3D_SHADER_RESOURCE_TEXTURE_CUBEARRAY
@ VKD3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY
@ VKD3D_SHADER_RESOURCE_TEXTURE_2D

Referenced by shader_dump_instruction(), and shader_print_dcl_usage().

◆ shader_dump_sync_flags()

static void shader_dump_sync_flags ( struct vkd3d_d3d_asm_compiler *  compiler,
uint32_t  sync_flags 
)
static

Definition at line 448 of file d3d_asm.c.

449{
450 if (sync_flags & VKD3DSSF_GLOBAL_UAV)
451 {
452 vkd3d_string_buffer_printf(&compiler->buffer, "_uglobal");
453 sync_flags &= ~VKD3DSSF_GLOBAL_UAV;
454 }
455 if (sync_flags & VKD3DSSF_THREAD_GROUP_UAV)
456 {
457 vkd3d_string_buffer_printf(&compiler->buffer, "_ugroup");
458 sync_flags &= ~VKD3DSSF_THREAD_GROUP_UAV;
459 }
460 if (sync_flags & VKD3DSSF_GROUP_SHARED_MEMORY)
461 {
462 vkd3d_string_buffer_printf(&compiler->buffer, "_g");
463 sync_flags &= ~VKD3DSSF_GROUP_SHARED_MEMORY;
464 }
465 if (sync_flags & VKD3DSSF_THREAD_GROUP)
466 {
467 vkd3d_string_buffer_printf(&compiler->buffer, "_t");
468 sync_flags &= ~VKD3DSSF_THREAD_GROUP;
469 }
470
471 if (sync_flags)
472 vkd3d_string_buffer_printf(&compiler->buffer, "_unknown_flags(%#x)", sync_flags);
473}
@ VKD3DSSF_GLOBAL_UAV
@ VKD3DSSF_GROUP_SHARED_MEMORY
@ VKD3DSSF_THREAD_GROUP
@ VKD3DSSF_THREAD_GROUP_UAV

Referenced by shader_dump_instruction_flags().

◆ shader_dump_uav_flags()

static void shader_dump_uav_flags ( struct vkd3d_d3d_asm_compiler *  compiler,
uint32_t  uav_flags 
)
static

Definition at line 492 of file d3d_asm.c.

493{
494 if (uav_flags & VKD3DSUF_GLOBALLY_COHERENT)
495 {
496 vkd3d_string_buffer_printf(&compiler->buffer, "_glc");
497 uav_flags &= ~VKD3DSUF_GLOBALLY_COHERENT;
498 }
499 if (uav_flags & VKD3DSUF_ORDER_PRESERVING_COUNTER)
500 {
501 vkd3d_string_buffer_printf(&compiler->buffer, "_opc");
502 uav_flags &= ~VKD3DSUF_ORDER_PRESERVING_COUNTER;
503 }
504 if (uav_flags & VKD3DSUF_RASTERISER_ORDERED_VIEW)
505 {
506 vkd3d_string_buffer_printf(&compiler->buffer, "_rov");
507 uav_flags &= ~VKD3DSUF_RASTERISER_ORDERED_VIEW;
508 }
509
510 if (uav_flags)
511 vkd3d_string_buffer_printf(&compiler->buffer, "_unknown_flags(%#x)", uav_flags);
512}
@ VKD3DSUF_GLOBALLY_COHERENT
@ VKD3DSUF_RASTERISER_ORDERED_VIEW
@ VKD3DSUF_ORDER_PRESERVING_COUNTER

Referenced by shader_dump_instruction(), and shader_print_dcl_usage().

◆ shader_get_float_offset()

static unsigned int shader_get_float_offset ( enum vkd3d_shader_register_type  register_type,
UINT  register_idx 
)
static

Definition at line 382 of file d3d_asm.c.

383{
384 switch (register_type)
385 {
386 case VKD3DSPR_CONST: return register_idx;
387 case VKD3DSPR_CONST2: return 2048 + register_idx;
388 case VKD3DSPR_CONST3: return 4096 + register_idx;
389 case VKD3DSPR_CONST4: return 6144 + register_idx;
390 default:
391 FIXME("Unsupported register type: %u.\n", register_type);
392 return register_idx;
393 }
394}
@ VKD3DSPR_CONST4
@ VKD3DSPR_CONST
@ VKD3DSPR_CONST2
@ VKD3DSPR_CONST3

Referenced by shader_dump_instruction(), and shader_print_register().

◆ shader_get_type_prefix()

const char * shader_get_type_prefix ( enum vkd3d_shader_type  type)

Definition at line 1737 of file d3d_asm.c.

1738{
1739 switch (type)
1740 {
1742 return "vs";
1743
1745 return "hs";
1746
1748 return "ds";
1749
1751 return "gs";
1752
1754 return "ps";
1755
1757 return "cs";
1758
1760 return "fx";
1761
1763 return "tx";
1764
1766 return "lib";
1767
1768 default:
1769 FIXME("Unhandled shader type %#x.\n", type);
1770 return "unknown";
1771 }
1772}
@ VKD3D_SHADER_TYPE_VERTEX
@ VKD3D_SHADER_TYPE_HULL
@ VKD3D_SHADER_TYPE_LIBRARY
@ VKD3D_SHADER_TYPE_GEOMETRY
@ VKD3D_SHADER_TYPE_COMPUTE
@ VKD3D_SHADER_TYPE_TEXTURE
@ VKD3D_SHADER_TYPE_PIXEL
@ VKD3D_SHADER_TYPE_EFFECT

Referenced by d3d_asm_compile().

◆ shader_print_bool_literal()

static void shader_print_bool_literal ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
unsigned int  b,
const char *  suffix 
)
static

Definition at line 909 of file d3d_asm.c.

911{
912 vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%s%s%s", prefix,
913 compiler->colours.literal, b ? "true" : "false", compiler->colours.reset, suffix);
914}
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
Character const *const prefix
Definition: tempnam.cpp:195

Referenced by shader_dump_instruction().

◆ shader_print_dcl_usage()

static void shader_print_dcl_usage ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
const struct vkd3d_shader_semantic *  semantic,
uint32_t  flags,
const char *  suffix 
)
static

Definition at line 717 of file d3d_asm.c.

719{
720 struct vkd3d_string_buffer *buffer = &compiler->buffer;
721 unsigned int usage_idx;
722 const char *usage;
723 bool indexed;
724
725 if (semantic->resource.reg.reg.type == VKD3DSPR_COMBINED_SAMPLER)
726 {
727 switch (semantic->resource_type)
728 {
730 usage = "2d";
731 break;
733 usage = "volume";
734 break;
736 usage = "cube";
737 break;
738 default:
739 vkd3d_string_buffer_printf(buffer, "%s%s<unhandled resource type %#x>%s%s",
740 prefix, compiler->colours.error, semantic->resource_type, compiler->colours.reset, suffix);
741 return;
742 }
743
744 vkd3d_string_buffer_printf(buffer, "%s%s%s", prefix, usage, suffix);
745 return;
746 }
747
748 if (semantic->resource.reg.reg.type == VKD3DSPR_RESOURCE || semantic->resource.reg.reg.type == VKD3DSPR_UAV)
749 {
751 if (semantic->resource.reg.reg.type == VKD3DSPR_RESOURCE)
753
754 shader_dump_resource_type(compiler, semantic->resource_type);
757 {
759 }
760 if (semantic->resource.reg.reg.type == VKD3DSPR_UAV)
761 shader_dump_uav_flags(compiler, flags);
764 vkd3d_string_buffer_printf(buffer, "%s", suffix);
765 return;
766 }
767
768 /* Pixel shaders 3.0 don't have usage semantics. */
769 if (!vkd3d_shader_ver_ge(&compiler->shader_version, 3, 0)
770 && compiler->shader_version.type == VKD3D_SHADER_TYPE_PIXEL)
771 return;
772
773 indexed = false;
774 usage_idx = semantic->usage_idx;
775 switch (semantic->usage)
776 {
778 usage = "position";
779 indexed = true;
780 break;
782 usage = "blend";
783 break;
785 usage = "weight";
786 break;
788 usage = "normal";
789 indexed = true;
790 break;
792 usage = "psize";
793 break;
795 if (semantic->usage_idx)
796 {
797 usage = "specular";
798 indexed = true;
799 --usage_idx;
800 break;
801 }
802 usage = "color";
803 break;
805 usage = "texcoord";
806 indexed = true;
807 break;
809 usage = "tangent";
810 break;
812 usage = "binormal";
813 break;
815 usage = "tessfactor";
816 break;
818 usage = "positionT";
819 indexed = true;
820 break;
822 usage = "fog";
823 break;
825 usage = "depth";
826 break;
828 usage = "sample";
829 break;
830 default:
831 vkd3d_string_buffer_printf(buffer, "%s%s<unhandled usage %#x, index %u>%s%s",
832 prefix, compiler->colours.error, semantic->usage, usage_idx, compiler->colours.reset, suffix);
833 return;
834 }
835
836 if (indexed)
838 else
839 vkd3d_string_buffer_printf(buffer, "%s%s%s", prefix, usage, suffix);
840}
BYTE usage_idx
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
enum vkd3d_shader_resource_type resource_type
enum vkd3d_data_type resource_data_type[VKD3D_VEC4_SIZE]
struct vkd3d_shader_resource resource
enum vkd3d_decl_usage usage
@ VKD3DSPR_RESOURCE
@ VKD3DSPR_UAV
@ VKD3DSPR_COMBINED_SAMPLER
@ VKD3D_DECL_USAGE_SAMPLE
@ VKD3D_DECL_USAGE_BLEND_WEIGHT
@ VKD3D_DECL_USAGE_BINORMAL
@ VKD3D_DECL_USAGE_TEXCOORD
@ VKD3D_DECL_USAGE_BLEND_INDICES
@ VKD3D_DECL_USAGE_TANGENT
@ VKD3D_DECL_USAGE_COLOR
@ VKD3D_DECL_USAGE_POSITION
@ VKD3D_DECL_USAGE_PSIZE
@ VKD3D_DECL_USAGE_TESS_FACTOR
@ VKD3D_DECL_USAGE_NORMAL
@ VKD3D_DECL_USAGE_DEPTH
@ VKD3D_DECL_USAGE_FOG
@ VKD3D_DECL_USAGE_POSITIONT

Referenced by shader_dump_instruction().

◆ shader_print_double_literal()

static void shader_print_double_literal ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
double  d,
const char *  suffix 
)
static

Definition at line 861 of file d3d_asm.c.

863{
864 const char *sign = "";
865
866 if (isfinite(d) && signbit(d))
867 {
868 sign = "-";
869 d = -d;
870 }
871
872 vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%s", prefix, sign, compiler->colours.literal);
874 vkd3d_string_buffer_printf(&compiler->buffer, "l%s%s", compiler->colours.reset, suffix);
875}
#define isfinite(x)
Definition: math.h:363
#define signbit(x)
Definition: math.h:362
#define d
Definition: ke_i.h:81
#define sign(x)
Definition: mapdesc.cc:613
int vkd3d_string_buffer_print_f64(struct vkd3d_string_buffer *buffer, double d)

Referenced by shader_print_register().

◆ shader_print_dst_param()

static void shader_print_dst_param ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
const struct vkd3d_shader_dst_param *  param,
bool  is_declaration,
const char *  suffix 
)
static

Definition at line 1493 of file d3d_asm.c.

1495{
1496 uint32_t write_mask = param->write_mask;
1497
1498 shader_print_register(compiler, prefix, &param->reg, is_declaration, "");
1499
1500 if (write_mask && param->reg.dimension == VSIR_DIMENSION_VEC4)
1501 {
1502 if (data_type_is_64_bit(param->reg.data_type))
1503 write_mask = vsir_write_mask_32_from_64(write_mask);
1504
1505 shader_print_write_mask(compiler, "", write_mask, "");
1506 }
1507
1508 shader_print_precision(compiler, &param->reg);
1509 shader_print_non_uniform(compiler, &param->reg);
1510 shader_print_reg_type(compiler, "", &param->reg, suffix);
1511}
static void shader_print_non_uniform(struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_register *reg)
Definition: d3d_asm.c:1428
static void shader_print_precision(struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_register *reg)
Definition: d3d_asm.c:1394
static void shader_print_reg_type(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, const struct vkd3d_shader_register *reg, const char *suffix)
Definition: d3d_asm.c:1435
GLfloat param
Definition: glext.h:5796
static bool data_type_is_64_bit(enum vkd3d_data_type data_type)
@ VSIR_DIMENSION_VEC4
static uint32_t vsir_write_mask_32_from_64(uint32_t write_mask64)

Referenced by shader_dump_instruction().

◆ shader_print_float_literal()

static void shader_print_float_literal ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
float  f,
const char *  suffix 
)
static

Definition at line 845 of file d3d_asm.c.

847{
848 const char *sign = "";
849
850 if (isfinite(f) && signbit(f))
851 {
852 sign = "-";
853 f = -f;
854 }
855
856 vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%s", prefix, sign, compiler->colours.literal);
858 vkd3d_string_buffer_printf(&compiler->buffer, "%s%s", compiler->colours.reset, suffix);
859}
GLfloat f
Definition: glext.h:7540
#define f
Definition: ke_i.h:83
int vkd3d_string_buffer_print_f32(struct vkd3d_string_buffer *buffer, float f)

Referenced by shader_dump_instruction(), shader_print_register(), and shader_print_untyped_literal().

◆ shader_print_hex_literal()

static void shader_print_hex_literal ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
unsigned int  i,
const char *  suffix 
)
static

Definition at line 902 of file d3d_asm.c.

904{
905 vkd3d_string_buffer_printf(&compiler->buffer, "%s%s0x%08x%s%s",
906 prefix, compiler->colours.literal, i, compiler->colours.reset, suffix);
907}

Referenced by shader_dump_icb(), and shader_print_untyped_literal().

◆ shader_print_input_sysval_semantic()

static void shader_print_input_sysval_semantic ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
enum vkd3d_shader_input_sysval_semantic  semantic,
const char *  suffix 
)
static

Definition at line 598 of file d3d_asm.c.

600{
601 unsigned int i;
602
603 static const struct
604 {
605 enum vkd3d_shader_input_sysval_semantic sysval_semantic;
606 const char *sysval_name;
607 }
608 shader_input_sysval_semantic_names[] =
609 {
610 {VKD3D_SIV_POSITION, "position"},
611 {VKD3D_SIV_CLIP_DISTANCE, "clip_distance"},
612 {VKD3D_SIV_CULL_DISTANCE, "cull_distance"},
613 {VKD3D_SIV_RENDER_TARGET_ARRAY_INDEX, "render_target_array_index"},
614 {VKD3D_SIV_VIEWPORT_ARRAY_INDEX, "viewport_array_index"},
615 {VKD3D_SIV_VERTEX_ID, "vertex_id"},
616 {VKD3D_SIV_INSTANCE_ID, "instance_id"},
617 {VKD3D_SIV_PRIMITIVE_ID, "primitive_id"},
618 {VKD3D_SIV_IS_FRONT_FACE, "is_front_face"},
619 {VKD3D_SIV_SAMPLE_INDEX, "sample_index"},
620 {VKD3D_SIV_QUAD_U0_TESS_FACTOR, "finalQuadUeq0EdgeTessFactor"},
621 {VKD3D_SIV_QUAD_V0_TESS_FACTOR, "finalQuadVeq0EdgeTessFactor"},
622 {VKD3D_SIV_QUAD_U1_TESS_FACTOR, "finalQuadUeq1EdgeTessFactor"},
623 {VKD3D_SIV_QUAD_V1_TESS_FACTOR, "finalQuadVeq1EdgeTessFactor"},
624 {VKD3D_SIV_QUAD_U_INNER_TESS_FACTOR, "finalQuadUInsideTessFactor"},
625 {VKD3D_SIV_QUAD_V_INNER_TESS_FACTOR, "finalQuadVInsideTessFactor"},
626 {VKD3D_SIV_TRIANGLE_U_TESS_FACTOR, "finalTriUeq0EdgeTessFactor"},
627 {VKD3D_SIV_TRIANGLE_V_TESS_FACTOR, "finalTriVeq0EdgeTessFactor"},
628 {VKD3D_SIV_TRIANGLE_W_TESS_FACTOR, "finalTriWeq0EdgeTessFactor"},
629 {VKD3D_SIV_TRIANGLE_INNER_TESS_FACTOR, "finalTriInsideTessFactor"},
630 {VKD3D_SIV_LINE_DETAIL_TESS_FACTOR, "finalLineDetailTessFactor"},
631 {VKD3D_SIV_LINE_DENSITY_TESS_FACTOR, "finalLineDensityTessFactor"},
632 };
633
634 for (i = 0; i < ARRAY_SIZE(shader_input_sysval_semantic_names); ++i)
635 {
636 if (shader_input_sysval_semantic_names[i].sysval_semantic != semantic)
637 continue;
638
639 vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%s",
640 prefix, shader_input_sysval_semantic_names[i].sysval_name, suffix);
641 return;
642 }
643
644 vkd3d_string_buffer_printf(&compiler->buffer, "%s%s<unhandled input sysval semantic %#x>%s%s",
645 prefix, compiler->colours.error, semantic, compiler->colours.reset, suffix);
646}
vkd3d_shader_input_sysval_semantic
@ VKD3D_SIV_TRIANGLE_U_TESS_FACTOR
@ VKD3D_SIV_CULL_DISTANCE
@ VKD3D_SIV_IS_FRONT_FACE
@ VKD3D_SIV_LINE_DETAIL_TESS_FACTOR
@ VKD3D_SIV_QUAD_V1_TESS_FACTOR
@ VKD3D_SIV_PRIMITIVE_ID
@ VKD3D_SIV_VERTEX_ID
@ VKD3D_SIV_QUAD_U1_TESS_FACTOR
@ VKD3D_SIV_INSTANCE_ID
@ VKD3D_SIV_QUAD_U0_TESS_FACTOR
@ VKD3D_SIV_QUAD_U_INNER_TESS_FACTOR
@ VKD3D_SIV_TRIANGLE_INNER_TESS_FACTOR
@ VKD3D_SIV_SAMPLE_INDEX
@ VKD3D_SIV_POSITION
@ VKD3D_SIV_QUAD_V_INNER_TESS_FACTOR
@ VKD3D_SIV_TRIANGLE_W_TESS_FACTOR
@ VKD3D_SIV_RENDER_TARGET_ARRAY_INDEX
@ VKD3D_SIV_LINE_DENSITY_TESS_FACTOR
@ VKD3D_SIV_CLIP_DISTANCE
@ VKD3D_SIV_TRIANGLE_V_TESS_FACTOR
@ VKD3D_SIV_QUAD_V0_TESS_FACTOR
@ VKD3D_SIV_VIEWPORT_ARRAY_INDEX

Referenced by shader_dump_instruction().

◆ shader_print_int_literal()

static void shader_print_int_literal ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
int  i,
const char *  suffix 
)
static

Definition at line 877 of file d3d_asm.c.

879{
880 if (i < 0)
881 vkd3d_string_buffer_printf(&compiler->buffer, "%s-%s%d%s%s",
882 prefix, compiler->colours.literal, -i, compiler->colours.reset, suffix);
883 else
884 vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%d%s%s",
885 prefix, compiler->colours.literal, i, compiler->colours.reset, suffix);
886}

Referenced by shader_dump_instruction(), and shader_print_register().

◆ shader_print_interpolation_mode()

static void shader_print_interpolation_mode ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
enum vkd3d_shader_interpolation_mode  m,
const char *  suffix 
)
static

Definition at line 1700 of file d3d_asm.c.

1702{
1703 struct vkd3d_string_buffer *buffer = &compiler->buffer;
1704 const char *mode;
1705
1706 switch (m)
1707 {
1708 case VKD3DSIM_CONSTANT:
1709 mode = "constant";
1710 break;
1711 case VKD3DSIM_LINEAR:
1712 mode = "linear";
1713 break;
1715 mode = "linear centroid";
1716 break;
1718 mode = "linear noperspective";
1719 break;
1721 mode = "linear sample";
1722 break;
1724 mode = "linear noperspective centroid";
1725 break;
1727 mode = "linear noperspective sample";
1728 break;
1729 default:
1730 vkd3d_string_buffer_printf(buffer, "%s%s<unhandled interpolation mode %#x>%s%s",
1731 prefix, compiler->colours.error, m, compiler->colours.reset, suffix);
1732 return;
1733 }
1734 vkd3d_string_buffer_printf(buffer, "%s%s%s", prefix, mode, suffix);
1735}
GLenum mode
Definition: glext.h:6217
const GLfloat * m
Definition: glext.h:10848
@ VKD3DSIM_CONSTANT
@ VKD3DSIM_LINEAR_NOPERSPECTIVE_CENTROID
@ VKD3DSIM_LINEAR_NOPERSPECTIVE_SAMPLE
@ VKD3DSIM_LINEAR_CENTROID
@ VKD3DSIM_LINEAR
@ VKD3DSIM_LINEAR_NOPERSPECTIVE
@ VKD3DSIM_LINEAR_SAMPLE

Referenced by shader_dump_instruction().

◆ shader_print_non_uniform()

static void shader_print_non_uniform ( struct vkd3d_d3d_asm_compiler *  compiler,
const struct vkd3d_shader_register *  reg 
)
static

Definition at line 1428 of file d3d_asm.c.

1429{
1430 if (reg->non_uniform)
1431 vkd3d_string_buffer_printf(&compiler->buffer, " {%snonuniform%s}",
1432 compiler->colours.modifier, compiler->colours.reset);
1433}
static int reg
Definition: i386-dis.c:1290

Referenced by shader_print_dst_param(), and shader_print_src_param().

◆ shader_print_opcode()

static void shader_print_opcode ( struct vkd3d_d3d_asm_compiler *  compiler,
enum vkd3d_shader_opcode  opcode 
)
static

Definition at line 1915 of file d3d_asm.c.

1916{
1917 vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%s", compiler->colours.opcode,
1918 shader_opcode_names[opcode], compiler->colours.reset);
1919}
static const char *const shader_opcode_names[]
Definition: d3d_asm.c:30

Referenced by shader_dump_instruction().

◆ shader_print_precision()

static void shader_print_precision ( struct vkd3d_d3d_asm_compiler *  compiler,
const struct vkd3d_shader_register *  reg 
)
static

Definition at line 1394 of file d3d_asm.c.

1395{
1396 struct vkd3d_string_buffer *buffer = &compiler->buffer;
1397 const char *precision;
1398
1400 return;
1401
1402 switch (reg->precision)
1403 {
1405 precision = "min16f";
1406 break;
1407
1409 precision = "min2_8f";
1410 break;
1411
1413 precision = "min16i";
1414 break;
1415
1417 precision = "min16u";
1418 break;
1419
1420 default:
1421 vkd3d_string_buffer_printf(buffer, " {%s<unhandled precision %#x>%s}",
1422 compiler->colours.error, reg->precision, compiler->colours.reset);
1423 return;
1424 }
1425 vkd3d_string_buffer_printf(buffer, " {%s%s%s}", compiler->colours.modifier, precision, compiler->colours.reset);
1426}
GLenum GLint GLint * precision
Definition: glext.h:7539
@ VKD3D_SHADER_REGISTER_PRECISION_DEFAULT
@ VKD3D_SHADER_REGISTER_PRECISION_MIN_UINT_16
@ VKD3D_SHADER_REGISTER_PRECISION_MIN_INT_16
@ VKD3D_SHADER_REGISTER_PRECISION_MIN_FLOAT_10
@ VKD3D_SHADER_REGISTER_PRECISION_MIN_FLOAT_16

Referenced by shader_print_dst_param(), and shader_print_src_param().

◆ shader_print_primitive_type()

static void shader_print_primitive_type ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
const struct vkd3d_shader_primitive_type *  p,
const char *  suffix 
)
static

Definition at line 1648 of file d3d_asm.c.

1650{
1651 struct vkd3d_string_buffer *buffer = &compiler->buffer;
1652 const char *primitive_type;
1653
1654 switch (p->type)
1655 {
1656 case VKD3D_PT_UNDEFINED:
1657 primitive_type = "undefined";
1658 break;
1659 case VKD3D_PT_POINTLIST:
1660 primitive_type = "pointlist";
1661 break;
1662 case VKD3D_PT_LINELIST:
1663 primitive_type = "linelist";
1664 break;
1665 case VKD3D_PT_LINESTRIP:
1666 primitive_type = "linestrip";
1667 break;
1669 primitive_type = "trianglelist";
1670 break;
1672 primitive_type = "trianglestrip";
1673 break;
1675 primitive_type = "trianglefan";
1676 break;
1678 primitive_type = "linelist_adj";
1679 break;
1681 primitive_type = "linestrip_adj";
1682 break;
1684 primitive_type = "trianglelist_adj";
1685 break;
1687 primitive_type = "trianglestrip_adj";
1688 break;
1689 case VKD3D_PT_PATCH:
1690 vkd3d_string_buffer_printf(buffer, "%spatch%u%s", prefix, p->patch_vertex_count, suffix);
1691 return;
1692 default:
1693 vkd3d_string_buffer_printf(buffer, "%s%s<unhandled primitive type %#x>%s%s",
1694 prefix, compiler->colours.error, p->type, compiler->colours.reset, suffix);
1695 return;
1696 }
1697 vkd3d_string_buffer_printf(buffer, "%s%s%s", prefix, primitive_type, suffix);
1698}
GLfloat GLfloat p
Definition: glext.h:8902
@ VKD3D_PT_TRIANGLESTRIP
@ VKD3D_PT_LINESTRIP
@ VKD3D_PT_PATCH
@ VKD3D_PT_TRIANGLELIST
@ VKD3D_PT_TRIANGLELIST_ADJ
@ VKD3D_PT_TRIANGLEFAN
@ VKD3D_PT_LINESTRIP_ADJ
@ VKD3D_PT_UNDEFINED
@ VKD3D_PT_LINELIST_ADJ
@ VKD3D_PT_TRIANGLESTRIP_ADJ
@ VKD3D_PT_POINTLIST
@ VKD3D_PT_LINELIST

Referenced by shader_dump_instruction().

◆ shader_print_reg_type()

static void shader_print_reg_type ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
const struct vkd3d_shader_register *  reg,
const char *  suffix 
)
static

Definition at line 1435 of file d3d_asm.c.

1437{
1438 static const char *dimensions[] =
1439 {
1440 [VSIR_DIMENSION_NONE] = "",
1441 [VSIR_DIMENSION_SCALAR] = "s:",
1442 [VSIR_DIMENSION_VEC4] = "v4:",
1443 };
1444
1445 struct vkd3d_string_buffer *buffer = &compiler->buffer;
1446 const char *dimension;
1447
1448 if (!(compiler->flags & VSIR_ASM_FLAG_DUMP_TYPES))
1449 {
1450 vkd3d_string_buffer_printf(buffer, "%s%s", prefix, suffix);
1451 return;
1452 }
1453
1454 if (reg->data_type == VKD3D_DATA_UNUSED)
1455 return;
1456
1457 if (reg->dimension < ARRAY_SIZE(dimensions))
1458 dimension = dimensions[reg->dimension];
1459 else
1460 dimension = "??";
1461
1462 vkd3d_string_buffer_printf(buffer, "%s <%s", prefix, dimension);
1463 shader_dump_data_type(compiler, reg->data_type);
1464 vkd3d_string_buffer_printf(buffer, ">%s", suffix);
1465}
@ VSIR_DIMENSION_SCALAR
@ VSIR_DIMENSION_NONE
@ VSIR_ASM_FLAG_DUMP_TYPES

Referenced by shader_print_dst_param(), and shader_print_src_param().

◆ shader_print_register()

static void shader_print_register ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
const struct vkd3d_shader_register *  reg,
bool  is_declaration,
const char *  suffix 
)
static

Definition at line 955 of file d3d_asm.c.

957{
958 struct vkd3d_string_buffer *buffer = &compiler->buffer;
959 unsigned int offset = reg->idx[0].offset;
960 bool is_descriptor = false;
961
962 static const char * const rastout_reg_names[] = {"oPos", "oFog", "oPts"};
963 static const char * const misctype_reg_names[] = {"vPos", "vFace"};
964
966 reg->type == VKD3DSPR_LABEL ? compiler->colours.label : compiler->colours.reg);
967 switch (reg->type)
968 {
969 case VKD3DSPR_TEMP:
971 break;
972
973 case VKD3DSPR_INPUT:
975 break;
976
977 case VKD3DSPR_CONST:
978 case VKD3DSPR_CONST2:
979 case VKD3DSPR_CONST3:
980 case VKD3DSPR_CONST4:
983 break;
984
985 case VKD3DSPR_TEXTURE: /* vs: case VKD3DSPR_ADDR */
987 compiler->shader_version.type == VKD3D_SHADER_TYPE_PIXEL ? 't' : 'a');
988 break;
989
990 case VKD3DSPR_RASTOUT:
991 vkd3d_string_buffer_printf(buffer, "%s", rastout_reg_names[offset]);
992 break;
993
996 break;
997
1000 break;
1001
1004 break;
1005
1008 break;
1009
1010 case VKD3DSPR_ATTROUT:
1012 break;
1013
1014 case VKD3DSPR_TEXCRDOUT:
1015 /* Vertex shaders >= 3.0 use general purpose output registers
1016 * (VKD3DSPR_OUTPUT), which can include an address token. */
1017 if (vkd3d_shader_ver_ge(&compiler->shader_version, 3, 0))
1019 else
1021 break;
1022
1023 case VKD3DSPR_CONSTINT:
1025 break;
1026
1027 case VKD3DSPR_CONSTBOOL:
1029 break;
1030
1031 case VKD3DSPR_LABEL:
1033 break;
1034
1035 case VKD3DSPR_LOOP:
1037 break;
1038
1040 case VKD3DSPR_SAMPLER:
1042 is_descriptor = true;
1043 break;
1044
1045 case VKD3DSPR_MISCTYPE:
1046 if (offset > 1)
1047 vkd3d_string_buffer_printf(buffer, "%s<unhandled misctype %#x>%s",
1048 compiler->colours.error, offset, compiler->colours.reset);
1049 else
1050 vkd3d_string_buffer_printf(buffer, "%s", misctype_reg_names[offset]);
1051 break;
1052
1053 case VKD3DSPR_PREDICATE:
1055 break;
1056
1057 case VKD3DSPR_IMMCONST:
1059 break;
1060
1063 break;
1064
1067 is_descriptor = true;
1068 break;
1069
1072 break;
1073
1074 case VKD3DSPR_PRIMID:
1076 break;
1077
1078 case VKD3DSPR_NULL:
1080 break;
1081
1083 vkd3d_string_buffer_printf(buffer, "rasterizer");
1084 break;
1085
1086 case VKD3DSPR_RESOURCE:
1088 is_descriptor = true;
1089 break;
1090
1091 case VKD3DSPR_UAV:
1093 is_descriptor = true;
1094 break;
1095
1097 vkd3d_string_buffer_printf(buffer, "vOutputControlPointID");
1098 break;
1099
1101 vkd3d_string_buffer_printf(buffer, "vForkInstanceId");
1102 break;
1103
1105 vkd3d_string_buffer_printf(buffer, "vJoinInstanceId");
1106 break;
1107
1110 break;
1111
1114 break;
1115
1118 break;
1119
1120 case VKD3DSPR_TESSCOORD:
1121 vkd3d_string_buffer_printf(buffer, "vDomainLocation");
1122 break;
1123
1126 break;
1127
1128 case VKD3DSPR_THREADID:
1129 vkd3d_string_buffer_printf(buffer, "vThreadID");
1130 break;
1131
1133 vkd3d_string_buffer_printf(buffer, "vThreadGroupID");
1134 break;
1135
1137 vkd3d_string_buffer_printf(buffer, "vThreadIDInGroup");
1138 break;
1139
1141 vkd3d_string_buffer_printf(buffer, "vThreadIDInGroupFlattened");
1142 break;
1143
1144 case VKD3DSPR_IDXTEMP:
1146 break;
1147
1148 case VKD3DSPR_STREAM:
1150 break;
1151
1154 break;
1155
1158 break;
1159
1160 case VKD3DSPR_COVERAGE:
1161 vkd3d_string_buffer_printf(buffer, "vCoverage");
1162 break;
1163
1166 break;
1167
1168 case VKD3DSPR_GSINSTID:
1169 vkd3d_string_buffer_printf(buffer, "vGSInstanceID");
1170 break;
1171
1173 vkd3d_string_buffer_printf(buffer, "oStencilRef");
1174 break;
1175
1176 case VKD3DSPR_UNDEF:
1178 break;
1179
1180 case VKD3DSPR_SSA:
1182 break;
1183
1185 vkd3d_string_buffer_printf(buffer, "vWaveLaneCount");
1186 break;
1187
1189 vkd3d_string_buffer_printf(buffer, "vWaveLaneIndex");
1190 break;
1191
1192 case VKD3DSPR_PARAMETER:
1193 vkd3d_string_buffer_printf(buffer, "parameter");
1194 break;
1195
1197 vkd3d_string_buffer_printf(buffer, "vPointCoord");
1198 break;
1199
1200 default:
1201 vkd3d_string_buffer_printf(buffer, "%s<unhandled register type %#x>%s",
1202 compiler->colours.error, reg->type, compiler->colours.reset);
1203 break;
1204 }
1205
1206 if (reg->type == VKD3DSPR_IMMCONST)
1207 {
1208 bool untyped = false;
1209
1210 switch (compiler->current->opcode)
1211 {
1212 case VKD3DSIH_MOV:
1213 case VKD3DSIH_MOVC:
1214 untyped = true;
1215 break;
1216
1217 default:
1218 break;
1219 }
1220
1221 vkd3d_string_buffer_printf(buffer, "%s(", compiler->colours.reset);
1222 switch (reg->dimension)
1223 {
1225 switch (reg->data_type)
1226 {
1227 case VKD3D_DATA_FLOAT:
1228 if (untyped)
1229 shader_print_untyped_literal(compiler, "", reg->u.immconst_u32[0], "");
1230 else
1231 shader_print_float_literal(compiler, "", reg->u.immconst_f32[0], "");
1232 break;
1233 case VKD3D_DATA_INT:
1234 shader_print_int_literal(compiler, "", reg->u.immconst_u32[0], "");
1235 break;
1236 case VKD3D_DATA_UINT:
1237 shader_print_uint_literal(compiler, "", reg->u.immconst_u32[0], "");
1238 break;
1239 default:
1240 vkd3d_string_buffer_printf(buffer, "%s<unhandled data type %#x>%s",
1241 compiler->colours.error, reg->data_type, compiler->colours.reset);
1242 break;
1243 }
1244 break;
1245
1247 switch (reg->data_type)
1248 {
1249 case VKD3D_DATA_FLOAT:
1250 if (untyped)
1251 {
1252 shader_print_untyped_literal(compiler, "", reg->u.immconst_u32[0], "");
1253 shader_print_untyped_literal(compiler, ", ", reg->u.immconst_u32[1], "");
1254 shader_print_untyped_literal(compiler, ", ", reg->u.immconst_u32[2], "");
1255 shader_print_untyped_literal(compiler, ", ", reg->u.immconst_u32[3], "");
1256 }
1257 else
1258 {
1259 shader_print_float_literal(compiler, "", reg->u.immconst_f32[0], "");
1260 shader_print_float_literal(compiler, ", ", reg->u.immconst_f32[1], "");
1261 shader_print_float_literal(compiler, ", ", reg->u.immconst_f32[2], "");
1262 shader_print_float_literal(compiler, ", ", reg->u.immconst_f32[3], "");
1263 }
1264 break;
1265 case VKD3D_DATA_INT:
1266 shader_print_int_literal(compiler, "", reg->u.immconst_u32[0], "");
1267 shader_print_int_literal(compiler, ", ", reg->u.immconst_u32[1], "");
1268 shader_print_int_literal(compiler, ", ", reg->u.immconst_u32[2], "");
1269 shader_print_int_literal(compiler, ", ", reg->u.immconst_u32[3], "");
1270 break;
1271 case VKD3D_DATA_UINT:
1272 shader_print_uint_literal(compiler, "", reg->u.immconst_u32[0], "");
1273 shader_print_uint_literal(compiler, ", ", reg->u.immconst_u32[1], "");
1274 shader_print_uint_literal(compiler, ", ", reg->u.immconst_u32[2], "");
1275 shader_print_uint_literal(compiler, ", ", reg->u.immconst_u32[3], "");
1276 break;
1277 default:
1278 vkd3d_string_buffer_printf(buffer, "%s<unhandled data type %#x>%s",
1279 compiler->colours.error, reg->data_type, compiler->colours.reset);
1280 break;
1281 }
1282 break;
1283
1284 default:
1285 vkd3d_string_buffer_printf(buffer, "%s<unhandled immconst dimension %#x>%s",
1286 compiler->colours.error, reg->dimension, compiler->colours.reset);
1287 break;
1288 }
1290 }
1291 else if (reg->type == VKD3DSPR_IMMCONST64)
1292 {
1293 vkd3d_string_buffer_printf(buffer, "%s(", compiler->colours.reset);
1294 /* A double2 vector is treated as a float4 vector in enum vsir_dimension. */
1295 if (reg->dimension == VSIR_DIMENSION_SCALAR || reg->dimension == VSIR_DIMENSION_VEC4)
1296 {
1297 if (reg->data_type == VKD3D_DATA_DOUBLE)
1298 {
1299 shader_print_double_literal(compiler, "", reg->u.immconst_f64[0], "");
1300 if (reg->dimension == VSIR_DIMENSION_VEC4)
1301 shader_print_double_literal(compiler, ", ", reg->u.immconst_f64[1], "");
1302 }
1303 else if (reg->data_type == VKD3D_DATA_UINT64)
1304 {
1305 shader_print_uint64_literal(compiler, "", reg->u.immconst_u64[0], "");
1306 if (reg->dimension == VSIR_DIMENSION_VEC4)
1307 shader_print_uint64_literal(compiler, "", reg->u.immconst_u64[1], "");
1308 }
1309 else
1310 {
1311 vkd3d_string_buffer_printf(buffer, "%s<unhandled data type %#x>%s",
1312 compiler->colours.error, reg->data_type, compiler->colours.reset);
1313 }
1314 }
1315 else
1316 {
1317 vkd3d_string_buffer_printf(buffer, "%s<unhandled immconst64 dimension %#x>%s",
1318 compiler->colours.error, reg->dimension, compiler->colours.reset);
1319 }
1321 }
1322 else if (compiler->flags & VSIR_ASM_FLAG_DUMP_ALL_INDICES)
1323 {
1324 unsigned int i = 0;
1325
1326 if (reg->idx_count == 0 || reg->idx[0].rel_addr)
1327 {
1328 vkd3d_string_buffer_printf(buffer, "%s", compiler->colours.reset);
1329 }
1330 else
1331 {
1332 vkd3d_string_buffer_printf(buffer, "%u%s", offset, compiler->colours.reset);
1333 i = 1;
1334 }
1335
1336 for (; i < reg->idx_count; ++i)
1337 shader_print_subscript(compiler, reg->idx[i].offset, reg->idx[i].rel_addr);
1338 }
1339 else if (reg->type != VKD3DSPR_RASTOUT
1340 && reg->type != VKD3DSPR_MISCTYPE
1341 && reg->type != VKD3DSPR_NULL
1342 && reg->type != VKD3DSPR_DEPTHOUT)
1343 {
1344 if (offset != ~0u)
1345 {
1346 bool is_sm_5_1 = vkd3d_shader_ver_ge(&compiler->shader_version, 5, 1);
1347
1348 if (reg->idx[0].rel_addr || reg->type == VKD3DSPR_IMMCONSTBUFFER
1349 || reg->type == VKD3DSPR_INCONTROLPOINT || (reg->type == VKD3DSPR_INPUT
1350 && (compiler->shader_version.type == VKD3D_SHADER_TYPE_GEOMETRY
1351 || compiler->shader_version.type == VKD3D_SHADER_TYPE_HULL)))
1352 {
1353 vkd3d_string_buffer_printf(buffer, "%s", compiler->colours.reset);
1354 shader_print_subscript(compiler, offset, reg->idx[0].rel_addr);
1355 }
1356 else
1357 {
1358 vkd3d_string_buffer_printf(buffer, "%u%s", offset, compiler->colours.reset);
1359 }
1360
1361 /* For sm 5.1 descriptor declarations we need to print the register range instead of
1362 * a single register index. */
1363 if (is_descriptor && is_declaration && is_sm_5_1)
1364 {
1365 shader_print_subscript_range(compiler, reg->idx[1].offset, reg->idx[2].offset);
1366 }
1367 else if (reg->type != VKD3DSPR_SSA)
1368 {
1369 /* For descriptors in sm < 5.1 we move the reg->idx values up one slot
1370 * to normalise with 5.1.
1371 * Here we should ignore it if it's a descriptor in sm < 5.1. */
1372 if (reg->idx[1].offset != ~0u && (!is_descriptor || is_sm_5_1))
1373 shader_print_subscript(compiler, reg->idx[1].offset, reg->idx[1].rel_addr);
1374
1375 if (reg->idx[2].offset != ~0u)
1376 shader_print_subscript(compiler, reg->idx[2].offset, reg->idx[2].rel_addr);
1377 }
1378 }
1379 else
1380 {
1381 vkd3d_string_buffer_printf(buffer, "%s", compiler->colours.reset);
1382 }
1383
1384 if (reg->type == VKD3DSPR_FUNCTIONPOINTER)
1385 shader_print_subscript(compiler, reg->u.fp_body_idx, NULL);
1386 }
1387 else
1388 {
1389 vkd3d_string_buffer_printf(buffer, "%s", compiler->colours.reset);
1390 }
1391 vkd3d_string_buffer_printf(buffer, "%s", suffix);
1392}
static void shader_print_uint64_literal(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, uint64_t i, const char *suffix)
Definition: d3d_asm.c:895
static void shader_print_double_literal(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, double d, const char *suffix)
Definition: d3d_asm.c:861
static void shader_print_subscript_range(struct vkd3d_d3d_asm_compiler *compiler, unsigned int offset_first, unsigned int offset_last)
Definition: d3d_asm.c:945
static void shader_print_untyped_literal(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, uint32_t u, const char *suffix)
Definition: d3d_asm.c:916
GLintptr offset
Definition: glext.h:5920
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
@ VKD3DSPR_PRIMID
@ VKD3DSPR_DEPTHOUTGE
@ VKD3DSPR_RASTERIZER
@ VKD3DSPR_PARAMETER
@ VKD3DSPR_POINT_COORD
@ VKD3DSPR_INCONTROLPOINT
@ VKD3DSPR_LABEL
@ VKD3DSPR_IMMCONST
@ VKD3DSPR_CONSTBOOL
@ VKD3DSPR_GROUPSHAREDMEM
@ VKD3DSPR_SAMPLEMASK
@ VKD3DSPR_GSINSTID
@ VKD3DSPR_UNDEF
@ VKD3DSPR_FUNCTIONPOINTER
@ VKD3DSPR_NULL
@ VKD3DSPR_CONSTBUFFER
@ VKD3DSPR_FUNCTIONBODY
@ VKD3DSPR_SSA
@ VKD3DSPR_RASTOUT
@ VKD3DSPR_COLOROUT
@ VKD3DSPR_PREDICATE
@ VKD3DSPR_LOOP
@ VKD3DSPR_MISCTYPE
@ VKD3DSPR_DEPTHOUT
@ VKD3DSPR_DEPTHOUTLE
@ VKD3DSPR_WAVELANECOUNT
@ VKD3DSPR_CONSTINT
@ VKD3DSPR_JOININSTID
@ VKD3DSPR_TESSCOORD
@ VKD3DSPR_COVERAGE
@ VKD3DSPR_IMMCONST64
@ VKD3DSPR_TEMP
@ VKD3DSPR_THREADGROUPID
@ VKD3DSPR_IDXTEMP
@ VKD3DSPR_LOCALTHREADINDEX
@ VKD3DSPR_THREADID
@ VKD3DSPR_LOCALTHREADID
@ VKD3DSPR_SAMPLER
@ VKD3DSPR_FORKINSTID
@ VKD3DSPR_OUTCONTROLPOINT
@ VKD3DSPR_OUTPOINTID
@ VKD3DSPR_IMMCONSTBUFFER
@ VKD3DSPR_OUTSTENCILREF
@ VKD3DSPR_TEXCRDOUT
@ VKD3DSPR_TEXTURE
@ VKD3DSPR_WAVELANEINDEX
@ VKD3DSPR_STREAM
@ VKD3DSPR_ATTROUT
@ VKD3DSPR_PATCHCONST
@ VKD3DSPR_INPUT
@ VKD3DSIH_MOVC
@ VKD3DSIH_MOV
@ VSIR_ASM_FLAG_DUMP_ALL_INDICES

Referenced by shader_dump_instruction(), shader_print_dst_param(), and shader_print_src_param().

◆ shader_print_src_param()

static void shader_print_src_param ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
const struct vkd3d_shader_src_param *  param,
const char *  suffix 
)
static

Definition at line 1513 of file d3d_asm.c.

1515{
1516 enum vkd3d_shader_src_modifier src_modifier = param->modifiers;
1517 struct vkd3d_string_buffer *buffer = &compiler->buffer;
1518 uint32_t swizzle = param->swizzle;
1519 const char *modifier = "";
1520 bool is_abs = false;
1521
1522 if (src_modifier == VKD3DSPSM_NEG
1523 || src_modifier == VKD3DSPSM_BIASNEG
1524 || src_modifier == VKD3DSPSM_SIGNNEG
1525 || src_modifier == VKD3DSPSM_X2NEG
1526 || src_modifier == VKD3DSPSM_ABSNEG)
1527 modifier = "-";
1528 else if (src_modifier == VKD3DSPSM_COMP)
1529 modifier = "1-";
1530 else if (src_modifier == VKD3DSPSM_NOT)
1531 modifier = "!";
1532 vkd3d_string_buffer_printf(buffer, "%s%s", prefix, modifier);
1533
1534 if (src_modifier == VKD3DSPSM_ABS || src_modifier == VKD3DSPSM_ABSNEG)
1535 is_abs = true;
1536
1537 shader_print_register(compiler, is_abs ? "|" : "", &param->reg, false, "");
1538
1539 switch (src_modifier)
1540 {
1541 case VKD3DSPSM_NONE:
1542 case VKD3DSPSM_NEG:
1543 case VKD3DSPSM_COMP:
1544 case VKD3DSPSM_ABS:
1545 case VKD3DSPSM_ABSNEG:
1546 case VKD3DSPSM_NOT:
1547 break;
1548 case VKD3DSPSM_BIAS:
1549 case VKD3DSPSM_BIASNEG:
1551 break;
1552 case VKD3DSPSM_SIGN:
1553 case VKD3DSPSM_SIGNNEG:
1555 break;
1556 case VKD3DSPSM_X2:
1557 case VKD3DSPSM_X2NEG:
1559 break;
1560 case VKD3DSPSM_DZ:
1562 break;
1563 case VKD3DSPSM_DW:
1565 break;
1566 default:
1567 vkd3d_string_buffer_printf(buffer, "_%s<unhandled modifier %#x>%s",
1568 compiler->colours.error, src_modifier, compiler->colours.reset);
1569 break;
1570 }
1571
1572 if (param->reg.type != VKD3DSPR_IMMCONST && param->reg.type != VKD3DSPR_IMMCONST64
1573 && param->reg.dimension == VSIR_DIMENSION_VEC4)
1574 {
1575 static const char swizzle_chars[] = "xyzw";
1576
1577 unsigned int swizzle_x, swizzle_y, swizzle_z, swizzle_w;
1578
1579 if (data_type_is_64_bit(param->reg.data_type))
1581
1582 swizzle_x = vsir_swizzle_get_component(swizzle, 0);
1583 swizzle_y = vsir_swizzle_get_component(swizzle, 1);
1584 swizzle_z = vsir_swizzle_get_component(swizzle, 2);
1585 swizzle_w = vsir_swizzle_get_component(swizzle, 3);
1586
1587 if (swizzle_x == swizzle_y && swizzle_x == swizzle_z && swizzle_x == swizzle_w)
1588 vkd3d_string_buffer_printf(buffer, ".%s%c%s", compiler->colours.swizzle,
1589 swizzle_chars[swizzle_x], compiler->colours.reset);
1590 else
1591 vkd3d_string_buffer_printf(buffer, ".%s%c%c%c%c%s", compiler->colours.swizzle,
1592 swizzle_chars[swizzle_x], swizzle_chars[swizzle_y],
1593 swizzle_chars[swizzle_z], swizzle_chars[swizzle_w], compiler->colours.reset);
1594 }
1595
1596 if (is_abs)
1598
1599 shader_print_precision(compiler, &param->reg);
1600 shader_print_non_uniform(compiler, &param->reg);
1601 shader_print_reg_type(compiler, "", &param->reg, suffix);
1602}
GLuint GLenum swizzle
Definition: glext.h:9511
vkd3d_shader_src_modifier
@ VKD3DSPSM_DZ
@ VKD3DSPSM_DW
@ VKD3DSPSM_SIGNNEG
@ VKD3DSPSM_ABS
@ VKD3DSPSM_SIGN
@ VKD3DSPSM_NONE
@ VKD3DSPSM_COMP
@ VKD3DSPSM_NOT
@ VKD3DSPSM_BIASNEG
@ VKD3DSPSM_X2
@ VKD3DSPSM_BIAS
@ VKD3DSPSM_X2NEG
@ VKD3DSPSM_NEG
@ VKD3DSPSM_ABSNEG
static unsigned int vsir_swizzle_get_component(uint32_t swizzle, unsigned int idx)
static uint32_t vsir_swizzle_32_from_64(uint32_t swizzle64)

Referenced by shader_dump_instruction(), and shader_print_subscript().

◆ shader_print_subscript()

static void shader_print_subscript ( struct vkd3d_d3d_asm_compiler *  compiler,
unsigned int  offset,
const struct vkd3d_shader_src_param *  rel_addr 
)
static

Definition at line 937 of file d3d_asm.c.

939{
940 if (rel_addr)
941 shader_print_src_param(compiler, "[", rel_addr, " + ");
942 shader_print_uint_literal(compiler, rel_addr ? "" : "[", offset, "]");
943}

Referenced by shader_dump_instruction(), and shader_print_register().

◆ shader_print_subscript_range()

static void shader_print_subscript_range ( struct vkd3d_d3d_asm_compiler *  compiler,
unsigned int  offset_first,
unsigned int  offset_last 
)
static

Definition at line 945 of file d3d_asm.c.

947{
948 shader_print_uint_literal(compiler, "[", offset_first, ":");
949 if (offset_last != ~0u)
950 shader_print_uint_literal(compiler, "", offset_last, "]");
951 else
952 vkd3d_string_buffer_printf(&compiler->buffer, "*]");
953}

Referenced by shader_print_register().

◆ shader_print_tessellator_domain()

static void shader_print_tessellator_domain ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
enum vkd3d_tessellator_domain  d,
const char *  suffix 
)
static

Definition at line 514 of file d3d_asm.c.

516{
517 struct vkd3d_string_buffer *buffer = &compiler->buffer;
518 const char *domain;
519
520 switch (d)
521 {
523 domain = "domain_isoline";
524 break;
526 domain = "domain_tri";
527 break;
529 domain = "domain_quad";
530 break;
531 default:
532 vkd3d_string_buffer_printf(buffer, "%s%s<unhandled tessellator domain %#x>%s%s",
533 prefix, compiler->colours.error, d, compiler->colours.reset, suffix);
534 return;
535 }
536
537 vkd3d_string_buffer_printf(buffer, "%s%s%s", prefix, domain, suffix);
538}
Definition: cookie.c:42
@ VKD3D_TESSELLATOR_DOMAIN_TRIANGLE
@ VKD3D_TESSELLATOR_DOMAIN_LINE
@ VKD3D_TESSELLATOR_DOMAIN_QUAD

Referenced by shader_dump_instruction().

◆ shader_print_tessellator_output_primitive()

static void shader_print_tessellator_output_primitive ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
enum vkd3d_shader_tessellator_output_primitive  p,
const char *  suffix 
)
static

Definition at line 540 of file d3d_asm.c.

542{
543 struct vkd3d_string_buffer *buffer = &compiler->buffer;
544 const char *primitive;
545
546 switch (p)
547 {
549 primitive = "output_point";
550 break;
552 primitive = "output_line";
553 break;
555 primitive = "output_triangle_cw";
556 break;
558 primitive = "output_triangle_ccw";
559 break;
560 default:
561 vkd3d_string_buffer_printf(buffer, "%s%s<unhandled tessellator output primitive %#x>%s%s",
562 prefix, compiler->colours.error, p, compiler->colours.reset, suffix);
563 return;
564 }
565
566 vkd3d_string_buffer_printf(buffer, "%s%s%s", prefix, primitive, suffix);
567}
@ VKD3D_SHADER_TESSELLATOR_OUTPUT_TRIANGLE_CW
@ VKD3D_SHADER_TESSELLATOR_OUTPUT_POINT
@ VKD3D_SHADER_TESSELLATOR_OUTPUT_TRIANGLE_CCW
@ VKD3D_SHADER_TESSELLATOR_OUTPUT_LINE

Referenced by shader_dump_instruction().

◆ shader_print_tessellator_partitioning()

static void shader_print_tessellator_partitioning ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
enum vkd3d_shader_tessellator_partitioning  p,
const char *  suffix 
)
static

Definition at line 569 of file d3d_asm.c.

571{
572 struct vkd3d_string_buffer *buffer = &compiler->buffer;
573 const char *partitioning;
574
575 switch (p)
576 {
578 partitioning = "partitioning_integer";
579 break;
581 partitioning = "partitioning_pow2";
582 break;
584 partitioning = "partitioning_fractional_odd";
585 break;
587 partitioning = "partitioning_fractional_even";
588 break;
589 default:
590 vkd3d_string_buffer_printf(buffer, "%s%s<unhandled tessellator partitioning %#x>%s%s",
591 prefix, compiler->colours.error, p, compiler->colours.reset, suffix);
592 return;
593 }
594
595 vkd3d_string_buffer_printf(buffer, "%s%s%s", prefix, partitioning, suffix);
596}
@ VKD3D_SHADER_TESSELLATOR_PARTITIONING_INTEGER
@ VKD3D_SHADER_TESSELLATOR_PARTITIONING_POW2
@ VKD3D_SHADER_TESSELLATOR_PARTITIONING_FRACTIONAL_ODD
@ VKD3D_SHADER_TESSELLATOR_PARTITIONING_FRACTIONAL_EVEN

Referenced by shader_dump_instruction().

◆ shader_print_uint64_literal()

static void shader_print_uint64_literal ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
uint64_t  i,
const char *  suffix 
)
static

Definition at line 895 of file d3d_asm.c.

897{
898 vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%"PRIu64"%s%s",
899 prefix, compiler->colours.literal, i, compiler->colours.reset, suffix);
900}
#define PRIu64
Definition: inttypes.h:28

Referenced by shader_print_register().

◆ shader_print_uint_literal()

static void shader_print_uint_literal ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
unsigned int  i,
const char *  suffix 
)
static

Definition at line 888 of file d3d_asm.c.

890{
891 vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%u%s%s",
892 prefix, compiler->colours.literal, i, compiler->colours.reset, suffix);
893}

Referenced by shader_dump_instruction(), shader_dump_register_space(), shader_print_register(), shader_print_subscript(), shader_print_subscript_range(), and shader_print_untyped_literal().

◆ shader_print_untyped_literal()

static void shader_print_untyped_literal ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
uint32_t  u,
const char *  suffix 
)
static

Definition at line 916 of file d3d_asm.c.

918{
919 union
920 {
921 uint32_t u;
922 float f;
923 } value;
924 unsigned int exponent = (u >> 23) & 0xff;
925
926 value.u = u;
927
928 if (exponent != 0 && exponent != 0xff)
929 return shader_print_float_literal(compiler, prefix, value.f, suffix);
930
931 if (u <= 10000)
932 return shader_print_uint_literal(compiler, prefix, value.u, suffix);
933
934 return shader_print_hex_literal(compiler, prefix, value.u, suffix);
935}
__int64 exponent
Definition: cvt.cpp:529
Definition: pdh_main.c:64

Referenced by shader_print_register().

◆ shader_print_write_mask()

static void shader_print_write_mask ( struct vkd3d_d3d_asm_compiler *  compiler,
const char *  prefix,
uint32_t  mask,
const char *  suffix 
)
static

Definition at line 1467 of file d3d_asm.c.

1469{
1470 unsigned int i = 0;
1471 char buffer[5];
1472
1473 if (mask == 0)
1474 {
1475 vkd3d_string_buffer_printf(&compiler->buffer, "%s%s", prefix, suffix);
1476 return;
1477 }
1478
1480 buffer[i++] = 'x';
1482 buffer[i++] = 'y';
1484 buffer[i++] = 'z';
1486 buffer[i++] = 'w';
1487 buffer[i++] = '\0';
1488
1489 vkd3d_string_buffer_printf(&compiler->buffer, "%s.%s%s%s%s", prefix,
1490 compiler->colours.write_mask, buffer, compiler->colours.reset, suffix);
1491}
GLenum GLint GLuint mask
Definition: glext.h:6028
#define VKD3DSP_WRITEMASK_3
#define VKD3DSP_WRITEMASK_0
#define VKD3DSP_WRITEMASK_1
#define VKD3DSP_WRITEMASK_2

Referenced by dump_dxbc_signature(), and shader_print_dst_param().

◆ trace_signature()

static void trace_signature ( const struct shader_signature *  signature,
const char *  signature_type 
)
static

Definition at line 2513 of file d3d_asm.c.

2514{
2516 unsigned int i;
2517
2518 TRACE("%s signature:%s\n", signature_type, signature->element_count == 0 ? " empty" : "");
2519
2521
2522 for (i = 0; i < signature->element_count; ++i)
2523 {
2524 const struct signature_element *element = &signature->elements[i];
2525
2527
2528 vkd3d_string_buffer_printf(&buffer, "Element %u: %s %u-%u %s", i,
2529 get_component_type_name(element->component_type),
2530 element->register_index, element->register_index + element->register_count,
2531 element->semantic_name);
2532 if (element->semantic_index != -1)
2533 vkd3d_string_buffer_printf(&buffer, "%u", element->semantic_index);
2535 " mask %#x used_mask %#x sysval %s min_precision %s interpolation %u stream %u",
2536 element->mask, element->used_mask, get_sysval_semantic_name(element->sysval_semantic),
2537 get_minimum_precision_name(element->min_precision), element->interpolation_mode,
2538 element->stream_index);
2539 if (element->target_location != -1)
2540 vkd3d_string_buffer_printf(&buffer, " target %u", element->target_location);
2541 else
2543
2544 TRACE("%s\n", buffer.buffer);
2545 }
2546
2548}
#define TRACE(s)
Definition: solgame.cpp:4
void vkd3d_string_buffer_clear(struct vkd3d_string_buffer *buffer)

Referenced by vsir_program_trace().

◆ vsir_program_trace()

void vsir_program_trace ( const struct vsir_program *  program)

Definition at line 2550 of file d3d_asm.c.

2551{
2553 struct vkd3d_shader_code code;
2554 const char *p, *q, *end;
2555
2556 trace_signature(&program->input_signature, "Input");
2557 trace_signature(&program->output_signature, "Output");
2558 trace_signature(&program->patch_constant_signature, "Patch-constant");
2559
2561 return;
2562
2563 end = (const char *)code.code + code.size;
2564 for (p = code.code; p < end; p = q)
2565 {
2566 if (!(q = memchr(p, '\n', end - p)))
2567 q = end;
2568 else
2569 ++q;
2570 TRACE(" %.*s", (int)(q - p), p);
2571 }
2572
2574}
static void trace_signature(const struct shader_signature *signature, const char *signature_type)
Definition: d3d_asm.c:2513
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
GLuint GLuint end
Definition: gl.h:1545
GLdouble GLdouble GLdouble GLdouble q
Definition: gl.h:2063
#define memchr(s, c, n)
Definition: mkisofs.h:875
for(i=0;i< sizeof(testsuite)/sizeof(testsuite[0]);++i) ok(call_test(testsuite[i].func)
Definition: inflate.c:139
VKD3D_SHADER_API void vkd3d_shader_free_shader_code(struct vkd3d_shader_code *code)

Referenced by vsir_parse(), vsir_program_scan(), and vsir_program_transform().

Variable Documentation

◆ shader_opcode_names

const char* const shader_opcode_names[]
static

Definition at line 30 of file d3d_asm.c.

Referenced by shader_print_opcode().