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

Go to the source code of this file.

Classes

struct  glsl_resource_type_info
 
struct  glsl_src
 
struct  glsl_dst
 
struct  vkd3d_glsl_generator
 
struct  vkd3d_glsl_generator::shader_limits
 

Functions

static void shader_glsl_print_subscript (struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_src_param *rel_addr, unsigned int offset)
 
static void VKD3D_PRINTF_FUNC (3, 4)
 
static const char * shader_glsl_get_prefix (enum vkd3d_shader_type type)
 
static const struct glsl_resource_type_info * shader_glsl_get_resource_type_info (enum vkd3d_shader_resource_type t)
 
static const struct vkd3d_shader_descriptor_info1 * shader_glsl_get_descriptor (struct vkd3d_glsl_generator *gen, enum vkd3d_shader_descriptor_type type, unsigned int idx, unsigned int space)
 
static const struct vkd3d_shader_descriptor_info1 * shader_glsl_get_descriptor_by_id (struct vkd3d_glsl_generator *gen, enum vkd3d_shader_descriptor_type type, unsigned int id)
 
static void shader_glsl_print_indent (struct vkd3d_string_buffer *buffer, unsigned int indent)
 
static void shader_glsl_print_combined_sampler_name (struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, unsigned int resource_index, unsigned int resource_space, unsigned int sampler_index, unsigned int sampler_space)
 
static void shader_glsl_print_image_name (struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, unsigned int idx, unsigned int space)
 
static void shader_glsl_print_register_name (struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_register *reg)
 
static void shader_glsl_print_swizzle (struct vkd3d_string_buffer *buffer, uint32_t swizzle, uint32_t mask)
 
static void shader_glsl_print_write_mask (struct vkd3d_string_buffer *buffer, uint32_t write_mask)
 
static void glsl_src_cleanup (struct glsl_src *src, struct vkd3d_string_buffer_cache *cache)
 
static void shader_glsl_print_bitcast (struct vkd3d_string_buffer *dst, struct vkd3d_glsl_generator *gen, const char *src, enum vkd3d_data_type dst_data_type, enum vkd3d_data_type src_data_type, unsigned int size)
 
static void shader_glsl_print_src (struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_src_param *vsir_src, uint32_t mask, enum vkd3d_data_type data_type)
 
static void glsl_src_init (struct glsl_src *glsl_src, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_src_param *vsir_src, uint32_t mask)
 
static void glsl_dst_cleanup (struct glsl_dst *dst, struct vkd3d_string_buffer_cache *cache)
 
static uint32_t glsl_dst_init (struct glsl_dst *glsl_dst, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const struct vkd3d_shader_dst_param *vsir_dst)
 
static void VKD3D_PRINTF_FUNC (4, 0)
 
static void VKD3D_PRINTF_FUNC (4, 5)
 
static void shader_glsl_unhandled (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
 
static void shader_glsl_binop (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *op)
 
static void shader_glsl_dot (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, uint32_t src_mask)
 
static void shader_glsl_intrinsic (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *op)
 
static void shader_glsl_relop (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *scalar_op, const char *vector_op)
 
static void shader_glsl_cast (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *scalar_constructor, const char *vector_constructor)
 
static void shader_glsl_end_block (struct vkd3d_glsl_generator *gen)
 
static void shader_glsl_begin_block (struct vkd3d_glsl_generator *gen)
 
static void shader_glsl_if (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
 
static void shader_glsl_else (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
 
static void shader_glsl_loop (struct vkd3d_glsl_generator *gen)
 
static void shader_glsl_break (struct vkd3d_glsl_generator *gen)
 
static void shader_glsl_continue (struct vkd3d_glsl_generator *gen)
 
static void shader_glsl_switch (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
 
static void shader_glsl_case (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
 
static void shader_glsl_default (struct vkd3d_glsl_generator *gen)
 
static void shader_glsl_print_texel_offset (struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, unsigned int offset_size, const struct vkd3d_shader_texel_offset *offset)
 
static void shader_glsl_ld (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
 
static void shader_glsl_print_shadow_coord (struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_src_param *coord, const struct vkd3d_shader_src_param *ref, unsigned int coord_size)
 
static void shader_glsl_sample (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
 
static void shader_glsl_load_uav_typed (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
 
static void shader_glsl_store_uav_typed (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
 
static void shader_glsl_unary_op (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *op)
 
static void shader_glsl_mov (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
 
static void shader_glsl_movc (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
 
static void shader_glsl_mul_extended (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
 
static void shader_glsl_print_sysval_name (struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, enum vkd3d_shader_sysval_semantic sysval, unsigned int idx)
 
static void shader_glsl_shader_prologue (struct vkd3d_glsl_generator *gen)
 
static void shader_glsl_shader_epilogue (struct vkd3d_glsl_generator *gen)
 
static void shader_glsl_ret (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
 
static void shader_glsl_dcl_indexable_temp (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
 
static void vkd3d_glsl_handle_instruction (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
 
static bool shader_glsl_check_shader_visibility (const struct vkd3d_glsl_generator *gen, enum vkd3d_shader_visibility visibility)
 
static bool shader_glsl_get_uav_binding (const struct vkd3d_glsl_generator *gen, unsigned int register_space, unsigned int register_idx, enum vkd3d_shader_resource_type resource_type, unsigned int *binding_idx)
 
static void shader_glsl_generate_uav_declaration (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_descriptor_info1 *uav)
 
static bool shader_glsl_get_cbv_binding (const struct vkd3d_glsl_generator *gen, unsigned int register_space, unsigned int register_idx, unsigned int *binding_idx)
 
static void shader_glsl_generate_cbv_declaration (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_descriptor_info1 *cbv)
 
static bool shader_glsl_get_combined_sampler_binding (const struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_combined_resource_sampler_info *crs, enum vkd3d_shader_resource_type resource_type, unsigned int *binding_idx)
 
static void shader_glsl_generate_sampler_declaration (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_combined_resource_sampler_info *crs)
 
static void shader_glsl_generate_descriptor_declarations (struct vkd3d_glsl_generator *gen)
 
static const struct signature_element * signature_get_element_by_location (const struct shader_signature *signature, unsigned int location)
 
static const char * shader_glsl_get_interpolation (struct vkd3d_glsl_generator *gen, const struct shader_signature *signature, const char *type, unsigned int location)
 
static void shader_glsl_generate_interface_block (struct vkd3d_glsl_generator *gen, const struct shader_signature *signature, const char *type, unsigned int count)
 
static void shader_glsl_generate_input_declarations (struct vkd3d_glsl_generator *gen)
 
static void shader_glsl_generate_output_declarations (struct vkd3d_glsl_generator *gen)
 
static void shader_glsl_handle_global_flags (struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, enum vsir_global_flags flags)
 
static void shader_glsl_generate_declarations (struct vkd3d_glsl_generator *gen)
 
static int vkd3d_glsl_generator_generate (struct vkd3d_glsl_generator *gen, struct vkd3d_shader_code *out)
 
static void vkd3d_glsl_generator_cleanup (struct vkd3d_glsl_generator *gen)
 
static void shader_glsl_init_limits (struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_version *version)
 
static void vkd3d_glsl_generator_init (struct vkd3d_glsl_generator *gen, struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info, const struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info, struct vkd3d_shader_message_context *message_context)
 
int glsl_compile (struct vsir_program *program, uint64_t config_flags, const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info, const struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
 

Function Documentation

◆ glsl_compile()

int glsl_compile ( struct vsir_program *  program,
uint64_t  config_flags,
const struct vkd3d_shader_scan_descriptor_info1 *  descriptor_info,
const struct vkd3d_shader_scan_combined_resource_sampler_info *  combined_sampler_info,
const struct vkd3d_shader_compile_info *  compile_info,
struct vkd3d_shader_code *  out,
struct vkd3d_shader_message_context *  message_context 
)

Definition at line 2467 of file glsl.c.

2472{
2473 struct vkd3d_glsl_generator generator;
2474 int ret;
2475
2476 if ((ret = vsir_program_transform(program, config_flags, compile_info, message_context)) < 0)
2477 return ret;
2478
2479 VKD3D_ASSERT(program->normalisation_level == VSIR_FULLY_NORMALISED_IO);
2480
2481 vkd3d_glsl_generator_init(&generator, program, compile_info,
2483 ret = vkd3d_glsl_generator_generate(&generator, out);
2484 vkd3d_glsl_generator_cleanup(&generator);
2485
2486 return ret;
2487}
return ret
Definition: mutex.c:147
GLuint program
Definition: glext.h:6723
static int vkd3d_glsl_generator_generate(struct vkd3d_glsl_generator *gen, struct vkd3d_shader_code *out)
Definition: glsl.c:2357
static void vkd3d_glsl_generator_cleanup(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:2400
static void vkd3d_glsl_generator_init(struct vkd3d_glsl_generator *gen, struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info, const struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info, struct vkd3d_shader_message_context *message_context)
Definition: glsl.c:2437
enum vkd3d_result vsir_program_transform(struct vsir_program *program, uint64_t config_flags, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_message_context *message_context)
Definition: ir.c:8324
struct vkd3d_shader_message_context * message_context
Definition: glsl.c:52
const struct vkd3d_shader_scan_descriptor_info1 * descriptor_info
Definition: glsl.c:67
const struct vkd3d_shader_scan_combined_resource_sampler_info * combined_sampler_info
Definition: glsl.c:68
#define VKD3D_ASSERT(cond)
Definition: vkd3d_common.h:49
@ VSIR_FULLY_NORMALISED_IO
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

Referenced by vsir_program_compile().

◆ glsl_dst_cleanup()

static void glsl_dst_cleanup ( struct glsl_dst *  dst,
struct vkd3d_string_buffer_cache *  cache 
)
static

Definition at line 445 of file glsl.c.

446{
448 vkd3d_string_buffer_release(cache, dst->register_name);
449}
GLenum GLenum dst
Definition: glext.h:6340
Definition: cache.c:41
void vkd3d_string_buffer_release(struct vkd3d_string_buffer_cache *cache, struct vkd3d_string_buffer *buffer)

Referenced by shader_glsl_binop(), shader_glsl_cast(), shader_glsl_dot(), shader_glsl_intrinsic(), shader_glsl_ld(), shader_glsl_load_uav_typed(), shader_glsl_mov(), shader_glsl_movc(), shader_glsl_mul_extended(), shader_glsl_relop(), shader_glsl_sample(), and shader_glsl_unary_op().

◆ glsl_dst_init()

static uint32_t glsl_dst_init ( struct glsl_dst *  glsl_dst,
struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins,
const struct vkd3d_shader_dst_param *  vsir_dst 
)
static

Definition at line 451 of file glsl.c.

453{
454 uint32_t write_mask = vsir_dst->write_mask;
455
456 if (ins->flags & VKD3DSI_PRECISE_XYZW)
457 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
458 "Internal compiler error: Unhandled 'precise' modifier.");
459 if (vsir_dst->reg.non_uniform)
460 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
461 "Internal compiler error: Unhandled 'non-uniform' modifier.");
462
463 glsl_dst->vsir = vsir_dst;
466
469
470 return write_mask;
471}
UINT32 uint32_t
Definition: types.h:75
static void shader_glsl_print_register_name(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_register *reg)
Definition: glsl.c:190
static void shader_glsl_print_write_mask(struct vkd3d_string_buffer *buffer, uint32_t write_mask)
Definition: glsl.c:313
Definition: glsl.c:40
const struct vkd3d_shader_dst_param * vsir
Definition: glsl.c:41
struct vkd3d_string_buffer * register_name
Definition: glsl.c:42
struct vkd3d_string_buffer * mask
Definition: glsl.c:43
struct vkd3d_string_buffer_cache string_buffers
Definition: glsl.c:49
struct vkd3d_shader_register reg
struct vkd3d_string_buffer * vkd3d_string_buffer_get(struct vkd3d_string_buffer_cache *cache)
#define VKD3DSI_PRECISE_XYZW
@ VKD3D_SHADER_ERROR_GLSL_INTERNAL

Referenced by shader_glsl_binop(), shader_glsl_cast(), shader_glsl_dot(), shader_glsl_intrinsic(), shader_glsl_ld(), shader_glsl_load_uav_typed(), shader_glsl_mov(), shader_glsl_movc(), shader_glsl_mul_extended(), shader_glsl_relop(), shader_glsl_sample(), and shader_glsl_unary_op().

◆ glsl_src_cleanup()

◆ glsl_src_init()

static void glsl_src_init ( struct glsl_src *  glsl_src,
struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_src_param *  vsir_src,
uint32_t  mask 
)
static

Definition at line 438 of file glsl.c.

440{
442 shader_glsl_print_src(glsl_src->str, gen, vsir_src, mask, vsir_src->reg.data_type);
443}
GLenum GLint GLuint mask
Definition: glext.h:6028
static void shader_glsl_print_src(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_src_param *vsir_src, uint32_t mask, enum vkd3d_data_type data_type)
Definition: glsl.c:384
Definition: glsl.c:35
struct vkd3d_string_buffer * str
Definition: glsl.c:36
struct vkd3d_shader_register reg

Referenced by shader_glsl_binop(), shader_glsl_case(), shader_glsl_cast(), shader_glsl_dot(), shader_glsl_if(), shader_glsl_intrinsic(), shader_glsl_ld(), shader_glsl_load_uav_typed(), shader_glsl_mov(), shader_glsl_movc(), shader_glsl_mul_extended(), shader_glsl_print_subscript(), shader_glsl_relop(), shader_glsl_store_uav_typed(), shader_glsl_switch(), and shader_glsl_unary_op().

◆ shader_glsl_begin_block()

static void shader_glsl_begin_block ( struct vkd3d_glsl_generator *  gen)
static

Definition at line 685 of file glsl.c.

686{
689 ++gen->indent;
690}
static void shader_glsl_print_indent(struct vkd3d_string_buffer *buffer, unsigned int indent)
Definition: glsl.c:162
struct vkd3d_string_buffer * buffer
Definition: glsl.c:50
unsigned int indent
Definition: glsl.c:53
int vkd3d_string_buffer_printf(struct vkd3d_string_buffer *buffer, const char *format,...)

Referenced by shader_glsl_else(), shader_glsl_if(), shader_glsl_loop(), and shader_glsl_switch().

◆ shader_glsl_binop()

static void shader_glsl_binop ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins,
const char *  op 
)
static

Definition at line 566 of file glsl.c.

568{
569 struct glsl_src src[2];
570 struct glsl_dst dst;
572
573 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
574 glsl_src_init(&src[0], gen, &ins->src[0], mask);
575 glsl_src_init(&src[1], gen, &ins->src[1], mask);
576
577 shader_glsl_print_assignment(gen, &dst, "%s %s %s", src[0].str->buffer, op, src[1].str->buffer);
578
582}
UINT op
Definition: effect.c:235
static void glsl_src_init(struct glsl_src *glsl_src, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_src_param *vsir_src, uint32_t mask)
Definition: glsl.c:438
static void glsl_src_cleanup(struct glsl_src *src, struct vkd3d_string_buffer_cache *cache)
Definition: glsl.c:326
static void glsl_dst_cleanup(struct glsl_dst *dst, struct vkd3d_string_buffer_cache *cache)
Definition: glsl.c:445
static uint32_t glsl_dst_init(struct glsl_dst *glsl_dst, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const struct vkd3d_shader_dst_param *vsir_dst)
Definition: glsl.c:451
const WCHAR * str
struct vkd3d_shader_src_param * src
struct vkd3d_shader_dst_param * dst

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_break()

static void shader_glsl_break ( struct vkd3d_glsl_generator *  gen)
static

Definition at line 723 of file glsl.c.

724{
726 vkd3d_string_buffer_printf(gen->buffer, "break;\n");
727}

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_case()

static void shader_glsl_case ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 748 of file glsl.c.

749{
750 struct glsl_src src;
751
752 glsl_src_init(&src, gen, &ins->src[0], VKD3DSP_WRITEMASK_0);
753
755 vkd3d_string_buffer_printf(gen->buffer, "case %s:\n", src.str->buffer);
756
758}
#define VKD3DSP_WRITEMASK_0

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_cast()

static void shader_glsl_cast ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins,
const char *  scalar_constructor,
const char *  vector_constructor 
)
static

Definition at line 656 of file glsl.c.

658{
659 unsigned int component_count;
660 struct glsl_src src;
661 struct glsl_dst dst;
663
664 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
665 glsl_src_init(&src, gen, &ins->src[0], mask);
666
668 shader_glsl_print_assignment(gen, &dst, "%s%u(%s)",
669 vector_constructor, component_count, src.str->buffer);
670 else
671 shader_glsl_print_assignment(gen, &dst, "%s(%s)",
672 scalar_constructor, src.str->buffer);
673
676}
unsigned int component_count
static unsigned int vsir_write_mask_component_count(uint32_t write_mask)

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_check_shader_visibility()

static bool shader_glsl_check_shader_visibility ( const struct vkd3d_glsl_generator *  gen,
enum vkd3d_shader_visibility  visibility 
)
static

Definition at line 1674 of file glsl.c.

1676{
1677 enum vkd3d_shader_type t = gen->program->shader_version.type;
1678
1679 switch (visibility)
1680 {
1682 return true;
1684 return t == VKD3D_SHADER_TYPE_VERTEX;
1686 return t == VKD3D_SHADER_TYPE_HULL;
1688 return t == VKD3D_SHADER_TYPE_DOMAIN;
1690 return t == VKD3D_SHADER_TYPE_GEOMETRY;
1692 return t == VKD3D_SHADER_TYPE_PIXEL;
1694 return t == VKD3D_SHADER_TYPE_COMPUTE;
1695 default:
1696 WARN("Invalid shader visibility %#x.\n", visibility);
1697 return false;
1698 }
1699}
#define WARN(fmt,...)
Definition: precomp.h:61
GLdouble GLdouble t
Definition: gl.h:2047
struct vsir_program * program
Definition: glsl.c:48
@ VKD3D_SHADER_VISIBILITY_DOMAIN
Definition: vkd3d_shader.h:391
@ VKD3D_SHADER_VISIBILITY_COMPUTE
Definition: vkd3d_shader.h:398
@ VKD3D_SHADER_VISIBILITY_PIXEL
Definition: vkd3d_shader.h:395
@ VKD3D_SHADER_VISIBILITY_ALL
Definition: vkd3d_shader.h:385
@ VKD3D_SHADER_VISIBILITY_GEOMETRY
Definition: vkd3d_shader.h:393
@ VKD3D_SHADER_VISIBILITY_VERTEX
Definition: vkd3d_shader.h:387
@ VKD3D_SHADER_VISIBILITY_HULL
Definition: vkd3d_shader.h:389
vkd3d_shader_type
@ VKD3D_SHADER_TYPE_VERTEX
@ VKD3D_SHADER_TYPE_HULL
@ VKD3D_SHADER_TYPE_GEOMETRY
@ VKD3D_SHADER_TYPE_COMPUTE
@ VKD3D_SHADER_TYPE_PIXEL
@ VKD3D_SHADER_TYPE_DOMAIN

Referenced by shader_glsl_get_cbv_binding(), shader_glsl_get_combined_sampler_binding(), and shader_glsl_get_uav_binding().

◆ shader_glsl_continue()

static void shader_glsl_continue ( struct vkd3d_glsl_generator *  gen)
static

Definition at line 729 of file glsl.c.

730{
732 vkd3d_string_buffer_printf(gen->buffer, "continue;\n");
733}

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_dcl_indexable_temp()

static void shader_glsl_dcl_indexable_temp ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 1475 of file glsl.c.

1477{
1479 vkd3d_string_buffer_printf(gen->buffer, "vec4 x%u[%u];\n",
1480 ins->declaration.indexable_temp.register_idx,
1481 ins->declaration.indexable_temp.register_size);
1482}
struct vkd3d_shader_indexable_temp indexable_temp
union vkd3d_shader_instruction::@6020 declaration

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_default()

static void shader_glsl_default ( struct vkd3d_glsl_generator *  gen)
static

Definition at line 760 of file glsl.c.

761{
763 vkd3d_string_buffer_printf(gen->buffer, "default:\n");
764}

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_dot()

static void shader_glsl_dot ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins,
uint32_t  src_mask 
)
static

Definition at line 584 of file glsl.c.

586{
587 unsigned int component_count;
588 struct glsl_src src[2];
589 struct glsl_dst dst;
590 uint32_t dst_mask;
591
592 dst_mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
593 glsl_src_init(&src[0], gen, &ins->src[0], src_mask);
594 glsl_src_init(&src[1], gen, &ins->src[1], src_mask);
595
597 shader_glsl_print_assignment(gen, &dst, "vec%d(dot(%s, %s))",
598 component_count, src[0].str->buffer, src[1].str->buffer);
599 else
600 shader_glsl_print_assignment(gen, &dst, "dot(%s, %s)",
601 src[0].str->buffer, src[1].str->buffer);
602
606}
UCHAR src_mask[]
Definition: GetObject.c:14

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_else()

static void shader_glsl_else ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 708 of file glsl.c.

709{
712 vkd3d_string_buffer_printf(gen->buffer, "else\n");
714}
static void shader_glsl_end_block(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:678
static void shader_glsl_begin_block(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:685

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_end_block()

static void shader_glsl_end_block ( struct vkd3d_glsl_generator *  gen)
static

Definition at line 678 of file glsl.c.

679{
680 --gen->indent;
683}

Referenced by shader_glsl_else(), and vkd3d_glsl_handle_instruction().

◆ shader_glsl_generate_cbv_declaration()

static void shader_glsl_generate_cbv_declaration ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_descriptor_info1 *  cbv 
)
static

Definition at line 1863 of file glsl.c.

1865{
1868 struct vkd3d_string_buffer *buffer = gen->buffer;
1869 const char *prefix = gen->prefix;
1870 unsigned int binding_idx;
1871 size_t size;
1872
1873 if (cbv->count != 1)
1874 {
1875 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED,
1876 "Constant buffer %u has unsupported descriptor array size %u.", cbv->register_id, cbv->count);
1877 return;
1878 }
1879
1880 if (!shader_glsl_get_cbv_binding(gen, cbv->register_space, cbv->register_index, &binding_idx))
1881 {
1882 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
1883 "No descriptor binding specified for constant buffer %u.", cbv->register_id);
1884 return;
1885 }
1886
1887 binding = &gen->interface_info->bindings[binding_idx].binding;
1888
1889 if (binding->set != 0)
1890 {
1891 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
1892 "Unsupported binding set %u specified for constant buffer %u.", binding->set, cbv->register_id);
1893 return;
1894 }
1895
1896 if (binding->count != 1)
1897 {
1898 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
1899 "Unsupported binding count %u specified for constant buffer %u.", binding->count, cbv->register_id);
1900 return;
1901 }
1902
1903 if (gen->offset_info && gen->offset_info->binding_offsets)
1904 {
1905 offset = &gen->offset_info->binding_offsets[binding_idx];
1906 if (offset->static_offset || offset->dynamic_offset_index != ~0u)
1907 {
1908 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1909 "Internal compiler error: Unhandled descriptor offset specified for constant buffer %u.",
1910 cbv->register_id);
1911 return;
1912 }
1913 }
1914
1915 size = align(cbv->buffer_size, VKD3D_VEC4_SIZE * sizeof(uint32_t));
1916 size /= VKD3D_VEC4_SIZE * sizeof(uint32_t);
1917
1919 "layout(std140, binding = %u) uniform block_%s_cb_%u { vec4 %s_cb_%u[%zu]; };\n",
1920 binding->binding, prefix, cbv->register_id, prefix, cbv->register_id, size);
1921}
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
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
static bool shader_glsl_get_cbv_binding(const struct vkd3d_glsl_generator *gen, unsigned int register_space, unsigned int register_idx, unsigned int *binding_idx)
Definition: glsl.c:1832
static RPC_BINDING_HANDLE binding
Definition: server.c:166
#define uint32_t
Definition: nsiface.idl:61
const struct vkd3d_shader_interface_info * interface_info
Definition: glsl.c:65
const struct vkd3d_shader_descriptor_offset_info * offset_info
Definition: glsl.c:66
const char * prefix
Definition: glsl.c:54
Character const *const prefix
Definition: tempnam.cpp:195
@ VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND
@ VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED
#define VKD3D_VEC4_SIZE
static size_t align(size_t addr, size_t alignment)

Referenced by shader_glsl_generate_descriptor_declarations().

◆ shader_glsl_generate_declarations()

static void shader_glsl_generate_declarations ( struct vkd3d_glsl_generator *  gen)
static

Definition at line 2329 of file glsl.c.

2330{
2331 const struct vsir_program *program = gen->program;
2332 struct vkd3d_string_buffer *buffer = gen->buffer;
2333 const struct vsir_thread_group_size *group_size;
2334
2335 if (program->shader_version.type == VKD3D_SHADER_TYPE_COMPUTE)
2336 {
2337 group_size = &program->thread_group_size;
2338 vkd3d_string_buffer_printf(buffer, "layout(local_size_x = %u, local_size_y = %u, local_size_z = %u) in;\n\n",
2339 group_size->x, group_size->y, group_size->z);
2340 }
2341
2342 shader_glsl_handle_global_flags(buffer, gen, program->global_flags);
2343
2347
2348 if (gen->limits.input_count)
2349 vkd3d_string_buffer_printf(buffer, "vec4 %s_in[%u];\n", gen->prefix, gen->limits.input_count);
2350 if (gen->limits.output_count)
2351 vkd3d_string_buffer_printf(buffer, "vec4 %s_out[%u];\n", gen->prefix, gen->limits.output_count);
2352 if (program->temp_count)
2353 vkd3d_string_buffer_printf(buffer, "vec4 r[%u];\n", program->temp_count);
2355}
static void shader_glsl_generate_output_declarations(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:2247
static void shader_glsl_handle_global_flags(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, enum vsir_global_flags flags)
Definition: glsl.c:2315
static void shader_glsl_generate_descriptor_declarations(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:2085
static void shader_glsl_generate_input_declarations(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:2186
struct vkd3d_glsl_generator::shader_limits limits

Referenced by vkd3d_glsl_generator_generate().

◆ shader_glsl_generate_descriptor_declarations()

static void shader_glsl_generate_descriptor_declarations ( struct vkd3d_glsl_generator *  gen)
static

Definition at line 2085 of file glsl.c.

2086{
2090 unsigned int i;
2091
2092 for (i = 0; i < info->descriptor_count; ++i)
2093 {
2094 descriptor = &info->descriptors[i];
2095
2096 switch (descriptor->type)
2097 {
2100 /* GLSL uses combined resource/sampler descriptors.*/
2101 break;
2102
2105 break;
2106
2109 break;
2110
2111 default:
2112 vkd3d_string_buffer_printf(gen->buffer, "/* <unhandled descriptor type %#x> */\n", descriptor->type);
2113 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2114 "Internal compiler error: Unhandled descriptor type %#x.", descriptor->type);
2115 break;
2116 }
2117 }
2118 for (i = 0; i < sampler_info->combined_sampler_count; ++i)
2119 {
2121 }
2122 if (info->descriptor_count)
2124}
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
static void shader_glsl_generate_sampler_declaration(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_combined_resource_sampler_info *crs)
Definition: glsl.c:1964
static void shader_glsl_generate_uav_declaration(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_descriptor_info1 *uav)
Definition: glsl.c:1736
static void shader_glsl_generate_cbv_declaration(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_descriptor_info1 *cbv)
Definition: glsl.c:1863
descriptor
Definition: scsi.h:3997
struct vkd3d_shader_combined_resource_sampler_info * combined_samplers
@ VKD3D_SHADER_DESCRIPTOR_TYPE_UAV
Definition: vkd3d_shader.h:430
@ VKD3D_SHADER_DESCRIPTOR_TYPE_CBV
Definition: vkd3d_shader.h:435
@ VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER
Definition: vkd3d_shader.h:440
@ VKD3D_SHADER_DESCRIPTOR_TYPE_SRV
Definition: vkd3d_shader.h:425

Referenced by shader_glsl_generate_declarations().

◆ shader_glsl_generate_input_declarations()

static void shader_glsl_generate_input_declarations ( struct vkd3d_glsl_generator *  gen)
static

Definition at line 2186 of file glsl.c.

2187{
2188 const struct shader_signature *signature = &gen->program->input_signature;
2189 struct vkd3d_string_buffer *buffer = gen->buffer;
2190 const struct signature_element *e;
2191 unsigned int i, count;
2192
2193 if (!gen->interstage_input)
2194 {
2195 for (i = 0, count = 0; i < signature->element_count; ++i)
2196 {
2197 e = &signature->elements[i];
2198
2199 if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED || e->sysval_semantic)
2200 continue;
2201
2202 if (e->min_precision != VKD3D_SHADER_MINIMUM_PRECISION_NONE)
2203 {
2204 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2205 "Internal compiler error: Unhandled minimum precision %#x.", e->min_precision);
2206 continue;
2207 }
2208
2209 if (e->interpolation_mode != VKD3DSIM_NONE)
2210 {
2211 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2212 "Internal compiler error: Unhandled interpolation mode %#x.", e->interpolation_mode);
2213 continue;
2214 }
2215
2216 vkd3d_string_buffer_printf(buffer, "layout(location = %u) in ", e->target_location);
2217 switch (e->component_type)
2218 {
2221 break;
2224 break;
2227 break;
2228 default:
2229 vkd3d_string_buffer_printf(buffer, "<unhandled type %#x>", e->component_type);
2230 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2231 "Internal compiler error: Unhandled input component type %#x.", e->component_type);
2232 break;
2233 }
2234 vkd3d_string_buffer_printf(buffer, " shader_in_%u;\n", i);
2235 ++count;
2236 }
2237 if (count)
2239 }
2240 else if (gen->limits.input_count)
2241 {
2242 shader_glsl_generate_interface_block(gen, signature, "in", gen->limits.input_count);
2244 }
2245}
GLuint GLuint GLsizei count
Definition: gl.h:1545
static void shader_glsl_generate_interface_block(struct vkd3d_glsl_generator *gen, const struct shader_signature *signature, const char *type, unsigned int count)
Definition: glsl.c:2170
#define e
Definition: ke_i.h:82
bool interstage_input
Definition: glsl.c:62
@ VKD3D_SHADER_COMPONENT_INT
@ VKD3D_SHADER_COMPONENT_UINT
@ VKD3D_SHADER_COMPONENT_FLOAT
@ VKD3D_SHADER_MINIMUM_PRECISION_NONE
@ VKD3DSIM_NONE
#define SIGNATURE_TARGET_LOCATION_UNUSED

Referenced by shader_glsl_generate_declarations().

◆ shader_glsl_generate_interface_block()

static void shader_glsl_generate_interface_block ( struct vkd3d_glsl_generator *  gen,
const struct shader_signature *  signature,
const char *  type,
unsigned int  count 
)
static

Definition at line 2170 of file glsl.c.

2172{
2173 struct vkd3d_string_buffer *buffer = gen->buffer;
2174 const char *interpolation;
2175 unsigned int i;
2176
2177 vkd3d_string_buffer_printf(buffer, "%s shader_in_out\n{\n", type);
2178 for (i = 0; i < count; ++i)
2179 {
2180 interpolation = shader_glsl_get_interpolation(gen, signature, type, i);
2181 vkd3d_string_buffer_printf(buffer, " %svec4 reg_%u;\n", interpolation, i);
2182 }
2183 vkd3d_string_buffer_printf(buffer, "} shader_%s;\n", type);
2184}
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
static const char * shader_glsl_get_interpolation(struct vkd3d_glsl_generator *gen, const struct shader_signature *signature, const char *type, unsigned int location)
Definition: glsl.c:2145

Referenced by shader_glsl_generate_input_declarations(), and shader_glsl_generate_output_declarations().

◆ shader_glsl_generate_output_declarations()

static void shader_glsl_generate_output_declarations ( struct vkd3d_glsl_generator *  gen)
static

Definition at line 2247 of file glsl.c.

2248{
2249 const struct shader_signature *signature = &gen->program->output_signature;
2250 struct vkd3d_string_buffer *buffer = gen->buffer;
2251 const struct signature_element *e;
2252 unsigned int i, count;
2253
2254 if (!gen->interstage_output)
2255 {
2256 for (i = 0, count = 0; i < signature->element_count; ++i)
2257 {
2258 e = &signature->elements[i];
2259
2260 if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED)
2261 continue;
2262
2263 if (e->sysval_semantic != VKD3D_SHADER_SV_TARGET)
2264 {
2265 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2266 "Internal compiler error: Unhandled system value %#x.", e->sysval_semantic);
2267 continue;
2268 }
2269
2270 if (e->min_precision != VKD3D_SHADER_MINIMUM_PRECISION_NONE)
2271 {
2272 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2273 "Internal compiler error: Unhandled minimum precision %#x.", e->min_precision);
2274 continue;
2275 }
2276
2277 if (e->interpolation_mode != VKD3DSIM_NONE)
2278 {
2279 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2280 "Internal compiler error: Unhandled interpolation mode %#x.", e->interpolation_mode);
2281 continue;
2282 }
2283
2284 vkd3d_string_buffer_printf(buffer, "layout(location = %u) out ", e->target_location);
2285 switch (e->component_type)
2286 {
2289 break;
2292 break;
2295 break;
2296 default:
2297 vkd3d_string_buffer_printf(buffer, "<unhandled type %#x>", e->component_type);
2298 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2299 "Internal compiler error: Unhandled output component type %#x.", e->component_type);
2300 break;
2301 }
2302 vkd3d_string_buffer_printf(buffer, " shader_out_%u;\n", e->semantic_index);
2303 ++count;
2304 }
2305 if (count)
2307 }
2308 else if (gen->limits.output_count)
2309 {
2310 shader_glsl_generate_interface_block(gen, signature, "out", gen->limits.output_count);
2312 }
2313}
bool interstage_output
Definition: glsl.c:63
@ VKD3D_SHADER_SV_TARGET

Referenced by shader_glsl_generate_declarations().

◆ shader_glsl_generate_sampler_declaration()

static void shader_glsl_generate_sampler_declaration ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_combined_resource_sampler_info *  crs 
)
static

Definition at line 1964 of file glsl.c.

1966{
1967 const struct vkd3d_shader_descriptor_info1 *sampler, *srv;
1970 struct vkd3d_string_buffer *buffer = gen->buffer;
1972 const char *sampler_type, *sampler_type_prefix;
1973 enum vkd3d_shader_resource_type resource_type;
1974 unsigned int binding_idx;
1975 bool shadow = false;
1976
1978 {
1980 crs->sampler_index, crs->sampler_space)))
1981 {
1982 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1983 "Internal compiler error: No descriptor found for sampler %u, space %u.",
1984 crs->sampler_index, crs->sampler_space);
1985 return;
1986 }
1988 }
1989
1991 crs->resource_index, crs->resource_space)))
1992 {
1993 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1994 "Internal compiler error: No descriptor found for resource %u, space %u.",
1995 crs->resource_index, crs->resource_space);
1996 return;
1997 }
1998
1999 resource_type = srv->resource_type;
2000 if (srv->sample_count == 1)
2001 {
2002 /* The OpenGL API distinguishes between multi-sample textures with
2003 * sample count 1 and single-sample textures. Direct3D and Vulkan
2004 * don't make this distinction at the API level, but Direct3D shaders
2005 * are capable of expressing both. We therefore map such multi-sample
2006 * textures to their single-sample equivalents here. */
2007 if (resource_type == VKD3D_SHADER_RESOURCE_TEXTURE_2DMS)
2008 resource_type = VKD3D_SHADER_RESOURCE_TEXTURE_2D;
2009 else if (resource_type == VKD3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY)
2011 }
2012
2014 {
2015 sampler_type = resource_type_info->type_suffix;
2016 if (shadow && !resource_type_info->shadow)
2017 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED,
2018 "Comparison samplers are not supported with resource type %#x.", resource_type);
2019 }
2020 else
2021 {
2022 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2023 "Internal compiler error: Unhandled resource type %#x for combined resource/sampler "
2024 "for resource %u, space %u and sampler %u, space %u.", resource_type,
2026 sampler_type = "<unhandled sampler type>";
2027 }
2028
2030 {
2032 sampler_type_prefix = "u";
2033 break;
2035 sampler_type_prefix = "i";
2036 break;
2038 sampler_type_prefix = "";
2039 break;
2040 default:
2041 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2042 "Internal compiler error: Unhandled component type %#x for combined resource/sampler "
2043 "for resource %u, space %u and sampler %u, space %u.", component_type,
2045 sampler_type_prefix = "";
2046 break;
2047 }
2048
2049 if (!shader_glsl_get_combined_sampler_binding(gen, crs, resource_type, &binding_idx))
2050 {
2051 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
2052 "No descriptor binding specified for combined resource/sampler "
2053 "for resource %u, space %u and sampler %u, space %u.",
2055 return;
2056 }
2057
2058 binding = &gen->interface_info->combined_samplers[binding_idx].binding;
2059
2060 if (binding->set != 0)
2061 {
2062 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
2063 "Unsupported binding set %u specified for combined resource/sampler "
2064 "for resource %u, space %u and sampler %u, space %u.", binding->set,
2066 return;
2067 }
2068
2069 if (binding->count != 1)
2070 {
2071 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
2072 "Unsupported binding count %u specified for combined resource/sampler "
2073 "for resource %u, space %u and sampler %u, space %u.", binding->count,
2075 return;
2076 }
2077
2078 vkd3d_string_buffer_printf(buffer, "layout(binding = %u) uniform %ssampler%s%s ",
2079 binding->binding, sampler_type_prefix, sampler_type, shadow ? "Shadow" : "");
2081 crs->resource_space, crs->sampler_index, crs->sampler_space);
2083}
component_type
GLuint sampler
Definition: glext.h:7283
static void shader_glsl_print_combined_sampler_name(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, unsigned int resource_index, unsigned int resource_space, unsigned int sampler_index, unsigned int sampler_space)
Definition: glsl.c:167
static bool shader_glsl_get_combined_sampler_binding(const struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_combined_resource_sampler_info *crs, enum vkd3d_shader_resource_type resource_type, unsigned int *binding_idx)
Definition: glsl.c:1923
static const struct glsl_resource_type_info * shader_glsl_get_resource_type_info(enum vkd3d_shader_resource_type t)
Definition: glsl.c:107
static const struct vkd3d_shader_descriptor_info1 * shader_glsl_get_descriptor(struct vkd3d_glsl_generator *gen, enum vkd3d_shader_descriptor_type type, unsigned int idx, unsigned int space)
Definition: glsl.c:130
static const struct @335 resource_type_info[]
enum vkd3d_shader_resource_data_type resource_data_type
enum vkd3d_shader_resource_type resource_type
@ VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_SAMPLER_COMPARISON_MODE
#define VKD3D_SHADER_DUMMY_SAMPLER_INDEX
Definition: vkd3d_shader.h:964
vkd3d_shader_component_type
vkd3d_shader_resource_type
@ VKD3D_SHADER_RESOURCE_TEXTURE_2DARRAY
@ VKD3D_SHADER_RESOURCE_TEXTURE_2DMS
@ VKD3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY
@ VKD3D_SHADER_RESOURCE_TEXTURE_2D
static enum vkd3d_shader_component_type vkd3d_component_type_from_resource_data_type(enum vkd3d_shader_resource_data_type data_type)

Referenced by shader_glsl_generate_descriptor_declarations().

◆ shader_glsl_generate_uav_declaration()

static void shader_glsl_generate_uav_declaration ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_descriptor_info1 *  uav 
)
static

Definition at line 1736 of file glsl.c.

1738{
1740 const char *image_type_prefix, *image_type, *read_format;
1743 struct vkd3d_string_buffer *buffer = gen->buffer;
1745 unsigned int binding_idx;
1746
1747 if (uav->count != 1)
1748 {
1749 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED,
1750 "UAV %u has unsupported descriptor array size %u.", uav->register_id, uav->count);
1751 return;
1752 }
1753
1755 uav->register_index, uav->resource_type, &binding_idx))
1756 {
1757 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
1758 "No descriptor binding specified for UAV %u.", uav->register_id);
1759 return;
1760 }
1761
1762 binding = &gen->interface_info->bindings[binding_idx].binding;
1763
1764 if (binding->set != 0)
1765 {
1766 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
1767 "Unsupported binding set %u specified for UAV %u.", binding->set, uav->register_id);
1768 return;
1769 }
1770
1771 if (binding->count != 1)
1772 {
1773 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
1774 "Unsupported binding count %u specified for UAV %u.", binding->count, uav->register_id);
1775 return;
1776 }
1777
1778 if (gen->offset_info && gen->offset_info->binding_offsets)
1779 {
1780 offset = &gen->offset_info->binding_offsets[binding_idx];
1781 if (offset->static_offset || offset->dynamic_offset_index != ~0u)
1782 {
1783 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1784 "Internal compiler error: Unhandled descriptor offset specified for UAV %u.",
1785 uav->register_id);
1786 return;
1787 }
1788 }
1789
1791 {
1792 image_type = resource_type_info->type_suffix;
1793 }
1794 else
1795 {
1796 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1797 "Internal compiler error: Unhandled UAV type %#x.", uav->resource_type);
1798 image_type = "<unhandled image type>";
1799 }
1800
1802 {
1804 image_type_prefix = "u";
1805 read_format = "r32ui";
1806 break;
1808 image_type_prefix = "i";
1809 read_format = "r32i";
1810 break;
1811 default:
1812 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1813 "Internal compiler error: Unhandled component type %#x for UAV %u.",
1815 /* fall through */
1817 image_type_prefix = "";
1818 read_format = "r32f";
1819 break;
1820 }
1821
1822 vkd3d_string_buffer_printf(buffer, "layout(binding = %u", binding->binding);
1824 vkd3d_string_buffer_printf(buffer, ", %s) ", read_format);
1825 else
1826 vkd3d_string_buffer_printf(buffer, ") writeonly ");
1827 vkd3d_string_buffer_printf(buffer, "uniform %simage%s ", image_type_prefix, image_type);
1830}
static bool shader_glsl_get_uav_binding(const struct vkd3d_glsl_generator *gen, unsigned int register_space, unsigned int register_idx, enum vkd3d_shader_resource_type resource_type, unsigned int *binding_idx)
Definition: glsl.c:1701
static void shader_glsl_print_image_name(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, unsigned int idx, unsigned int space)
Definition: glsl.c:182
@ VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_READ

Referenced by shader_glsl_generate_descriptor_declarations().

◆ shader_glsl_get_cbv_binding()

static bool shader_glsl_get_cbv_binding ( const struct vkd3d_glsl_generator *  gen,
unsigned int  register_space,
unsigned int  register_idx,
unsigned int *  binding_idx 
)
static

Definition at line 1832 of file glsl.c.

1834{
1837 unsigned int i;
1838
1839 if (!interface_info)
1840 return false;
1841
1842 for (i = 0; i < interface_info->binding_count; ++i)
1843 {
1844 binding = &interface_info->bindings[i];
1845
1847 continue;
1848 if (binding->register_space != register_space)
1849 continue;
1850 if (binding->register_index != register_idx)
1851 continue;
1852 if (!shader_glsl_check_shader_visibility(gen, binding->shader_visibility))
1853 continue;
1855 continue;
1856 *binding_idx = i;
1857 return true;
1858 }
1859
1860 return false;
1861}
static bool shader_glsl_check_shader_visibility(const struct vkd3d_glsl_generator *gen, enum vkd3d_shader_visibility visibility)
Definition: glsl.c:1674
@ VKD3D_SHADER_BINDING_FLAG_BUFFER
Definition: vkd3d_shader.h:468

Referenced by shader_glsl_generate_cbv_declaration().

◆ shader_glsl_get_combined_sampler_binding()

static bool shader_glsl_get_combined_sampler_binding ( const struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_combined_resource_sampler_info *  crs,
enum vkd3d_shader_resource_type  resource_type,
unsigned int *  binding_idx 
)
static

Definition at line 1923 of file glsl.c.

1926{
1929 enum vkd3d_shader_binding_flag resource_type_flag;
1930 unsigned int i;
1931
1932 if (!interface_info)
1933 return false;
1934
1935 resource_type_flag = resource_type == VKD3D_SHADER_RESOURCE_BUFFER
1937
1938 for (i = 0; i < interface_info->combined_sampler_count; ++i)
1939 {
1940 s = &interface_info->combined_samplers[i];
1941
1942 if (s->resource_space != crs->resource_space)
1943 continue;
1944 if (s->resource_index != crs->resource_index)
1945 continue;
1947 {
1948 if (s->sampler_space != crs->sampler_space)
1949 continue;
1950 if (s->sampler_index != crs->sampler_index)
1951 continue;
1952 }
1953 if (!shader_glsl_check_shader_visibility(gen, s->shader_visibility))
1954 continue;
1955 if (!(s->flags & resource_type_flag))
1956 continue;
1957 *binding_idx = i;
1958 return true;
1959 }
1960
1961 return false;
1962}
GLdouble s
Definition: gl.h:2039
@ VKD3D_SHADER_RESOURCE_BUFFER
vkd3d_shader_binding_flag
Definition: vkd3d_shader.h:467
@ VKD3D_SHADER_BINDING_FLAG_IMAGE
Definition: vkd3d_shader.h:469

Referenced by shader_glsl_generate_sampler_declaration().

◆ shader_glsl_get_descriptor()

static const struct vkd3d_shader_descriptor_info1 * shader_glsl_get_descriptor ( struct vkd3d_glsl_generator *  gen,
enum vkd3d_shader_descriptor_type  type,
unsigned int  idx,
unsigned int  space 
)
static

Definition at line 130 of file glsl.c.

132{
134
135 for (unsigned int i = 0; i < info->descriptor_count; ++i)
136 {
137 const struct vkd3d_shader_descriptor_info1 *d = &info->descriptors[i];
138
139 if (d->type == type && d->register_space == space && d->register_index == idx)
140 return d;
141 }
142
143 return NULL;
144}
#define NULL
Definition: types.h:112
unsigned int idx
Definition: utils.c:40
#define d
Definition: ke_i.h:81

Referenced by shader_glsl_generate_sampler_declaration().

◆ shader_glsl_get_descriptor_by_id()

static const struct vkd3d_shader_descriptor_info1 * shader_glsl_get_descriptor_by_id ( struct vkd3d_glsl_generator *  gen,
enum vkd3d_shader_descriptor_type  type,
unsigned int  id 
)
static

Definition at line 146 of file glsl.c.

148{
150
151 for (unsigned int i = 0; i < info->descriptor_count; ++i)
152 {
153 const struct vkd3d_shader_descriptor_info1 *d = &info->descriptors[i];
154
155 if (d->type == type && d->register_id == id)
156 return d;
157 }
158
159 return NULL;
160}

Referenced by shader_glsl_ld(), shader_glsl_load_uav_typed(), shader_glsl_sample(), and shader_glsl_store_uav_typed().

◆ shader_glsl_get_interpolation()

static const char * shader_glsl_get_interpolation ( struct vkd3d_glsl_generator *  gen,
const struct shader_signature *  signature,
const char *  type,
unsigned int  location 
)
static

Definition at line 2145 of file glsl.c.

2147{
2149 const struct signature_element *e;
2150
2152 m = e->interpolation_mode;
2153 else
2154 m = VKD3DSIM_NONE;
2155
2156 switch (m)
2157 {
2158 case VKD3DSIM_NONE:
2159 case VKD3DSIM_LINEAR:
2160 return "";
2161 case VKD3DSIM_CONSTANT:
2162 return "flat ";
2163 default:
2164 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2165 "Internal compiler error: Unhandled interpolation mode %#x for %s location %u.", m, type, location);
2166 return "";
2167 }
2168}
const GLfloat * m
Definition: glext.h:10848
static const struct signature_element * signature_get_element_by_location(const struct shader_signature *signature, unsigned int location)
Definition: glsl.c:2126
vkd3d_shader_interpolation_mode
@ VKD3DSIM_CONSTANT
@ VKD3DSIM_LINEAR

Referenced by shader_glsl_generate_interface_block().

◆ shader_glsl_get_prefix()

static const char * shader_glsl_get_prefix ( enum vkd3d_shader_type  type)
static

Definition at line 86 of file glsl.c.

87{
88 switch (type)
89 {
91 return "vs";
93 return "hs";
95 return "ds";
97 return "gs";
99 return "ps";
101 return "cs";
102 default:
103 return NULL;
104 }
105}

Referenced by vkd3d_glsl_generator_init().

◆ shader_glsl_get_resource_type_info()

static const struct glsl_resource_type_info * shader_glsl_get_resource_type_info ( enum vkd3d_shader_resource_type  t)
static

Definition at line 107 of file glsl.c.

108{
109 static const struct glsl_resource_type_info info[] =
110 {
111 {0, 0, 0, "None"}, /* VKD3D_SHADER_RESOURCE_NONE */
112 {1, 0, 0, "Buffer"}, /* VKD3D_SHADER_RESOURCE_BUFFER */
113 {1, 0, 1, "1D"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_1D */
114 {2, 0, 1, "2D"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_2D */
115 {2, 0, 0, "2DMS"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_2DMS */
116 {3, 0, 0, "3D"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_3D */
117 {3, 0, 1, "Cube"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_CUBE */
118 {2, 1, 1, "1DArray"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_1DARRAY */
119 {3, 1, 1, "2DArray"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_2DARRAY */
120 {3, 1, 0, "2DMSArray"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY */
121 {4, 1, 1, "CubeArray"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_CUBEARRAY */
122 };
123
124 if (!t || t >= ARRAY_SIZE(info))
125 return NULL;
126
127 return &info[t];
128}
#define ARRAY_SIZE(A)
Definition: main.h:20

Referenced by shader_glsl_generate_sampler_declaration(), shader_glsl_generate_uav_declaration(), shader_glsl_ld(), shader_glsl_load_uav_typed(), shader_glsl_sample(), and shader_glsl_store_uav_typed().

◆ shader_glsl_get_uav_binding()

static bool shader_glsl_get_uav_binding ( const struct vkd3d_glsl_generator *  gen,
unsigned int  register_space,
unsigned int  register_idx,
enum vkd3d_shader_resource_type  resource_type,
unsigned int *  binding_idx 
)
static

Definition at line 1701 of file glsl.c.

1703{
1706 enum vkd3d_shader_binding_flag resource_type_flag;
1707 unsigned int i;
1708
1709 if (!interface_info)
1710 return false;
1711
1712 resource_type_flag = resource_type == VKD3D_SHADER_RESOURCE_BUFFER
1714
1715 for (i = 0; i < interface_info->binding_count; ++i)
1716 {
1717 binding = &interface_info->bindings[i];
1718
1720 continue;
1721 if (binding->register_space != register_space)
1722 continue;
1723 if (binding->register_index != register_idx)
1724 continue;
1725 if (!shader_glsl_check_shader_visibility(gen, binding->shader_visibility))
1726 continue;
1727 if (!(binding->flags & resource_type_flag))
1728 continue;
1729 *binding_idx = i;
1730 return true;
1731 }
1732
1733 return false;
1734}

Referenced by shader_glsl_generate_uav_declaration().

◆ shader_glsl_handle_global_flags()

static void shader_glsl_handle_global_flags ( struct vkd3d_string_buffer *  buffer,
struct vkd3d_glsl_generator *  gen,
enum vsir_global_flags  flags 
)
static

Definition at line 2315 of file glsl.c.

2317{
2319 {
2320 vkd3d_string_buffer_printf(buffer, "layout(early_fragment_tests) in;\n");
2321 flags &= ~VKD3DSGF_FORCE_EARLY_DEPTH_STENCIL;
2322 }
2323
2324 if (flags)
2325 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2326 "Internal compiler error: Unhandled global flags %#"PRIx64".", (uint64_t)flags);
2327}
UINT64 uint64_t
Definition: types.h:77
#define PRIx64
Definition: inttypes.h:29
GLbitfield flags
Definition: glext.h:7161
@ VKD3DSGF_FORCE_EARLY_DEPTH_STENCIL

Referenced by shader_glsl_generate_declarations().

◆ shader_glsl_if()

static void shader_glsl_if ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 692 of file glsl.c.

693{
694 const char *condition;
695 struct glsl_src src;
696
697 glsl_src_init(&src, gen, &ins->src[0], VKD3DSP_WRITEMASK_0);
698
700 condition = ins->flags == VKD3D_SHADER_CONDITIONAL_OP_NZ ? "bool" : "!bool";
701 vkd3d_string_buffer_printf(gen->buffer, "if (%s(%s))\n", condition, src.str->buffer);
702
704
706}
GLenum condition
Definition: glext.h:9255
@ VKD3D_SHADER_CONDITIONAL_OP_NZ

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_init_limits()

static void shader_glsl_init_limits ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_version *  version 
)
static

Definition at line 2406 of file glsl.c.

2407{
2408 struct shader_limits *limits = &gen->limits;
2409
2410 if (version->major < 4 || version->major >= 6)
2411 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2412 "Internal compiler error: Unhandled shader version %u.%u.", version->major, version->minor);
2413
2414 switch (version->type)
2415 {
2417 limits->input_count = 32;
2418 limits->output_count = 32;
2419 break;
2421 limits->input_count = 32;
2422 limits->output_count = 8;
2423 break;
2425 limits->input_count = 0;
2426 limits->output_count = 0;
2427 break;
2428 default:
2429 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2430 "Internal compiler error: Unhandled shader type %#x.", version->type);
2431 limits->input_count = 0;
2432 limits->output_count = 0;
2433 break;
2434 }
2435}
static const WCHAR version[]
Definition: asmname.c:66

Referenced by vkd3d_glsl_generator_init().

◆ shader_glsl_intrinsic()

static void shader_glsl_intrinsic ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins,
const char *  op 
)
static

Definition at line 608 of file glsl.c.

610{
612 struct glsl_src src;
613 struct glsl_dst dst;
614 unsigned int i;
616
617 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
619
620 for (i = 0; i < ins->src_count; ++i)
621 {
622 glsl_src_init(&src, gen, &ins->src[i], mask);
623 vkd3d_string_buffer_printf(args, "%s%s", i ? ", " : "", src.str->buffer);
625 }
626 shader_glsl_print_assignment(gen, &dst, "%s(%s)", op, args->buffer);
627
630}
#define args
Definition: format.c:66
Definition: match.c:390

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_ld()

static void shader_glsl_ld ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 787 of file glsl.c.

788{
789 unsigned int resource_id, resource_idx, resource_space, sample_count;
791 const struct vkd3d_shader_descriptor_info1 *d;
792 enum vkd3d_shader_component_type sampled_type;
794 struct vkd3d_string_buffer *fetch;
796 struct glsl_src coord;
797 struct glsl_dst dst;
798 uint32_t coord_mask;
799
801 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
802 "Internal compiler error: Unhandled texel fetch offset.");
803
804 if (ins->src[1].reg.idx[0].rel_addr || ins->src[1].reg.idx[1].rel_addr)
805 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED,
806 "Descriptor indexing is not supported.");
807
808 resource_id = ins->src[1].reg.idx[0].offset;
809 resource_idx = ins->src[1].reg.idx[1].offset;
811 {
812 resource_type = d->resource_type;
813 resource_space = d->register_space;
814 sample_count = d->sample_count;
815 sampled_type = vkd3d_component_type_from_resource_data_type(d->resource_data_type);
817 }
818 else
819 {
820 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
821 "Internal compiler error: Undeclared resource descriptor %u.", resource_id);
822 resource_space = 0;
823 resource_type = VKD3D_SHADER_RESOURCE_TEXTURE_2D;
824 sample_count = 1;
826 }
827
829 {
831 }
832 else
833 {
834 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
835 "Internal compiler error: Unhandled resource type %#x.", resource_type);
837 }
838
839 glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
840 glsl_src_init(&coord, gen, &ins->src[0], coord_mask);
842
843 vkd3d_string_buffer_printf(fetch, "texelFetch(");
844 shader_glsl_print_combined_sampler_name(fetch, gen, resource_idx,
845 resource_space, VKD3D_SHADER_DUMMY_SAMPLER_INDEX, 0);
846 vkd3d_string_buffer_printf(fetch, ", %s", coord.str->buffer);
847 if (resource_type != VKD3D_SHADER_RESOURCE_BUFFER)
848 {
849 vkd3d_string_buffer_printf(fetch, ", ");
850 if (ins->opcode != VKD3DSIH_LD2DMS)
851 shader_glsl_print_src(fetch, gen, &ins->src[0], VKD3DSP_WRITEMASK_3, ins->src[0].reg.data_type);
852 else if (sample_count == 1)
853 /* If the resource isn't a true multisample resource, this is the
854 * "lod" parameter instead of the "sample" parameter. */
855 vkd3d_string_buffer_printf(fetch, "0");
856 else
857 shader_glsl_print_src(fetch, gen, &ins->src[2], VKD3DSP_WRITEMASK_0, ins->src[2].reg.data_type);
858 }
859 vkd3d_string_buffer_printf(fetch, ")");
860 shader_glsl_print_swizzle(fetch, ins->src[1].swizzle, ins->dst[0].write_mask);
861
862 shader_glsl_print_assignment_ext(gen, &dst, data_type, "%s", fetch->buffer);
863
867}
GLuint coord
Definition: glext.h:9511
static const struct vkd3d_shader_descriptor_info1 * shader_glsl_get_descriptor_by_id(struct vkd3d_glsl_generator *gen, enum vkd3d_shader_descriptor_type type, unsigned int id)
Definition: glsl.c:146
static void shader_glsl_print_swizzle(struct vkd3d_string_buffer *buffer, uint32_t swizzle, uint32_t mask)
Definition: glsl.c:300
enum wined3d_data_type data_type
Definition: glsl_shader.c:71
enum vkd3d_shader_opcode opcode
static bool vkd3d_shader_instruction_has_texel_offset(const struct vkd3d_shader_instruction *ins)
#define VKD3DSP_WRITEMASK_3
static unsigned int vkd3d_write_mask_from_component_count(unsigned int component_count)
@ VKD3D_DATA_FLOAT
@ VKD3DSIH_LD2DMS
static enum vkd3d_data_type vkd3d_data_type_from_component_type(enum vkd3d_shader_component_type component_type)

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_load_uav_typed()

static void shader_glsl_load_uav_typed ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 1055 of file glsl.c.

1056{
1059 const struct vkd3d_shader_descriptor_info1 *d;
1061 unsigned int uav_id, uav_idx, uav_space;
1062 struct vkd3d_string_buffer *load;
1063 struct glsl_src coord;
1064 struct glsl_dst dst;
1065 uint32_t coord_mask;
1066
1067 if (ins->src[1].reg.idx[0].rel_addr || ins->src[1].reg.idx[1].rel_addr)
1068 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED,
1069 "Descriptor indexing is not supported.");
1070
1071 uav_id = ins->src[1].reg.idx[0].offset;
1072 uav_idx = ins->src[1].reg.idx[1].offset;
1074 {
1075 resource_type = d->resource_type;
1076 uav_space = d->register_space;
1078 }
1079 else
1080 {
1081 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1082 "Internal compiler error: Undeclared UAV descriptor %u.", uav_id);
1083 uav_space = 0;
1084 resource_type = VKD3D_SHADER_RESOURCE_TEXTURE_2D;
1086 }
1087
1089 {
1091 }
1092 else
1093 {
1094 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1095 "Internal compiler error: Unhandled UAV type %#x.", resource_type);
1097 }
1098
1099 glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
1100 glsl_src_init(&coord, gen, &ins->src[0], coord_mask);
1102
1103 vkd3d_string_buffer_printf(load, "imageLoad(");
1104 shader_glsl_print_image_name(load, gen, uav_idx, uav_space);
1105 vkd3d_string_buffer_printf(load, ", %s)", coord.str->buffer);
1106 shader_glsl_print_swizzle(load, ins->src[1].swizzle, ins->dst[0].write_mask);
1107
1108 shader_glsl_print_assignment_ext(gen, &dst,
1110
1114}
int load
Definition: msacm.c:1365

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_loop()

static void shader_glsl_loop ( struct vkd3d_glsl_generator *  gen)
static

Definition at line 716 of file glsl.c.

717{
719 vkd3d_string_buffer_printf(gen->buffer, "for (;;)\n");
721}

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_mov()

static void shader_glsl_mov ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 1211 of file glsl.c.

1212{
1213 struct glsl_src src;
1214 struct glsl_dst dst;
1215 uint32_t mask;
1216
1217 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
1218 glsl_src_init(&src, gen, &ins->src[0], mask);
1219
1220 shader_glsl_print_assignment(gen, &dst, "%s", src.str->buffer);
1221
1224}

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_movc()

static void shader_glsl_movc ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 1226 of file glsl.c.

1227{
1228 unsigned int component_count;
1229 struct glsl_src src[3];
1230 struct glsl_dst dst;
1231 uint32_t mask;
1232
1233 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
1234 glsl_src_init(&src[0], gen, &ins->src[0], mask);
1235 glsl_src_init(&src[1], gen, &ins->src[1], mask);
1236 glsl_src_init(&src[2], gen, &ins->src[2], mask);
1237
1239 shader_glsl_print_assignment(gen, &dst, "mix(%s, %s, bvec%u(%s))",
1240 src[2].str->buffer, src[1].str->buffer, component_count, src[0].str->buffer);
1241 else
1242 shader_glsl_print_assignment(gen, &dst, "mix(%s, %s, bool(%s))",
1243 src[2].str->buffer, src[1].str->buffer, src[0].str->buffer);
1244
1249}

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_mul_extended()

static void shader_glsl_mul_extended ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 1251 of file glsl.c.

1252{
1253 struct glsl_src src[2];
1254 struct glsl_dst dst;
1255 uint32_t mask;
1256
1257 if (ins->dst[0].reg.type != VKD3DSPR_NULL)
1258 {
1259 /* FIXME: imulExtended()/umulExtended() from ARB_gpu_shader5/GLSL 4.00+. */
1260 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
1261 shader_glsl_print_assignment(gen, &dst, "<unhandled 64-bit multiplication>");
1263
1264 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1265 "Internal compiler error: Unhandled 64-bit integer multiplication.");
1266 }
1267
1268 if (ins->dst[1].reg.type != VKD3DSPR_NULL)
1269 {
1270 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[1]);
1271 glsl_src_init(&src[0], gen, &ins->src[0], mask);
1272 glsl_src_init(&src[1], gen, &ins->src[1], mask);
1273
1274 shader_glsl_print_assignment(gen, &dst, "%s * %s", src[0].str->buffer, src[1].str->buffer);
1275
1279 }
1280}
@ VKD3DSPR_NULL

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_print_bitcast()

static void shader_glsl_print_bitcast ( struct vkd3d_string_buffer *  dst,
struct vkd3d_glsl_generator *  gen,
const char *  src,
enum vkd3d_data_type  dst_data_type,
enum vkd3d_data_type  src_data_type,
unsigned int  size 
)
static

Definition at line 331 of file glsl.c.

333{
334 if (dst_data_type == VKD3D_DATA_UNORM || dst_data_type == VKD3D_DATA_SNORM)
335 dst_data_type = VKD3D_DATA_FLOAT;
336 if (src_data_type == VKD3D_DATA_UNORM || src_data_type == VKD3D_DATA_SNORM)
337 src_data_type = VKD3D_DATA_FLOAT;
338
339 if (dst_data_type == src_data_type)
340 {
342 return;
343 }
344
345 if (src_data_type == VKD3D_DATA_FLOAT)
346 {
347 switch (dst_data_type)
348 {
349 case VKD3D_DATA_INT:
350 vkd3d_string_buffer_printf(dst, "floatBitsToInt(%s)", src);
351 return;
352 case VKD3D_DATA_UINT:
353 vkd3d_string_buffer_printf(dst, "floatBitsToUint(%s)", src);
354 return;
355 default:
356 break;
357 }
358 }
359
360 if (src_data_type == VKD3D_DATA_UINT)
361 {
362 switch (dst_data_type)
363 {
364 case VKD3D_DATA_FLOAT:
365 vkd3d_string_buffer_printf(dst, "uintBitsToFloat(%s)", src);
366 return;
367 case VKD3D_DATA_INT:
368 if (size == 1)
370 else
371 vkd3d_string_buffer_printf(dst, "ivec%u(%s)", size, src);
372 return;
373 default:
374 break;
375 }
376 }
377
378 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
379 "Internal compiler error: Unhandled bitcast from %#x to %#x.",
380 src_data_type, dst_data_type);
382}
@ VKD3D_DATA_SNORM
@ VKD3D_DATA_INT
@ VKD3D_DATA_UINT
@ VKD3D_DATA_UNORM

Referenced by shader_glsl_print_src().

◆ shader_glsl_print_combined_sampler_name()

static void shader_glsl_print_combined_sampler_name ( struct vkd3d_string_buffer *  buffer,
struct vkd3d_glsl_generator *  gen,
unsigned int  resource_index,
unsigned int  resource_space,
unsigned int  sampler_index,
unsigned int  sampler_space 
)
static

Definition at line 167 of file glsl.c.

170{
171 vkd3d_string_buffer_printf(buffer, "%s_t_%u", gen->prefix, resource_index);
172 if (resource_space)
173 vkd3d_string_buffer_printf(buffer, "_%u", resource_space);
174 if (sampler_index != VKD3D_SHADER_DUMMY_SAMPLER_INDEX)
175 {
176 vkd3d_string_buffer_printf(buffer, "_s_%u", sampler_index);
177 if (sampler_space)
178 vkd3d_string_buffer_printf(buffer, "_%u", sampler_space);
179 }
180}

Referenced by shader_glsl_generate_sampler_declaration(), shader_glsl_ld(), and shader_glsl_sample().

◆ shader_glsl_print_image_name()

static void shader_glsl_print_image_name ( struct vkd3d_string_buffer *  buffer,
struct vkd3d_glsl_generator *  gen,
unsigned int  idx,
unsigned int  space 
)
static

◆ shader_glsl_print_indent()

◆ shader_glsl_print_register_name()

static void shader_glsl_print_register_name ( struct vkd3d_string_buffer *  buffer,
struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_register *  reg 
)
static

Definition at line 190 of file glsl.c.

192{
193 switch (reg->type)
194 {
195 case VKD3DSPR_TEMP:
196 vkd3d_string_buffer_printf(buffer, "r[%u]", reg->idx[0].offset);
197 break;
198
199 case VKD3DSPR_INPUT:
200 if (reg->idx_count != 1)
201 {
202 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
203 "Internal compiler error: Unhandled input register index count %u.", reg->idx_count);
204 vkd3d_string_buffer_printf(buffer, "<unhandled register %#x>", reg->type);
205 break;
206 }
207 if (reg->idx[0].rel_addr)
208 {
209 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
210 "Internal compiler error: Unhandled input register indirect addressing.");
211 vkd3d_string_buffer_printf(buffer, "<unhandled register %#x>", reg->type);
212 break;
213 }
214 vkd3d_string_buffer_printf(buffer, "%s_in[%u]", gen->prefix, reg->idx[0].offset);
215 break;
216
217 case VKD3DSPR_OUTPUT:
218 if (reg->idx_count != 1)
219 {
220 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
221 "Internal compiler error: Unhandled output register index count %u.", reg->idx_count);
222 vkd3d_string_buffer_printf(buffer, "<unhandled register %#x>", reg->type);
223 break;
224 }
225 if (reg->idx[0].rel_addr)
226 {
227 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
228 "Internal compiler error: Unhandled output register indirect addressing.");
229 vkd3d_string_buffer_printf(buffer, "<unhandled register %#x>", reg->type);
230 break;
231 }
232 vkd3d_string_buffer_printf(buffer, "%s_out[%u]", gen->prefix, reg->idx[0].offset);
233 break;
234
236 if (gen->program->shader_version.type != VKD3D_SHADER_TYPE_PIXEL)
237 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
238 "Internal compiler error: Unhandled depth output in shader type #%x.",
239 gen->program->shader_version.type);
240 vkd3d_string_buffer_printf(buffer, "gl_FragDepth");
241 break;
242
244 switch (reg->dimension)
245 {
247 vkd3d_string_buffer_printf(buffer, "%#xu", reg->u.immconst_u32[0]);
248 break;
249
251 vkd3d_string_buffer_printf(buffer, "uvec4(%#xu, %#xu, %#xu, %#xu)",
252 reg->u.immconst_u32[0], reg->u.immconst_u32[1],
253 reg->u.immconst_u32[2], reg->u.immconst_u32[3]);
254 break;
255
256 default:
257 vkd3d_string_buffer_printf(buffer, "<unhandled_dimension %#x>", reg->dimension);
258 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
259 "Internal compiler error: Unhandled dimension %#x.", reg->dimension);
260 break;
261 }
262 break;
263
265 if (reg->idx_count != 3)
266 {
267 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
268 "Internal compiler error: Unhandled constant buffer register index count %u.", reg->idx_count);
269 vkd3d_string_buffer_printf(buffer, "<unhandled register %#x>", reg->type);
270 break;
271 }
272 if (reg->idx[0].rel_addr || reg->idx[2].rel_addr)
273 {
274 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
275 "Internal compiler error: Unhandled constant buffer register indirect addressing.");
276 vkd3d_string_buffer_printf(buffer, "<unhandled register %#x>", reg->type);
277 break;
278 }
279 vkd3d_string_buffer_printf(buffer, "%s_cb_%u[%u]",
280 gen->prefix, reg->idx[0].offset, reg->idx[2].offset);
281 break;
282
284 vkd3d_string_buffer_printf(buffer, "gl_GlobalInvocationID");
285 break;
286
287 case VKD3DSPR_IDXTEMP:
288 vkd3d_string_buffer_printf(buffer, "x%u", reg->idx[0].offset);
289 shader_glsl_print_subscript(buffer, gen, reg->idx[1].rel_addr, reg->idx[1].offset);
290 break;
291
292 default:
293 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
294 "Internal compiler error: Unhandled register type %#x.", reg->type);
295 vkd3d_string_buffer_printf(buffer, "<unrecognised register %#x>", reg->type);
296 break;
297 }
298}
static void shader_glsl_print_subscript(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_src_param *rel_addr, unsigned int offset)
Definition: glsl.c:473
static int reg
Definition: i386-dis.c:1290
@ VKD3DSPR_IMMCONST
@ VKD3DSPR_CONSTBUFFER
@ VKD3DSPR_DEPTHOUT
@ VKD3DSPR_TEMP
@ VKD3DSPR_IDXTEMP
@ VKD3DSPR_THREADID
@ VKD3DSPR_OUTPUT
@ VKD3DSPR_INPUT
@ VSIR_DIMENSION_SCALAR
@ VSIR_DIMENSION_VEC4

Referenced by glsl_dst_init(), and shader_glsl_print_src().

◆ shader_glsl_print_shadow_coord()

static void shader_glsl_print_shadow_coord ( struct vkd3d_string_buffer *  buffer,
struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_src_param *  coord,
const struct vkd3d_shader_src_param *  ref,
unsigned int  coord_size 
)
static

Definition at line 869 of file glsl.c.

871{
873
874 switch (coord_size)
875 {
876 case 1:
878 shader_glsl_print_src(buffer, gen, coord, coord_mask, coord->reg.data_type);
882 break;
883
884 case 4:
885 shader_glsl_print_src(buffer, gen, coord, coord_mask, coord->reg.data_type);
888 break;
889
890 default:
892 shader_glsl_print_src(buffer, gen, coord, coord_mask, coord->reg.data_type);
896 break;
897 }
898}
unsigned int coord_size
Definition: glsl_shader.c:50
Definition: send.c:48

Referenced by shader_glsl_sample().

◆ shader_glsl_print_src()

static void shader_glsl_print_src ( struct vkd3d_string_buffer *  buffer,
struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_src_param *  vsir_src,
uint32_t  mask,
enum vkd3d_data_type  data_type 
)
static

Definition at line 384 of file glsl.c.

386{
387 const struct vkd3d_shader_register *reg = &vsir_src->reg;
388 struct vkd3d_string_buffer *register_name, *str;
389 enum vkd3d_data_type src_data_type;
390 unsigned int size;
391
392 register_name = vkd3d_string_buffer_get(&gen->string_buffers);
393
394 if (reg->non_uniform)
395 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
396 "Internal compiler error: Unhandled 'non-uniform' modifier.");
397
398 if (reg->type == VKD3DSPR_IMMCONST || reg->type == VKD3DSPR_THREADID)
399 src_data_type = VKD3D_DATA_UINT;
400 else
401 src_data_type = VKD3D_DATA_FLOAT;
402
403 shader_glsl_print_register_name(register_name, gen, reg);
404
405 if (!vsir_src->modifiers)
406 str = buffer;
407 else
409
410 size = reg->dimension == VSIR_DIMENSION_VEC4 ? 4 : 1;
411 shader_glsl_print_bitcast(str, gen, register_name->buffer, data_type, src_data_type, size);
412 if (reg->dimension == VSIR_DIMENSION_VEC4)
414
415 switch (vsir_src->modifiers)
416 {
417 case VKD3DSPSM_NONE:
418 break;
419 case VKD3DSPSM_NEG:
420 vkd3d_string_buffer_printf(buffer, "-%s", str->buffer);
421 break;
422 case VKD3DSPSM_ABS:
423 vkd3d_string_buffer_printf(buffer, "abs(%s)", str->buffer);
424 break;
425 default:
426 vkd3d_string_buffer_printf(buffer, "<unhandled modifier %#x>(%s)",
427 vsir_src->modifiers, str->buffer);
428 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
429 "Internal compiler error: Unhandled source modifier(s) %#x.", vsir_src->modifiers);
430 break;
431 }
432
433 if (str != buffer)
435 vkd3d_string_buffer_release(&gen->string_buffers, register_name);
436}
static void shader_glsl_print_bitcast(struct vkd3d_string_buffer *dst, struct vkd3d_glsl_generator *gen, const char *src, enum vkd3d_data_type dst_data_type, enum vkd3d_data_type src_data_type, unsigned int size)
Definition: glsl.c:331
enum vkd3d_shader_src_modifier modifiers
@ VKD3DSPSM_ABS
@ VKD3DSPSM_NONE
@ VKD3DSPSM_NEG

Referenced by glsl_src_init(), shader_glsl_ld(), shader_glsl_print_shadow_coord(), shader_glsl_sample(), and shader_glsl_store_uav_typed().

◆ shader_glsl_print_subscript()

static void shader_glsl_print_subscript ( struct vkd3d_string_buffer *  buffer,
struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_src_param *  rel_addr,
unsigned int  offset 
)
static

Definition at line 473 of file glsl.c.

475{
476 struct glsl_src r;
477
478 if (!rel_addr)
479 {
481 return;
482 }
483
484 glsl_src_init(&r, gen, rel_addr, VKD3DSP_WRITEMASK_0);
485 vkd3d_string_buffer_printf(buffer, "[%s", r.str->buffer);
486 if (offset)
488 else
491}
GLdouble GLdouble GLdouble r
Definition: gl.h:2055

Referenced by shader_glsl_print_register_name().

◆ shader_glsl_print_swizzle()

static void shader_glsl_print_swizzle ( struct vkd3d_string_buffer *  buffer,
uint32_t  swizzle,
uint32_t  mask 
)
static

Definition at line 300 of file glsl.c.

301{
302 const char swizzle_chars[] = "xyzw";
303 unsigned int i;
304
306 for (i = 0; i < VKD3D_VEC4_SIZE; ++i)
307 {
308 if (mask & (VKD3DSP_WRITEMASK_0 << i))
310 }
311}
GLuint GLenum swizzle
Definition: glext.h:9511
static unsigned int vsir_swizzle_get_component(uint32_t swizzle, unsigned int idx)

Referenced by shader_glsl_ld(), shader_glsl_load_uav_typed(), shader_glsl_print_src(), and shader_glsl_sample().

◆ shader_glsl_print_sysval_name()

static void shader_glsl_print_sysval_name ( struct vkd3d_string_buffer *  buffer,
struct vkd3d_glsl_generator *  gen,
enum vkd3d_shader_sysval_semantic  sysval,
unsigned int  idx 
)
static

Definition at line 1282 of file glsl.c.

1284{
1285 const struct vkd3d_shader_version *version = &gen->program->shader_version;
1286
1287 switch (sysval)
1288 {
1291 {
1292 vkd3d_string_buffer_printf(buffer, "<unhandled sysval %#x>", sysval);
1293 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1294 "Internal compiler error: Unhandled SV_POSITION in shader type #%x.", version->type);
1295 break;
1296 }
1297 if (idx)
1298 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1299 "Internal compiler error: Unhandled SV_POSITION index %u.", idx);
1300 if (version->type == VKD3D_SHADER_TYPE_PIXEL)
1301 vkd3d_string_buffer_printf(buffer, "gl_FragCoord");
1302 else
1303 vkd3d_string_buffer_printf(buffer, "gl_Position");
1304 break;
1305
1307 if (version->type != VKD3D_SHADER_TYPE_VERTEX)
1308 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1309 "Internal compiler error: Unhandled SV_VERTEX_ID in shader type #%x.", version->type);
1310 vkd3d_string_buffer_printf(buffer, "intBitsToFloat(ivec4(gl_VertexID, 0, 0, 0))");
1311 break;
1312
1314 if (version->type != VKD3D_SHADER_TYPE_PIXEL)
1315 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1316 "Internal compiler error: Unhandled SV_IS_FRONT_FACE in shader type #%x.", version->type);
1318 "uintBitsToFloat(uvec4(gl_FrontFacing ? 0xffffffffu : 0u, 0u, 0u, 0u))");
1319 break;
1320
1322 if (version->type != VKD3D_SHADER_TYPE_PIXEL)
1323 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1324 "Internal compiler error: Unhandled SV_SAMPLE_INDEX in shader type #%x.", version->type);
1325 vkd3d_string_buffer_printf(buffer, "intBitsToFloat(ivec4(gl_SampleID, 0, 0, 0))");
1326 break;
1327
1329 if (version->type != VKD3D_SHADER_TYPE_PIXEL)
1330 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1331 "Internal compiler error: Unhandled SV_TARGET in shader type #%x.", version->type);
1332 vkd3d_string_buffer_printf(buffer, "shader_out_%u", idx);
1333 break;
1334
1335 default:
1336 vkd3d_string_buffer_printf(buffer, "<unhandled sysval %#x>", sysval);
1337 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1338 "Internal compiler error: Unhandled system value %#x.", sysval);
1339 break;
1340 }
1341}
enum vkd3d_shader_sysval_semantic sysval
Definition: spirv.c:4839
@ VKD3D_SHADER_SV_VERTEX_ID
@ VKD3D_SHADER_SV_IS_FRONT_FACE
@ VKD3D_SHADER_SV_SAMPLE_INDEX
@ VKD3D_SHADER_SV_POSITION

Referenced by shader_glsl_shader_epilogue(), and shader_glsl_shader_prologue().

◆ shader_glsl_print_texel_offset()

static void shader_glsl_print_texel_offset ( struct vkd3d_string_buffer *  buffer,
struct vkd3d_glsl_generator *  gen,
unsigned int  offset_size,
const struct vkd3d_shader_texel_offset *  offset 
)
static

Definition at line 766 of file glsl.c.

768{
769 switch (offset_size)
770 {
771 case 1:
773 break;
774 case 2:
775 vkd3d_string_buffer_printf(buffer, "ivec2(%d, %d)", offset->u, offset->v);
776 break;
777 default:
778 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
779 "Internal compiler error: Invalid texel offset size %u.", offset_size);
780 /* fall through */
781 case 3:
782 vkd3d_string_buffer_printf(buffer, "ivec3(%d, %d, %d)", offset->u, offset->v, offset->w);
783 break;
784 }
785}

Referenced by shader_glsl_sample().

◆ shader_glsl_print_write_mask()

static void shader_glsl_print_write_mask ( struct vkd3d_string_buffer *  buffer,
uint32_t  write_mask 
)
static

Definition at line 313 of file glsl.c.

314{
316 if (write_mask & VKD3DSP_WRITEMASK_0)
318 if (write_mask & VKD3DSP_WRITEMASK_1)
320 if (write_mask & VKD3DSP_WRITEMASK_2)
322 if (write_mask & VKD3DSP_WRITEMASK_3)
324}
#define VKD3DSP_WRITEMASK_1
#define VKD3DSP_WRITEMASK_2

Referenced by glsl_dst_init(), shader_glsl_shader_epilogue(), and shader_glsl_shader_prologue().

◆ shader_glsl_relop()

static void shader_glsl_relop ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins,
const char *  scalar_op,
const char *  vector_op 
)
static

Definition at line 632 of file glsl.c.

634{
635 unsigned int mask_size;
636 struct glsl_src src[2];
637 struct glsl_dst dst;
639
640 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
641 glsl_src_init(&src[0], gen, &ins->src[0], mask);
642 glsl_src_init(&src[1], gen, &ins->src[1], mask);
643
644 if ((mask_size = vsir_write_mask_component_count(mask)) > 1)
645 shader_glsl_print_assignment(gen, &dst, "uvec%u(%s(%s, %s)) * 0xffffffffu",
646 mask_size, vector_op, src[0].str->buffer, src[1].str->buffer);
647 else
648 shader_glsl_print_assignment(gen, &dst, "%s %s %s ? 0xffffffffu : 0u",
649 src[0].str->buffer, scalar_op, src[1].str->buffer);
650
654}

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_ret()

static void shader_glsl_ret ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 1463 of file glsl.c.

1464{
1465 const struct vkd3d_shader_version *version = &gen->program->shader_version;
1466
1467 if (version->major >= 4)
1468 {
1471 vkd3d_string_buffer_printf(gen->buffer, "return;\n");
1472 }
1473}
static void shader_glsl_shader_epilogue(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:1401

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_sample()

static void shader_glsl_sample ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 900 of file glsl.c.

901{
902 bool shadow_sampler, array, bias, dynamic_offset, gather, grad, lod, lod_zero, offset, shadow;
905 unsigned int resource_id, resource_idx, resource_space;
906 unsigned int sampler_id, sampler_idx, sampler_space;
907 const struct vkd3d_shader_descriptor_info1 *d;
908 enum vkd3d_shader_component_type sampled_type;
910 unsigned int component_idx, coord_size;
913 struct glsl_dst dst;
914
915 bias = ins->opcode == VKD3DSIH_SAMPLE_B;
916 dynamic_offset = ins->opcode == VKD3DSIH_GATHER4_PO;
917 gather = ins->opcode == VKD3DSIH_GATHER4 || ins->opcode == VKD3DSIH_GATHER4_PO;
918 grad = ins->opcode == VKD3DSIH_SAMPLE_GRAD;
920 lod_zero = ins->opcode == VKD3DSIH_SAMPLE_C_LZ;
921 offset = dynamic_offset || vkd3d_shader_instruction_has_texel_offset(ins);
922 shadow = ins->opcode == VKD3DSIH_SAMPLE_C || ins->opcode == VKD3DSIH_SAMPLE_C_LZ;
923
924 resource = &ins->src[1 + dynamic_offset];
925 sampler = &ins->src[2 + dynamic_offset];
926
927 if (resource->reg.idx[0].rel_addr || resource->reg.idx[1].rel_addr
928 || sampler->reg.idx[0].rel_addr || sampler->reg.idx[1].rel_addr)
929 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED,
930 "Descriptor indexing is not supported.");
931
932 resource_id = resource->reg.idx[0].offset;
933 resource_idx = resource->reg.idx[1].offset;
935 {
936 resource_type = d->resource_type;
937 resource_space = d->register_space;
938 sampled_type = vkd3d_component_type_from_resource_data_type(d->resource_data_type);
940 }
941 else
942 {
943 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
944 "Internal compiler error: Undeclared resource descriptor %u.", resource_id);
945 resource_space = 0;
946 resource_type = VKD3D_SHADER_RESOURCE_TEXTURE_2D;
948 }
949
951 {
952 coord_size = resource_type_info->coord_size;
953 array = resource_type_info->array;
954 }
955 else
956 {
957 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
958 "Internal compiler error: Unhandled resource type %#x.", resource_type);
959 coord_size = 2;
960 array = false;
961 }
962
963 sampler_id = sampler->reg.idx[0].offset;
964 sampler_idx = sampler->reg.idx[1].offset;
966 {
967 sampler_space = d->register_space;
969
970 if (shadow)
971 {
972 if (!shadow_sampler)
973 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
974 "Internal compiler error: Sampler %u is not a comparison sampler.", sampler_id);
975 }
976 else
977 {
978 if (shadow_sampler)
979 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
980 "Internal compiler error: Sampler %u is a comparison sampler.", sampler_id);
981 }
982 }
983 else
984 {
985 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
986 "Internal compiler error: Undeclared sampler descriptor %u.", sampler_id);
987 sampler_space = 0;
988 }
989
990 glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
992
993 if (gather)
994 vkd3d_string_buffer_printf(sample, "textureGather");
995 else if (grad)
996 vkd3d_string_buffer_printf(sample, "textureGrad");
997 else if (lod)
998 vkd3d_string_buffer_printf(sample, "textureLod");
999 else
1001 vkd3d_string_buffer_printf(sample, "%s(", offset ? "Offset" : "");
1002 shader_glsl_print_combined_sampler_name(sample, gen, resource_idx, resource_space, sampler_idx, sampler_space);
1004 if (shadow)
1005 shader_glsl_print_shadow_coord(sample, gen, &ins->src[0], &ins->src[3], coord_size);
1006 else
1007 shader_glsl_print_src(sample, gen, &ins->src[0],
1008 vkd3d_write_mask_from_component_count(coord_size), ins->src[0].reg.data_type);
1009 if (grad)
1010 {
1012 shader_glsl_print_src(sample, gen, &ins->src[3],
1013 vkd3d_write_mask_from_component_count(coord_size - array), ins->src[3].reg.data_type);
1015 shader_glsl_print_src(sample, gen, &ins->src[4],
1016 vkd3d_write_mask_from_component_count(coord_size - array), ins->src[4].reg.data_type);
1017 }
1018 else if (lod_zero)
1019 {
1021 }
1022 else if (lod)
1023 {
1025 shader_glsl_print_src(sample, gen, &ins->src[3], VKD3DSP_WRITEMASK_0, ins->src[3].reg.data_type);
1026 }
1027 if (offset)
1028 {
1030 if (dynamic_offset)
1031 shader_glsl_print_src(sample, gen, &ins->src[1],
1032 vkd3d_write_mask_from_component_count(coord_size - array), ins->src[1].reg.data_type);
1033 else
1035 }
1036 if (bias)
1037 {
1039 shader_glsl_print_src(sample, gen, &ins->src[3], VKD3DSP_WRITEMASK_0, ins->src[3].reg.data_type);
1040 }
1041 else if (gather)
1042 {
1043 if ((component_idx = vsir_swizzle_get_component(sampler->swizzle, 0)))
1044 vkd3d_string_buffer_printf(sample, ", %d", component_idx);
1045 }
1047 shader_glsl_print_swizzle(sample, resource->swizzle, ins->dst[0].write_mask);
1048
1049 shader_glsl_print_assignment_ext(gen, &dst, data_type, "%s", sample->buffer);
1050
1053}
GLfloat bias
Definition: glext.h:7909
GLint lod
Definition: glext.h:7795
static void shader_glsl_print_texel_offset(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, unsigned int offset_size, const struct vkd3d_shader_texel_offset *offset)
Definition: glsl.c:766
static void shader_glsl_print_shadow_coord(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_src_param *coord, const struct vkd3d_shader_src_param *ref, unsigned int coord_size)
Definition: glsl.c:869
#define resource
Definition: kernel32.h:9
Definition: undname.c:54
Definition: wave.c:25
struct vkd3d_shader_texel_offset texel_offset
@ VKD3DSIH_SAMPLE_C_LZ
@ VKD3DSIH_SAMPLE_C
@ VKD3DSIH_GATHER4_PO
@ VKD3DSIH_SAMPLE_LOD
@ VKD3DSIH_SAMPLE_B
@ VKD3DSIH_SAMPLE_GRAD
@ VKD3DSIH_GATHER4

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_shader_epilogue()

static void shader_glsl_shader_epilogue ( struct vkd3d_glsl_generator *  gen)
static

Definition at line 1401 of file glsl.c.

1402{
1403 const struct shader_signature *signature = &gen->program->output_signature;
1404 struct vkd3d_string_buffer *buffer = gen->buffer;
1406 const struct signature_element *e;
1407 unsigned int i;
1408
1409 for (i = 0; i < signature->element_count; ++i)
1410 {
1411 e = &signature->elements[i];
1412
1413 if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED)
1414 continue;
1415
1416 type = e->component_type;
1418 if (e->sysval_semantic == VKD3D_SHADER_SV_NONE)
1419 {
1420 if (gen->interstage_output)
1421 {
1423 vkd3d_string_buffer_printf(buffer, "shader_out.reg_%u", e->target_location);
1424 if (e->target_location >= gen->limits.output_count)
1425 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1426 "Internal compiler error: Output element %u specifies target location %u, "
1427 "but only %u outputs are supported.",
1428 i, e->target_location, gen->limits.output_count);
1429 }
1430 else
1431 {
1432 vkd3d_string_buffer_printf(buffer, "<unhandled output %u>", e->target_location);
1433 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1434 "Internal compiler error: Unhandled output.");
1435 }
1436 }
1437 else
1438 {
1439 shader_glsl_print_sysval_name(buffer, gen, e->sysval_semantic, e->semantic_index);
1440 }
1442 switch (type)
1443 {
1445 vkd3d_string_buffer_printf(buffer, " = floatBitsToUint(%s_out[%u])", gen->prefix, e->register_index);
1446 break;
1448 vkd3d_string_buffer_printf(buffer, " = floatBitsToInt(%s_out[%u])", gen->prefix, e->register_index);
1449 break;
1450 default:
1451 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1452 "Internal compiler error: Unhandled output component type %#x.", e->component_type);
1453 /* fall through */
1455 vkd3d_string_buffer_printf(buffer, " = %s_out[%u]", gen->prefix, e->register_index);
1456 break;
1457 }
1460 }
1461}
static void shader_glsl_print_sysval_name(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, enum vkd3d_shader_sysval_semantic sysval, unsigned int idx)
Definition: glsl.c:1282
@ VKD3D_SHADER_SV_NONE

Referenced by shader_glsl_ret().

◆ shader_glsl_shader_prologue()

static void shader_glsl_shader_prologue ( struct vkd3d_glsl_generator *  gen)
static

Definition at line 1343 of file glsl.c.

1344{
1345 const struct shader_signature *signature = &gen->program->input_signature;
1346 struct vkd3d_string_buffer *buffer = gen->buffer;
1347 const struct signature_element *e;
1348 unsigned int i;
1349
1350 for (i = 0; i < signature->element_count; ++i)
1351 {
1352 e = &signature->elements[i];
1353
1354 if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED)
1355 continue;
1356
1358 vkd3d_string_buffer_printf(buffer, "%s_in[%u]", gen->prefix, e->register_index);
1360 if (e->sysval_semantic == VKD3D_SHADER_SV_NONE)
1361 {
1362 if (gen->interstage_input)
1363 {
1364 vkd3d_string_buffer_printf(buffer, " = shader_in.reg_%u", e->target_location);
1365 if (e->target_location >= gen->limits.input_count)
1366 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1367 "Internal compiler error: Input element %u specifies target location %u, "
1368 "but only %u inputs are supported.",
1369 i, e->target_location, gen->limits.input_count);
1370 }
1371 else
1372 {
1373 switch (e->component_type)
1374 {
1376 vkd3d_string_buffer_printf(buffer, " = uintBitsToFloat(shader_in_%u)", i);
1377 break;
1379 vkd3d_string_buffer_printf(buffer, " = intBitsToFloat(shader_in_%u)", i);
1380 break;
1381 default:
1382 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1383 "Internal compiler error: Unhandled input component type %#x.", e->component_type);
1384 /* fall through */
1386 vkd3d_string_buffer_printf(buffer, " = shader_in_%u", i);
1387 break;
1388 }
1389 }
1390 }
1391 else
1392 {
1394 shader_glsl_print_sysval_name(buffer, gen, e->sysval_semantic, e->semantic_index);
1395 }
1398 }
1399}

Referenced by vkd3d_glsl_generator_generate().

◆ shader_glsl_store_uav_typed()

static void shader_glsl_store_uav_typed ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 1116 of file glsl.c.

1117{
1120 const struct vkd3d_shader_descriptor_info1 *d;
1122 unsigned int uav_id, uav_idx, uav_space;
1123 struct vkd3d_string_buffer *image_data;
1124 struct glsl_src image_coord;
1125 uint32_t coord_mask;
1126
1127 if (ins->dst[0].reg.idx[0].rel_addr || ins->dst[0].reg.idx[1].rel_addr)
1128 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED,
1129 "Descriptor indexing is not supported.");
1130
1131 uav_id = ins->dst[0].reg.idx[0].offset;
1132 uav_idx = ins->dst[0].reg.idx[1].offset;
1134 {
1135 resource_type = d->resource_type;
1136 uav_space = d->register_space;
1138 }
1139 else
1140 {
1141 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1142 "Internal compiler error: Undeclared UAV descriptor %u.", uav_id);
1143 uav_space = 0;
1144 resource_type = VKD3D_SHADER_RESOURCE_TEXTURE_2D;
1146 }
1147
1149 {
1151 }
1152 else
1153 {
1154 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1155 "Internal compiler error: Unhandled UAV type %#x.", resource_type);
1157 }
1158
1159 glsl_src_init(&image_coord, gen, &ins->src[0], coord_mask);
1160 image_data = vkd3d_string_buffer_get(&gen->string_buffers);
1161
1162 if (ins->src[1].reg.dimension == VSIR_DIMENSION_SCALAR)
1163 {
1164 switch (component_type)
1165 {
1167 vkd3d_string_buffer_printf(image_data, "uvec4(");
1168 break;
1170 vkd3d_string_buffer_printf(image_data, "ivec4(");
1171 break;
1172 default:
1173 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1174 "Internal compiler error: Unhandled component type %#x.", component_type);
1175 /* fall through */
1177 vkd3d_string_buffer_printf(image_data, "vec4(");
1178 break;
1179 }
1180 }
1181 shader_glsl_print_src(image_data, gen, &ins->src[1], VKD3DSP_WRITEMASK_ALL,
1183 if (ins->src[1].reg.dimension == VSIR_DIMENSION_SCALAR)
1184 vkd3d_string_buffer_printf(image_data, ", 0, 0, 0)");
1185
1187 vkd3d_string_buffer_printf(gen->buffer, "imageStore(");
1188 shader_glsl_print_image_name(gen->buffer, gen, uav_idx, uav_space);
1189 vkd3d_string_buffer_printf(gen->buffer, ", %s, %s);\n", image_coord.str->buffer, image_data->buffer);
1190
1192 glsl_src_cleanup(&image_coord, &gen->string_buffers);
1193}
#define VKD3DSP_WRITEMASK_ALL

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_switch()

static void shader_glsl_switch ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 735 of file glsl.c.

736{
737 struct glsl_src src;
738
739 glsl_src_init(&src, gen, &ins->src[0], VKD3DSP_WRITEMASK_0);
740
742 vkd3d_string_buffer_printf(gen->buffer, "switch (%s)\n", src.str->buffer);
744
746}

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_unary_op()

static void shader_glsl_unary_op ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins,
const char *  op 
)
static

Definition at line 1195 of file glsl.c.

1197{
1198 struct glsl_src src;
1199 struct glsl_dst dst;
1200 uint32_t mask;
1201
1202 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
1203 glsl_src_init(&src, gen, &ins->src[0], mask);
1204
1205 shader_glsl_print_assignment(gen, &dst, "%s%s", op, src.str->buffer);
1206
1209}

Referenced by vkd3d_glsl_handle_instruction().

◆ shader_glsl_unhandled()

static void shader_glsl_unhandled ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 558 of file glsl.c.

559{
561 vkd3d_string_buffer_printf(gen->buffer, "/* <unhandled instruction %#x> */\n", ins->opcode);
562 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
563 "Internal compiler error: Unhandled instruction %#x.", ins->opcode);
564}

Referenced by vkd3d_glsl_handle_instruction().

◆ signature_get_element_by_location()

static const struct signature_element * signature_get_element_by_location ( const struct shader_signature *  signature,
unsigned int  location 
)
static

Definition at line 2126 of file glsl.c.

2128{
2129 const struct signature_element *e;
2130 unsigned int i;
2131
2132 for (i = 0; i < signature->element_count; ++i)
2133 {
2134 e = &signature->elements[i];
2135
2136 if (e->target_location != location)
2137 continue;
2138
2139 return e;
2140 }
2141
2142 return NULL;
2143}

Referenced by shader_glsl_get_interpolation().

◆ vkd3d_glsl_generator_cleanup()

static void vkd3d_glsl_generator_cleanup ( struct vkd3d_glsl_generator *  gen)
static

Definition at line 2400 of file glsl.c.

2401{
2404}
void vkd3d_string_buffer_cache_cleanup(struct vkd3d_string_buffer_cache *cache)

Referenced by glsl_compile().

◆ vkd3d_glsl_generator_generate()

static int vkd3d_glsl_generator_generate ( struct vkd3d_glsl_generator *  gen,
struct vkd3d_shader_code *  out 
)
static

Definition at line 2357 of file glsl.c.

2358{
2359 const struct vkd3d_shader_instruction_array *instructions = &gen->program->instructions;
2360 struct vkd3d_string_buffer *buffer = gen->buffer;
2361 unsigned int i;
2362 void *code;
2363
2364 MESSAGE("Generating a GLSL shader. This is unsupported; you get to keep all the pieces if it breaks.\n");
2365
2366 vkd3d_string_buffer_printf(buffer, "#version 440\n\n");
2367
2368 vkd3d_string_buffer_printf(buffer, "/* Generated by %s. */\n\n", vkd3d_shader_get_version(NULL, NULL));
2369
2371
2372 vkd3d_string_buffer_printf(buffer, "void main()\n{\n");
2373
2374 ++gen->indent;
2376 for (i = 0; i < instructions->count; ++i)
2377 {
2378 vkd3d_glsl_handle_instruction(gen, &instructions->elements[i]);
2379 }
2380
2382
2383 if (TRACE_ON())
2385
2386 if (gen->failed)
2388
2389 if ((code = vkd3d_malloc(buffer->buffer_size)))
2390 {
2391 memcpy(code, buffer->buffer, buffer->content_size);
2392 out->size = buffer->content_size;
2393 out->code = code;
2394 }
2395 else return VKD3D_ERROR_OUT_OF_MEMORY;
2396
2397 return VKD3D_OK;
2398}
#define TRACE_ON(x)
Definition: compat.h:75
static void shader_glsl_shader_prologue(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:1343
static void shader_glsl_generate_declarations(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:2329
static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1484
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define MESSAGE
Definition: options.h:86
Definition: inflate.c:139
struct vkd3d_shader_instruction * elements
static void * vkd3d_malloc(size_t size)
Definition: vkd3d_memory.h:28
VKD3D_SHADER_API const char * vkd3d_shader_get_version(unsigned int *major, unsigned int *minor)
#define vkd3d_string_buffer_trace(buffer)
@ VKD3D_ERROR_INVALID_SHADER
Definition: vkd3d_types.h:53
@ VKD3D_OK
Definition: vkd3d_types.h:43
@ VKD3D_ERROR_OUT_OF_MEMORY
Definition: vkd3d_types.h:49

Referenced by glsl_compile().

◆ vkd3d_glsl_generator_init()

static void vkd3d_glsl_generator_init ( struct vkd3d_glsl_generator *  gen,
struct vsir_program *  program,
const struct vkd3d_shader_compile_info *  compile_info,
const struct vkd3d_shader_scan_descriptor_info1 *  descriptor_info,
const struct vkd3d_shader_scan_combined_resource_sampler_info *  combined_sampler_info,
struct vkd3d_shader_message_context *  message_context 
)
static

Definition at line 2437 of file glsl.c.

2442{
2443 enum vkd3d_shader_type type = program->shader_version.type;
2444
2445 memset(gen, 0, sizeof(*gen));
2446 gen->program = program;
2449 gen->location.source_name = compile_info->source_name;
2450 gen->message_context = message_context;
2451 if (!(gen->prefix = shader_glsl_get_prefix(type)))
2452 {
2453 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2454 "Internal compiler error: Unhandled shader type %#x.", type);
2455 gen->prefix = "unknown";
2456 }
2457 shader_glsl_init_limits(gen, &program->shader_version);
2460
2461 gen->interface_info = vkd3d_find_struct(compile_info->next, INTERFACE_INFO);
2462 gen->offset_info = vkd3d_find_struct(compile_info->next, DESCRIPTOR_OFFSET_INFO);
2463 gen->descriptor_info = descriptor_info;
2464 gen->combined_sampler_info = combined_sampler_info;
2465}
static void shader_glsl_init_limits(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_version *version)
Definition: glsl.c:2406
static const char * shader_glsl_get_prefix(enum vkd3d_shader_type type)
Definition: glsl.c:86
#define memset(x, y, z)
Definition: compat.h:39
struct vkd3d_shader_location location
Definition: glsl.c:51
void vkd3d_string_buffer_cache_init(struct vkd3d_string_buffer_cache *cache)
#define vkd3d_find_struct(c, t)

Referenced by glsl_compile().

◆ vkd3d_glsl_handle_instruction()

static void vkd3d_glsl_handle_instruction ( struct vkd3d_glsl_generator *  gen,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 1484 of file glsl.c.

1486{
1487 gen->location = ins->location;
1488
1489 switch (ins->opcode)
1490 {
1491 case VKD3DSIH_ADD:
1492 case VKD3DSIH_IADD:
1493 shader_glsl_binop(gen, ins, "+");
1494 break;
1495 case VKD3DSIH_AND:
1496 shader_glsl_binop(gen, ins, "&");
1497 break;
1498 case VKD3DSIH_BREAK:
1499 shader_glsl_break(gen);
1500 break;
1501 case VKD3DSIH_CASE:
1502 shader_glsl_case(gen, ins);
1503 break;
1504 case VKD3DSIH_CONTINUE:
1506 break;
1509 break;
1510 case VKD3DSIH_DCL_INPUT:
1517 case VKD3DSIH_NOP:
1518 break;
1519 case VKD3DSIH_DEFAULT:
1521 break;
1522 case VKD3DSIH_DIV:
1523 shader_glsl_binop(gen, ins, "/");
1524 break;
1525 case VKD3DSIH_DP2:
1527 break;
1528 case VKD3DSIH_DP3:
1530 break;
1531 case VKD3DSIH_DP4:
1533 break;
1534 case VKD3DSIH_ELSE:
1535 shader_glsl_else(gen, ins);
1536 break;
1537 case VKD3DSIH_ENDIF:
1538 case VKD3DSIH_ENDLOOP:
1539 case VKD3DSIH_ENDSWITCH:
1541 break;
1542 case VKD3DSIH_EQO:
1543 case VKD3DSIH_IEQ:
1544 shader_glsl_relop(gen, ins, "==", "equal");
1545 break;
1546 case VKD3DSIH_EXP:
1547 shader_glsl_intrinsic(gen, ins, "exp2");
1548 break;
1549 case VKD3DSIH_FRC:
1550 shader_glsl_intrinsic(gen, ins, "fract");
1551 break;
1552 case VKD3DSIH_FTOI:
1553 shader_glsl_cast(gen, ins, "int", "ivec");
1554 break;
1555 case VKD3DSIH_FTOU:
1556 shader_glsl_cast(gen, ins, "uint", "uvec");
1557 break;
1558 case VKD3DSIH_GATHER4:
1560 case VKD3DSIH_SAMPLE:
1561 case VKD3DSIH_SAMPLE_B:
1562 case VKD3DSIH_SAMPLE_C:
1566 shader_glsl_sample(gen, ins);
1567 break;
1568 case VKD3DSIH_GEO:
1569 case VKD3DSIH_IGE:
1570 shader_glsl_relop(gen, ins, ">=", "greaterThanEqual");
1571 break;
1572 case VKD3DSIH_IF:
1573 shader_glsl_if(gen, ins);
1574 break;
1575 case VKD3DSIH_MAD:
1576 shader_glsl_intrinsic(gen, ins, "fma");
1577 break;
1578 case VKD3DSIH_ILT:
1579 case VKD3DSIH_LTO:
1580 case VKD3DSIH_ULT:
1581 shader_glsl_relop(gen, ins, "<", "lessThan");
1582 break;
1583 case VKD3DSIH_IMAX:
1584 case VKD3DSIH_MAX:
1585 case VKD3DSIH_UMAX:
1586 shader_glsl_intrinsic(gen, ins, "max");
1587 break;
1588 case VKD3DSIH_MIN:
1589 case VKD3DSIH_UMIN:
1590 shader_glsl_intrinsic(gen, ins, "min");
1591 break;
1592 case VKD3DSIH_IMUL:
1593 shader_glsl_mul_extended(gen, ins);
1594 break;
1595 case VKD3DSIH_INE:
1596 case VKD3DSIH_NEU:
1597 shader_glsl_relop(gen, ins, "!=", "notEqual");
1598 break;
1599 case VKD3DSIH_INEG:
1600 shader_glsl_unary_op(gen, ins, "-");
1601 break;
1602 case VKD3DSIH_ISHL:
1603 shader_glsl_binop(gen, ins, "<<");
1604 break;
1605 case VKD3DSIH_ISHR:
1606 case VKD3DSIH_USHR:
1607 shader_glsl_binop(gen, ins, ">>");
1608 break;
1609 case VKD3DSIH_ITOF:
1610 case VKD3DSIH_UTOF:
1611 shader_glsl_cast(gen, ins, "float", "vec");
1612 break;
1613 case VKD3DSIH_LD:
1614 case VKD3DSIH_LD2DMS:
1615 shader_glsl_ld(gen, ins);
1616 break;
1619 break;
1620 case VKD3DSIH_LOG:
1621 shader_glsl_intrinsic(gen, ins, "log2");
1622 break;
1623 case VKD3DSIH_LOOP:
1624 shader_glsl_loop(gen);
1625 break;
1626 case VKD3DSIH_MOV:
1627 shader_glsl_mov(gen, ins);
1628 break;
1629 case VKD3DSIH_MOVC:
1630 shader_glsl_movc(gen, ins);
1631 break;
1632 case VKD3DSIH_MUL:
1633 shader_glsl_binop(gen, ins, "*");
1634 break;
1635 case VKD3DSIH_NOT:
1636 shader_glsl_unary_op(gen, ins, "~");
1637 break;
1638 case VKD3DSIH_OR:
1639 shader_glsl_binop(gen, ins, "|");
1640 break;
1641 case VKD3DSIH_RET:
1642 shader_glsl_ret(gen, ins);
1643 break;
1644 case VKD3DSIH_ROUND_NE:
1645 shader_glsl_intrinsic(gen, ins, "roundEven");
1646 break;
1647 case VKD3DSIH_ROUND_NI:
1648 shader_glsl_intrinsic(gen, ins, "floor");
1649 break;
1650 case VKD3DSIH_ROUND_PI:
1651 shader_glsl_intrinsic(gen, ins, "ceil");
1652 break;
1653 case VKD3DSIH_ROUND_Z:
1654 shader_glsl_intrinsic(gen, ins, "trunc");
1655 break;
1656 case VKD3DSIH_RSQ:
1657 shader_glsl_intrinsic(gen, ins, "inversesqrt");
1658 break;
1659 case VKD3DSIH_SQRT:
1660 shader_glsl_intrinsic(gen, ins, "sqrt");
1661 break;
1664 break;
1665 case VKD3DSIH_SWITCH:
1666 shader_glsl_switch(gen, ins);
1667 break;
1668 default:
1669 shader_glsl_unhandled(gen, ins);
1670 break;
1671 }
1672}
static void shader_glsl_dot(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, uint32_t src_mask)
Definition: glsl.c:584
static void shader_glsl_intrinsic(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *op)
Definition: glsl.c:608
static void shader_glsl_binop(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *op)
Definition: glsl.c:566
static void shader_glsl_mul_extended(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1251
static void shader_glsl_dcl_indexable_temp(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1475
static void shader_glsl_default(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:760
static void shader_glsl_unhandled(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:558
static void shader_glsl_relop(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *scalar_op, const char *vector_op)
Definition: glsl.c:632
static void shader_glsl_continue(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:729
static void shader_glsl_break(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:723
static void shader_glsl_ret(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1463
static void shader_glsl_sample(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:900
static void shader_glsl_mov(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1211
static void shader_glsl_if(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:692
static void shader_glsl_load_uav_typed(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1055
static void shader_glsl_cast(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *scalar_constructor, const char *vector_constructor)
Definition: glsl.c:656
static void shader_glsl_ld(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:787
static void shader_glsl_store_uav_typed(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1116
static void shader_glsl_case(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:748
static void shader_glsl_unary_op(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *op)
Definition: glsl.c:1195
static void shader_glsl_loop(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:716
static void shader_glsl_switch(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:735
static void shader_glsl_else(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:708
static void shader_glsl_movc(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1226
struct vkd3d_shader_location location
@ VKD3DSIH_NOP
@ VKD3DSIH_ENDSWITCH
@ VKD3DSIH_DP2
@ VKD3DSIH_AND
@ VKD3DSIH_ISHL
@ VKD3DSIH_IMUL
@ VKD3DSIH_LOOP
@ VKD3DSIH_ROUND_PI
@ VKD3DSIH_DCL_INPUT_PS
@ VKD3DSIH_SWITCH
@ VKD3DSIH_IADD
@ VKD3DSIH_DP4
@ VKD3DSIH_DIV
@ VKD3DSIH_STORE_UAV_TYPED
@ VKD3DSIH_IEQ
@ VKD3DSIH_DCL_OUTPUT
@ VKD3DSIH_LD_UAV_TYPED
@ VKD3DSIH_SAMPLE
@ VKD3DSIH_UMAX
@ VKD3DSIH_DCL_OUTPUT_SIV
@ VKD3DSIH_ISHR
@ VKD3DSIH_NEU
@ VKD3DSIH_DCL_INPUT_SGV
@ VKD3DSIH_ROUND_NE
@ VKD3DSIH_MUL
@ VKD3DSIH_BREAK
@ VKD3DSIH_EXP
@ VKD3DSIH_CASE
@ VKD3DSIH_MIN
@ VKD3DSIH_CONTINUE
@ VKD3DSIH_IF
@ VKD3DSIH_RSQ
@ VKD3DSIH_ENDIF
@ VKD3DSIH_IMAX
@ VKD3DSIH_FTOI
@ VKD3DSIH_DCL_INPUT
@ VKD3DSIH_LOG
@ VKD3DSIH_ROUND_NI
@ VKD3DSIH_EQO
@ VKD3DSIH_DCL_INPUT_PS_SIV
@ VKD3DSIH_UTOF
@ VKD3DSIH_LTO
@ VKD3DSIH_NOT
@ VKD3DSIH_MAD
@ VKD3DSIH_ADD
@ VKD3DSIH_INE
@ VKD3DSIH_MOVC
@ VKD3DSIH_MOV
@ VKD3DSIH_MAX
@ VKD3DSIH_ULT
@ VKD3DSIH_FTOU
@ VKD3DSIH_OR
@ VKD3DSIH_ILT
@ VKD3DSIH_USHR
@ VKD3DSIH_ENDLOOP
@ VKD3DSIH_FRC
@ VKD3DSIH_ELSE
@ VKD3DSIH_DCL_INPUT_PS_SGV
@ VKD3DSIH_LD
@ VKD3DSIH_DCL_INDEXABLE_TEMP
@ VKD3DSIH_GEO
@ VKD3DSIH_INEG
@ VKD3DSIH_ITOF
@ VKD3DSIH_ROUND_Z
@ VKD3DSIH_IGE
@ VKD3DSIH_DEFAULT
@ VKD3DSIH_UMIN
@ VKD3DSIH_RET
@ VKD3DSIH_DP3
@ VKD3DSIH_SQRT

Referenced by vkd3d_glsl_generator_generate().

◆ VKD3D_PRINTF_FUNC() [1/3]

static void VKD3D_PRINTF_FUNC ( 3  ,
4   
)
static

Definition at line 74 of file glsl.c.

77{
79
81 vkd3d_shader_verror(generator->message_context, &generator->location, error, fmt, args);
82 va_end(args);
83 generator->failed = true;
84}
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
char * va_list
Definition: vadefs.h:50
#define error(str)
Definition: mkdosfs.c:1605
Definition: dsound.c:943
void vkd3d_shader_verror(struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location, enum vkd3d_shader_error error, const char *format, va_list args)

◆ VKD3D_PRINTF_FUNC() [2/3]

static void VKD3D_PRINTF_FUNC ( 4  ,
0   
)
static

Definition at line 493 of file glsl.c.

495{
496 struct vkd3d_string_buffer *buffer = gen->buffer;
497 uint32_t modifiers = dst->vsir->modifiers;
498 bool close = true;
499
500 if (dst->vsir->shift)
501 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
502 "Internal compiler error: Unhandled destination shift %#x.", dst->vsir->shift);
503 if (modifiers & ~VKD3DSPDM_SATURATE)
504 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
505 "Internal compiler error: Unhandled destination modifier(s) %#x.", modifiers);
506
507 shader_glsl_print_indent(buffer, gen->indent);
508 vkd3d_string_buffer_printf(buffer, "%s%s = ", dst->register_name->buffer, dst->mask->buffer);
509 if (modifiers & VKD3DSPDM_SATURATE)
511
512 switch (data_type)
513 {
514 default:
515 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
516 "Internal compiler error: Unhandled destination register data type %#x.", data_type);
517 /* fall through */
518 case VKD3D_DATA_FLOAT:
519 close = false;
520 break;
521 case VKD3D_DATA_INT:
522 vkd3d_string_buffer_printf(buffer, "intBitsToFloat(");
523 break;
524 case VKD3D_DATA_UINT:
525 vkd3d_string_buffer_printf(buffer, "uintBitsToFloat(");
526 break;
527 }
528
530
531 if (close)
533 if (modifiers & VKD3DSPDM_SATURATE)
534 vkd3d_string_buffer_printf(buffer, ", 0.0, 1.0)");
536}
#define close
Definition: acwin.h:99
int vkd3d_string_buffer_vprintf(struct vkd3d_string_buffer *buffer, const char *format, va_list args)
@ VKD3DSPDM_SATURATE

◆ VKD3D_PRINTF_FUNC() [3/3]

static void VKD3D_PRINTF_FUNC ( 4  ,
5   
)
static

Definition at line 548 of file glsl.c.

550{
552
554 shader_glsl_vprint_assignment(gen, dst, data_type, format, args);
555 va_end(args);
556}