ReactOS 0.4.17-dev-934-g091855f
shader_spirv.c File Reference
#include "wined3d_private.h"
#include "wined3d_vk.h"
Include dependency graph for shader_spirv.c:

Go to the source code of this file.

Classes

struct  shader_spirv_resource_bindings
 
struct  shader_spirv_priv
 
struct  shader_spirv_compile_arguments
 
struct  shader_spirv_graphics_program_variant_vk
 
struct  shader_spirv_graphics_program_vk
 
struct  shader_spirv_compute_program_vk
 
struct  wined3d_shader_spirv_compile_args
 
struct  wined3d_shader_spirv_shader_interface
 

Macros

#define MAX_SM1_INTER_STAGE_VARYINGS   12
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (d3d_shader)
 
static void shader_spirv_handle_instruction (const struct wined3d_shader_instruction *ins)
 
static void shader_spirv_compile_arguments_init (struct shader_spirv_compile_arguments *args, const struct wined3d_context *context, const struct wined3d_shader *shader, const struct wined3d_state *state, unsigned int sample_count)
 
static void fill_ps_parameters (struct wined3d_shader_spirv_compile_args *vkd3d_args, const struct shader_spirv_compile_arguments *compile_args, uint32_t ffp_extra_binding)
 
static void shader_spirv_init_compile_args (const struct wined3d_vk_info *vk_info, struct wined3d_shader_spirv_compile_args *args, struct vkd3d_shader_interface_info *vkd3d_interface, enum vkd3d_shader_spirv_environment environment, enum wined3d_shader_type shader_type, enum vkd3d_shader_source_type source_type, const struct shader_spirv_compile_arguments *compile_args, const struct shader_spirv_resource_bindings *bindings)
 
static void shader_spirv_init_shader_interface_vk (struct wined3d_shader_spirv_shader_interface *iface, const struct shader_spirv_resource_bindings *b, const struct wined3d_stream_output_desc *so_desc)
 
static VkShaderModule shader_spirv_compile_shader (struct wined3d_context_vk *context_vk, const struct wined3d_shader_desc *shader_desc, enum vkd3d_shader_source_type source_type, enum wined3d_shader_type shader_type, const struct shader_spirv_compile_arguments *args, const struct shader_spirv_resource_bindings *bindings, const struct wined3d_stream_output_desc *so_desc)
 
static struct shader_spirv_graphics_program_variant_vk * shader_spirv_find_graphics_program_variant_vk (struct shader_spirv_priv *priv, struct wined3d_context_vk *context_vk, struct wined3d_shader *shader, const struct wined3d_state *state, const struct shader_spirv_resource_bindings *bindings)
 
static struct shader_spirv_compute_program_vk * shader_spirv_find_compute_program_vk (struct shader_spirv_priv *priv, struct wined3d_context_vk *context_vk, struct wined3d_shader *shader, const struct shader_spirv_resource_bindings *bindings)
 
static void shader_spirv_resource_bindings_cleanup (struct shader_spirv_resource_bindings *bindings)
 
static bool shader_spirv_resource_bindings_add_vk_binding (struct shader_spirv_resource_bindings *bindings, VkDescriptorType vk_type, VkShaderStageFlagBits vk_stage, size_t *binding_idx)
 
static bool shader_spirv_resource_bindings_add_binding (struct shader_spirv_resource_bindings *bindings, enum vkd3d_shader_descriptor_type vkd3d_type, VkDescriptorType vk_type, size_t register_idx, enum vkd3d_shader_visibility vkd3d_visibility, VkShaderStageFlagBits vk_stage, uint32_t flags, size_t *binding_idx)
 
static bool shader_spirv_resource_bindings_add_uav_counter_binding (struct shader_spirv_resource_bindings *bindings, size_t register_idx, enum vkd3d_shader_visibility vkd3d_visibility, VkShaderStageFlagBits vk_stage, size_t *binding_idx)
 
static bool wined3d_shader_resource_bindings_add_binding (struct wined3d_shader_resource_bindings *bindings, enum wined3d_shader_type shader_type, enum wined3d_shader_descriptor_type shader_descriptor_type, size_t resource_idx, enum wined3d_shader_resource_type resource_type, enum wined3d_data_type resource_data_type, size_t binding_idx)
 
static VkDescriptorType vk_descriptor_type_from_vkd3d (enum vkd3d_shader_descriptor_type type, enum vkd3d_shader_resource_type resource_type)
 
static enum wined3d_shader_descriptor_type wined3d_descriptor_type_from_vkd3d (enum vkd3d_shader_descriptor_type type)
 
static enum wined3d_shader_resource_type wined3d_shader_resource_type_from_vkd3d (enum vkd3d_shader_resource_type t)
 
static enum wined3d_data_type wined3d_data_type_from_vkd3d (enum vkd3d_shader_resource_data_type t)
 
static bool shader_spirv_resource_bindings_init (struct shader_spirv_resource_bindings *bindings, struct wined3d_shader_resource_bindings *wined3d_bindings, const struct wined3d_state *state, uint32_t shader_mask)
 
static void shader_spirv_scan_shader (struct wined3d_shader *shader, struct vkd3d_shader_scan_descriptor_info *descriptor_info, struct vkd3d_shader_scan_signature_info *signature_info)
 
static void shader_spirv_precompile_compute (struct wined3d_shader *shader)
 
static void shader_spirv_precompile (void *shader_priv, struct wined3d_shader *shader)
 
static void shader_spirv_apply_draw_state (void *shader_priv, struct wined3d_context *context, const struct wined3d_state *state)
 
static void shader_spirv_apply_compute_state (void *shader_priv, struct wined3d_context *context, const struct wined3d_state *state)
 
static void shader_spirv_disable (void *shader_priv, struct wined3d_context *context)
 
static void shader_spirv_update_float_vertex_constants (struct wined3d_device *device, UINT start, UINT count)
 
static void shader_spirv_update_float_pixel_constants (struct wined3d_device *device, UINT start, UINT count)
 
static void shader_spirv_invalidate_compute_program (struct wined3d_context_vk *context_vk, const struct shader_spirv_compute_program_vk *program)
 
static void shader_spirv_invalidate_contexts_compute_program (struct wined3d_device *device, const struct shader_spirv_compute_program_vk *program)
 
static void shader_spirv_invalidate_graphics_program_variant (struct wined3d_context_vk *context_vk, const struct shader_spirv_graphics_program_variant_vk *variant)
 
static void shader_spirv_invalidate_contexts_graphics_program_variant (struct wined3d_device *device, const struct shader_spirv_graphics_program_variant_vk *variant)
 
static void shader_spirv_destroy_compute_vk (struct wined3d_shader *shader)
 
static void shader_spirv_destroy (struct wined3d_shader *shader)
 
static HRESULT shader_spirv_alloc (struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe, const struct wined3d_fragment_pipe_ops *fragment_pipe)
 
static void shader_spirv_free (struct wined3d_device *device, struct wined3d_context *context)
 
static BOOL shader_spirv_allocate_context_data (struct wined3d_context *context)
 
static void shader_spirv_free_context_data (struct wined3d_context *context)
 
static void shader_spirv_init_context_state (struct wined3d_context *context)
 
static void shader_spirv_get_caps (const struct wined3d_adapter *adapter, struct shader_caps *caps)
 
static BOOL shader_spirv_color_fixup_supported (struct color_fixup_desc fixup)
 
static uint64_t shader_spirv_compile (struct wined3d_context *context, const struct wined3d_shader_desc *shader_desc, enum wined3d_shader_type shader_type)
 
const struct wined3d_shader_backend_ops * wined3d_spirv_shader_backend_init_vk (void)
 
static void spirv_vertex_pipe_vk_vp_apply_draw_state (struct wined3d_context *context, const struct wined3d_state *state)
 
static void spirv_vertex_pipe_vk_vp_disable (const struct wined3d_context *context)
 
static void spirv_vertex_pipe_vk_vp_get_caps (const struct wined3d_adapter *adapter, struct wined3d_vertex_caps *caps)
 
static unsigned int spirv_vertex_pipe_vk_vp_get_emul_mask (const struct wined3d_adapter *adapter)
 
static void * spirv_vertex_pipe_vk_vp_alloc (const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv)
 
static void spirv_vertex_pipe_vk_vp_free (struct wined3d_device *device, struct wined3d_context *context)
 
const struct wined3d_vertex_pipe_ops * wined3d_spirv_vertex_pipe_init_vk (void)
 
static void spirv_fragment_pipe_vk_fp_apply_draw_state (struct wined3d_context *context, const struct wined3d_state *state)
 
static void spirv_fragment_pipe_vk_fp_disable (const struct wined3d_context *context)
 
static void spirv_fragment_pipe_vk_fp_get_caps (const struct wined3d_adapter *adapter, struct fragment_caps *caps)
 
static unsigned int spirv_fragment_pipe_vk_fp_get_emul_mask (const struct wined3d_adapter *adapter)
 
static void * spirv_fragment_pipe_vk_fp_alloc (const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv)
 
static void spirv_fragment_pipe_vk_fp_free (struct wined3d_device *device, struct wined3d_context *context)
 
static BOOL spirv_fragment_pipe_vk_fp_alloc_context_data (struct wined3d_context *context)
 
static void spirv_fragment_pipe_vk_fp_free_context_data (struct wined3d_context *context)
 
const struct wined3d_fragment_pipe_ops * wined3d_spirv_fragment_pipe_init_vk (void)
 

Variables

static const struct wined3d_shader_backend_ops spirv_shader_backend_vk
 
static const struct vkd3d_shader_compile_option spirv_compile_options []
 
static const struct wined3d_state_entry_template spirv_vertex_pipe_vk_vp_states []
 
static const struct wined3d_vertex_pipe_ops spirv_vertex_pipe_vk
 
static const struct wined3d_state_entry_template spirv_fragment_pipe_vk_fp_states []
 
static const struct wined3d_fragment_pipe_ops spirv_fragment_pipe_vk
 

Macro Definition Documentation

◆ MAX_SM1_INTER_STAGE_VARYINGS

#define MAX_SM1_INTER_STAGE_VARYINGS   12

Definition at line 58 of file shader_spirv.c.

Function Documentation

◆ fill_ps_parameters()

static void fill_ps_parameters ( struct wined3d_shader_spirv_compile_args *  vkd3d_args,
const struct shader_spirv_compile_arguments *  compile_args,
uint32_t  ffp_extra_binding 
)
static

Definition at line 164 of file shader_spirv.c.

166{
167 struct vkd3d_shader_parameter1 *parameters = vkd3d_args->parameters;
168
172 parameters[0].u.immediate_constant.u.u32 = compile_args->u.fs.sample_count;
173
177 parameters[1].u.immediate_constant.u.u32 = compile_args->u.fs.args.flatshading;
178
182 parameters[2].u.immediate_constant.u.u32 = compile_args->u.fs.args.alpha_test_func + 1;
183
187 parameters[3].u.buffer.set = 0;
188 parameters[3].u.buffer.binding = ffp_extra_binding;
189 parameters[3].u.buffer.offset = offsetof(struct wined3d_ffp_ps_constants, alpha_test_ref);
190
191 vkd3d_args->parameter_info.parameter_count = 4;
192 vkd3d_args->parameter_info.parameters = vkd3d_args->parameters;
193}
static BYTE parameters[]
Definition: asn.c:558
#define offsetof(TYPE, MEMBER)
struct vkd3d_shader_parameter_info parameter_info
Definition: shader_spirv.c:109
struct vkd3d_shader_parameter1 parameters[4]
Definition: shader_spirv.c:111
static HRESULT compile_args(compile_ctx_t *ctx, expression_t *args, unsigned *ret)
Definition: compile.c:452
@ VKD3D_SHADER_PARAMETER_TYPE_BUFFER
Definition: vkd3d_shader.h:494
@ VKD3D_SHADER_PARAMETER_TYPE_IMMEDIATE_CONSTANT
Definition: vkd3d_shader.h:482
@ VKD3D_SHADER_PARAMETER_DATA_TYPE_UINT32
Definition: vkd3d_shader.h:507
@ VKD3D_SHADER_PARAMETER_DATA_TYPE_FLOAT32
Definition: vkd3d_shader.h:509
@ VKD3D_SHADER_PARAMETER_NAME_RASTERIZER_SAMPLE_COUNT
Definition: vkd3d_shader.h:540
@ VKD3D_SHADER_PARAMETER_NAME_ALPHA_TEST_FUNC
Definition: vkd3d_shader.h:565
@ VKD3D_SHADER_PARAMETER_NAME_ALPHA_TEST_REF
Definition: vkd3d_shader.h:575
@ VKD3D_SHADER_PARAMETER_NAME_FLAT_INTERPOLATION
Definition: vkd3d_shader.h:599

Referenced by shader_spirv_init_compile_args().

◆ shader_spirv_alloc()

static HRESULT shader_spirv_alloc ( struct wined3d_device *  device,
const struct wined3d_vertex_pipe_ops *  vertex_pipe,
const struct wined3d_fragment_pipe_ops *  fragment_pipe 
)
static

Definition at line 1052 of file shader_spirv.c.

1054{
1055 void *vertex_priv, *fragment_priv;
1056 struct shader_spirv_priv *priv;
1057
1058 if (!(priv = malloc(sizeof(*priv))))
1059 return E_OUTOFMEMORY;
1060
1061 if (!(vertex_priv = vertex_pipe->vp_alloc(&spirv_shader_backend_vk, priv)))
1062 {
1063 ERR("Failed to initialise vertex pipe.\n");
1064 free(priv);
1065 return E_FAIL;
1066 }
1067
1068 if (!(fragment_priv = fragment_pipe->alloc_private(&spirv_shader_backend_vk, priv)))
1069 {
1070 ERR("Failed to initialise fragment pipe.\n");
1071 vertex_pipe->vp_free(device, NULL);
1072 free(priv);
1073 return E_FAIL;
1074 }
1075
1076 priv->vertex_pipe = vertex_pipe;
1078 memset(&priv->bindings, 0, sizeof(priv->bindings));
1079
1080 device->vertex_priv = vertex_priv;
1081 device->fragment_priv = fragment_priv;
1082 device->shader_priv = priv;
1083
1084 return WINED3D_OK;
1085}
#define ERR(fmt,...)
Definition: precomp.h:57
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
#define memset(x, y, z)
Definition: compat.h:39
static const struct wined3d_shader_backend_ops spirv_shader_backend_vk
Definition: shader_spirv.c:25
Definition: devices.h:37
const struct wined3d_fragment_pipe_ops * fragment_pipe
Definition: shader_spirv.c:53
struct shader_spirv_resource_bindings bindings
Definition: shader_spirv.c:55
const struct wined3d_vertex_pipe_ops * vertex_pipe
Definition: shader_spirv.c:52
#define WINED3D_OK
Definition: wined3d.h:33

◆ shader_spirv_allocate_context_data()

static BOOL shader_spirv_allocate_context_data ( struct wined3d_context *  context)
static

Definition at line 1097 of file shader_spirv.c.

1098{
1099 return TRUE;
1100}
#define TRUE
Definition: types.h:120

◆ shader_spirv_apply_compute_state()

static void shader_spirv_apply_compute_state ( void *  shader_priv,
struct wined3d_context *  context,
const struct wined3d_state *  state 
)
static

Definition at line 900 of file shader_spirv.c.

902{
903 struct wined3d_context_vk *context_vk = wined3d_context_vk(context);
905 struct shader_spirv_priv *priv = shader_priv;
906 struct wined3d_shader *shader;
907
909 &context_vk->compute.bindings, state, 1u << WINED3D_SHADER_TYPE_COMPUTE))
910 ERR("Failed to initialise shader resource bindings.\n");
911
913 program = shader_spirv_find_compute_program_vk(priv, context_vk, shader, &priv->bindings);
914 else
915 program = NULL;
916
917 if (program)
918 {
919 context_vk->compute.vk_pipeline = program->vk_pipeline;
920 context_vk->compute.vk_set_layout = program->vk_set_layout;
921 context_vk->compute.vk_pipeline_layout = program->vk_pipeline_layout;
922 }
923 else
924 {
925 context_vk->compute.vk_pipeline = VK_NULL_HANDLE;
926 context_vk->compute.vk_set_layout = VK_NULL_HANDLE;
927 context_vk->compute.vk_pipeline_layout = VK_NULL_HANDLE;
928 }
929}
static int state
Definition: maze.c:121
GLuint shader
Definition: glext.h:6030
GLuint program
Definition: glext.h:6723
static struct shader_spirv_compute_program_vk * shader_spirv_find_compute_program_vk(struct shader_spirv_priv *priv, struct wined3d_context_vk *context_vk, struct wined3d_shader *shader, const struct shader_spirv_resource_bindings *bindings)
Definition: shader_spirv.c:405
static bool shader_spirv_resource_bindings_init(struct shader_spirv_resource_bindings *bindings, struct wined3d_shader_resource_bindings *wined3d_bindings, const struct wined3d_state *state, uint32_t shader_mask)
Definition: shader_spirv.c:649
Definition: http.c:7252
struct wined3d_context_vk::@363 compute
#define VK_NULL_HANDLE
Definition: vulkan.h:861
@ WINED3D_SHADER_TYPE_COMPUTE
Definition: wined3d.h:848

◆ shader_spirv_apply_draw_state()

static void shader_spirv_apply_draw_state ( void *  shader_priv,
struct wined3d_context *  context,
const struct wined3d_state *  state 
)
static

Definition at line 846 of file shader_spirv.c.

848{
849 struct wined3d_context_vk *context_vk = wined3d_context_vk(context);
853 struct wined3d_pipeline_layout_vk *layout_vk;
854 struct shader_spirv_priv *priv = shader_priv;
856 struct wined3d_shader *shader;
857
858 priv->vertex_pipe->vp_apply_draw_state(context, state);
859 priv->fragment_pipe->fp_apply_draw_state(context, state);
860
861 bindings = &priv->bindings;
862 memcpy(binding_base, bindings->binding_base, sizeof(bindings->binding_base));
863 if (!shader_spirv_resource_bindings_init(bindings, &context_vk->graphics.bindings,
865 {
866 ERR("Failed to initialise shader resource bindings.\n");
867 goto fail;
868 }
869 if (context->shader_update_mask & (1u << WINED3D_SHADER_TYPE_GEOMETRY))
870 context->shader_update_mask |= 1u << bindings->so_stage;
871
872 layout_vk = wined3d_context_vk_get_pipeline_layout(context_vk, bindings->vk_bindings, bindings->vk_binding_count);
873 context_vk->graphics.vk_set_layout = layout_vk->vk_set_layout;
874 context_vk->graphics.vk_pipeline_layout = layout_vk->vk_pipeline_layout;
875
876 for (shader_type = 0; shader_type < ARRAY_SIZE(context_vk->graphics.vk_modules); ++shader_type)
877 {
878 if (!(context->shader_update_mask & (1u << shader_type)) && (!context_vk->graphics.vk_modules[shader_type]
879 || binding_base[shader_type] == bindings->binding_base[shader_type]))
880 continue;
881
882 if (!(shader = state->shader[shader_type]) || !shader->function)
883 {
884 context_vk->graphics.vk_modules[shader_type] = VK_NULL_HANDLE;
885 continue;
886 }
887
888 if (!(variant_vk = shader_spirv_find_graphics_program_variant_vk(priv, context_vk, shader, state, bindings)))
889 goto fail;
890 context_vk->graphics.vk_modules[shader_type] = variant_vk->vk_module;
891 }
892
893 return;
894
895fail:
896 context_vk->graphics.vk_set_layout = VK_NULL_HANDLE;
897 context_vk->graphics.vk_pipeline_layout = VK_NULL_HANDLE;
898}
#define ARRAY_SIZE(A)
Definition: main.h:20
struct wined3d_pipeline_layout_vk * wined3d_context_vk_get_pipeline_layout(struct wined3d_context_vk *context_vk, VkDescriptorSetLayoutBinding *bindings, SIZE_T binding_count)
Definition: context_vk.c:3442
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static struct shader_spirv_graphics_program_variant_vk * shader_spirv_find_graphics_program_variant_vk(struct shader_spirv_priv *priv, struct wined3d_context_vk *context_vk, struct wined3d_shader *shader, const struct wined3d_state *state, const struct shader_spirv_resource_bindings *bindings)
Definition: shader_spirv.c:349
enum wined3d_shader_type so_stage
Definition: shader_spirv.c:45
struct vkd3d_shader_resource_binding * bindings
Definition: shader_spirv.c:35
size_t binding_base[WINED3D_SHADER_TYPE_COUNT]
Definition: shader_spirv.c:44
VkDescriptorSetLayoutBinding * vk_bindings
Definition: shader_spirv.c:41
struct wined3d_context_vk::@362 graphics
VkDescriptorSetLayout vk_set_layout
Definition: wined3d_vk.h:522
VkPipelineLayout vk_pipeline_layout
Definition: wined3d_vk.h:521
wined3d_shader_type
Definition: wined3d.h:840
@ WINED3D_SHADER_TYPE_GEOMETRY
Definition: wined3d.h:843
@ WINED3D_SHADER_TYPE_COUNT
Definition: wined3d.h:849

◆ shader_spirv_color_fixup_supported()

static BOOL shader_spirv_color_fixup_supported ( struct color_fixup_desc  fixup)
static

Definition at line 1128 of file shader_spirv.c.

1129{
1130 return is_identity_fixup(fixup);
1131}
static BOOL is_identity_fixup(struct color_fixup_desc fixup)

◆ shader_spirv_compile()

static uint64_t shader_spirv_compile ( struct wined3d_context *  context,
const struct wined3d_shader_desc *  shader_desc,
enum wined3d_shader_type  shader_type 
)
static

Definition at line 1133 of file shader_spirv.c.

1135{
1139}
UINT64 uint64_t
Definition: types.h:77
static VkShaderModule shader_spirv_compile_shader(struct wined3d_context_vk *context_vk, const struct wined3d_shader_desc *shader_desc, enum vkd3d_shader_source_type source_type, enum wined3d_shader_type shader_type, const struct shader_spirv_compile_arguments *args, const struct shader_spirv_resource_bindings *bindings, const struct wined3d_stream_output_desc *so_desc)
Definition: shader_spirv.c:278
@ VKD3D_SHADER_SOURCE_DXBC_TPF

◆ shader_spirv_compile_arguments_init()

static void shader_spirv_compile_arguments_init ( struct shader_spirv_compile_arguments *  args,
const struct wined3d_context *  context,
const struct wined3d_shader *  shader,
const struct wined3d_state *  state,
unsigned int  sample_count 
)
static

Definition at line 125 of file shader_spirv.c.

128{
129 memset(args, 0, sizeof(*args));
130
131 switch (shader->reg_maps.shader_version.type)
132 {
134 /* The context here doesn't have a valid stream info, but that's
135 * fine, because we have full_ffp_varyings. */
137 state->vertex_declaration && state->vertex_declaration->position_transformed,
138 &args->u.fs.args, context);
139 args->u.fs.sample_count = sample_count;
140 break;
141
143 {
145
146 if (shader->reg_maps.shader_version.major < 4 && ps)
147 {
148 struct shader_spirv_graphics_program_vk *vs_program = shader->backend_data;
149 struct shader_spirv_graphics_program_vk *ps_program = ps->backend_data;
150
151 if (ps_program->signature_info.input.element_count > ARRAY_SIZE(args->u.vs.varying_map))
152 ERR("Unexpected inter-stage varying count %u.\n", ps_program->signature_info.input.element_count);
154 &ps_program->signature_info.input, &args->u.vs.varying_count, args->u.vs.varying_map);
155 }
156 break;
157 }
158
159 default:
160 break;
161 }
162}
void find_ps_compile_args(const struct wined3d_state *state, const struct wined3d_shader *shader, BOOL position_transformed, struct ps_compile_args *args, const struct wined3d_context *context)
Definition: shader.c:2871
Definition: match.c:390
struct vkd3d_shader_scan_signature_info signature_info
Definition: shader_spirv.c:92
struct wined3d_pixel_shader ps
VKD3D_SHADER_API void vkd3d_shader_build_varying_map(const struct vkd3d_shader_signature *output_signature, const struct vkd3d_shader_signature *input_signature, unsigned int *count, struct vkd3d_shader_varying_map *varyings)
@ WINED3D_SHADER_TYPE_PIXEL
Definition: wined3d.h:841
@ WINED3D_SHADER_TYPE_VERTEX
Definition: wined3d.h:842

Referenced by shader_spirv_find_graphics_program_variant_vk().

◆ shader_spirv_compile_shader()

static VkShaderModule shader_spirv_compile_shader ( struct wined3d_context_vk *  context_vk,
const struct wined3d_shader_desc *  shader_desc,
enum vkd3d_shader_source_type  source_type,
enum wined3d_shader_type  shader_type,
const struct shader_spirv_compile_arguments *  args,
const struct shader_spirv_resource_bindings *  bindings,
const struct wined3d_stream_output_desc *  so_desc 
)
static

Definition at line 278 of file shader_spirv.c.

282{
283 struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device);
284 const struct wined3d_vk_info *vk_info = &device_vk->vk_info;
287 VkShaderModuleCreateInfo shader_create_info;
289 struct vkd3d_shader_code spirv;
290 VkShaderModule module;
291 char *messages;
292 VkResult vr;
293 int ret;
294
295 shader_spirv_init_shader_interface_vk(&iface, bindings, so_desc);
296 shader_spirv_init_compile_args(vk_info, &compile_args, &iface.vkd3d_interface,
298
300 info.next = &compile_args.spirv_target;
301 info.source.code = shader_desc->byte_code;
302 info.source.size = shader_desc->byte_code_size;
303 info.source_type = source_type;
305 info.options = spirv_compile_options;
306 info.option_count = ARRAY_SIZE(spirv_compile_options);
307 info.log_level = VKD3D_SHADER_LOG_WARNING;
308 info.source_name = NULL;
309
311 if (messages && *messages && FIXME_ON(d3d_shader))
312 {
313 const char *ptr, *end, *line;
314
315 FIXME("Shader log:\n");
316 ptr = messages;
317 end = ptr + strlen(ptr);
318 while ((line = wined3d_get_line(&ptr, end)))
319 {
320 FIXME(" %.*s", (int)(ptr - line), line);
321 }
322 FIXME("\n");
323 }
325
326 if (ret < 0)
327 {
328 ERR("Failed to compile shader, ret %d.\n", ret);
329 return VK_NULL_HANDLE;
330 }
331
332 shader_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
333 shader_create_info.pNext = NULL;
334 shader_create_info.flags = 0;
335 shader_create_info.codeSize = spirv.size;
336 shader_create_info.pCode = spirv.code;
337 if ((vr = VK_CALL(vkCreateShaderModule(device_vk->vk_device, &shader_create_info, NULL, &module))) < 0)
338 {
340 WARN("Failed to create Vulkan shader module, vr %s.\n", wined3d_debug_vkresult(vr));
341 return VK_NULL_HANDLE;
342 }
343
345
346 return module;
347}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
const char * wined3d_debug_vkresult(VkResult vr)
Definition: utils.c:5463
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
return ret
Definition: mutex.c:147
GLuint GLuint end
Definition: gl.h:1545
static PVOID ptr
Definition: dispmode.c:27
#define FIXME_ON(ch)
Definition: debug.h:418
static void shader_spirv_init_shader_interface_vk(struct wined3d_shader_spirv_shader_interface *iface, const struct shader_spirv_resource_bindings *b, const struct wined3d_stream_output_desc *so_desc)
Definition: shader_spirv.c:252
static void shader_spirv_init_compile_args(const struct wined3d_vk_info *vk_info, struct wined3d_shader_spirv_compile_args *args, struct vkd3d_shader_interface_info *vkd3d_interface, enum vkd3d_shader_spirv_environment environment, enum wined3d_shader_type shader_type, enum vkd3d_shader_source_type source_type, const struct shader_spirv_compile_arguments *compile_args, const struct shader_spirv_resource_bindings *bindings)
Definition: shader_spirv.c:195
static const struct vkd3d_shader_compile_option spirv_compile_options[]
Definition: shader_spirv.c:27
Definition: parser.c:49
VkDevice vk_device
Definition: wined3d_vk.h:825
struct wined3d_vk_info vk_info
Definition: wined3d_vk.h:830
struct wined3d_context_vk context_vk
Definition: wined3d_vk.h:823
const DWORD * byte_code
Definition: wined3d.h:2105
size_t byte_code_size
Definition: wined3d.h:2106
VKD3D_SHADER_API void vkd3d_shader_free_shader_code(struct vkd3d_shader_code *code)
@ VKD3D_SHADER_LOG_WARNING
@ VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO
Definition: vkd3d_shader.h:68
VKD3D_SHADER_API int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, char **messages)
@ VKD3D_SHADER_TARGET_SPIRV_BINARY
@ VKD3D_SHADER_SPIRV_ENVIRONMENT_VULKAN_1_0
VKD3D_SHADER_API void vkd3d_shader_free_messages(char *messages)
VkResult
Definition: vulkan.h:4639
VkResult VKAPI_CALL vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule)
@ VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO
Definition: vulkan.h:4980
static const char * wined3d_get_line(const char **ptr, const char *end)
#define VK_CALL(f)
Definition: wined3d_vk.h:272

Referenced by shader_spirv_compile(), shader_spirv_find_compute_program_vk(), and shader_spirv_find_graphics_program_variant_vk().

◆ shader_spirv_destroy()

static void shader_spirv_destroy ( struct wined3d_shader *  shader)
static

Definition at line 1020 of file shader_spirv.c.

1021{
1022 struct wined3d_device_vk *device_vk = wined3d_device_vk(shader->device);
1024 struct wined3d_vk_info *vk_info = &device_vk->vk_info;
1025 struct shader_spirv_graphics_program_vk *program_vk;
1026 size_t i;
1027
1028 if (!shader->backend_data)
1029 return;
1030
1031 if (shader->reg_maps.shader_version.type == WINED3D_SHADER_TYPE_COMPUTE)
1032 {
1034 return;
1035 }
1036
1037 program_vk = shader->backend_data;
1038 for (i = 0; i < program_vk->variant_count; ++i)
1039 {
1040 variant_vk = &program_vk->variants[i];
1042 VK_CALL(vkDestroyShaderModule(device_vk->vk_device, variant_vk->vk_module, NULL));
1043 }
1044 free(program_vk->variants);
1047
1048 shader->backend_data = NULL;
1049 free(program_vk);
1050}
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_spirv_invalidate_contexts_graphics_program_variant(struct wined3d_device *device, const struct shader_spirv_graphics_program_variant_vk *variant)
Definition: shader_spirv.c:994
static void shader_spirv_destroy_compute_vk(struct wined3d_shader *shader)
struct vkd3d_shader_scan_descriptor_info descriptor_info
Definition: shader_spirv.c:91
struct shader_spirv_graphics_program_variant_vk * variants
Definition: shader_spirv.c:88
struct wined3d_device d
Definition: wined3d_vk.h:821
VKD3D_SHADER_API void vkd3d_shader_free_scan_signature_info(struct vkd3d_shader_scan_signature_info *info)
VKD3D_SHADER_API void vkd3d_shader_free_scan_descriptor_info(struct vkd3d_shader_scan_descriptor_info *scan_descriptor_info)
void VKAPI_CALL vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator)

◆ shader_spirv_destroy_compute_vk()

static void shader_spirv_destroy_compute_vk ( struct wined3d_shader *  shader)
static

Definition at line 1005 of file shader_spirv.c.

1006{
1007 struct wined3d_device_vk *device_vk = wined3d_device_vk(shader->device);
1008 struct shader_spirv_compute_program_vk *program = shader->backend_data;
1009 struct wined3d_context_vk *context_vk = &device_vk->context_vk;
1010 struct wined3d_vk_info *vk_info = &device_vk->vk_info;
1011
1013 wined3d_context_vk_destroy_vk_pipeline(context_vk, program->vk_pipeline, context_vk->current_command_buffer.id);
1014 VK_CALL(vkDestroyShaderModule(device_vk->vk_device, program->vk_module, NULL));
1016 shader->backend_data = NULL;
1017 free(program);
1018}
void wined3d_context_vk_destroy_vk_pipeline(struct wined3d_context_vk *context_vk, VkPipeline vk_pipeline, uint64_t command_buffer_id)
Definition: context_vk.c:1016
static void shader_spirv_invalidate_contexts_compute_program(struct wined3d_device *device, const struct shader_spirv_compute_program_vk *program)
Definition: shader_spirv.c:968
struct wined3d_command_buffer_vk current_command_buffer
Definition: wined3d_vk.h:617

Referenced by shader_spirv_destroy().

◆ shader_spirv_disable()

static void shader_spirv_disable ( void *  shader_priv,
struct wined3d_context *  context 
)
static

Definition at line 931 of file shader_spirv.c.

932{
933 struct wined3d_context_vk *context_vk = wined3d_context_vk(context);
934 struct shader_spirv_priv *priv = shader_priv;
935
936 priv->vertex_pipe->vp_disable(context);
937 priv->fragment_pipe->fp_disable(context);
938
939 context_vk->compute.vk_pipeline = VK_NULL_HANDLE;
940 context->shader_update_mask = (1u << WINED3D_SHADER_TYPE_PIXEL)
946}
@ WINED3D_SHADER_TYPE_HULL
Definition: wined3d.h:844
@ WINED3D_SHADER_TYPE_DOMAIN
Definition: wined3d.h:845

◆ shader_spirv_find_compute_program_vk()

static struct shader_spirv_compute_program_vk * shader_spirv_find_compute_program_vk ( struct shader_spirv_priv *  priv,
struct wined3d_context_vk *  context_vk,
struct wined3d_shader *  shader,
const struct shader_spirv_resource_bindings *  bindings 
)
static

Definition at line 405 of file shader_spirv.c.

408{
409 struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device);
410 const struct wined3d_vk_info *vk_info = context_vk->vk_info;
412 struct wined3d_pipeline_layout_vk *layout;
413 VkComputePipelineCreateInfo pipeline_info;
414 struct wined3d_shader_desc shader_desc;
415 VkResult vr;
416
417 if (!(program = shader->backend_data))
418 return NULL;
419
420 if (program->vk_module)
421 return program;
422
423 shader_desc.byte_code = shader->byte_code;
424 shader_desc.byte_code_size = shader->byte_code_size;
425
426 if (!(program->vk_module = shader_spirv_compile_shader(context_vk, &shader_desc,
427 shader->source_type, WINED3D_SHADER_TYPE_COMPUTE, NULL, bindings, NULL)))
428 return NULL;
429
430 if (!(layout = wined3d_context_vk_get_pipeline_layout(context_vk,
431 bindings->vk_bindings, bindings->vk_binding_count)))
432 {
433 VK_CALL(vkDestroyShaderModule(device_vk->vk_device, program->vk_module, NULL));
434 program->vk_module = VK_NULL_HANDLE;
435 return NULL;
436 }
437 program->vk_set_layout = layout->vk_set_layout;
438 program->vk_pipeline_layout = layout->vk_pipeline_layout;
439
441 pipeline_info.pNext = NULL;
442 pipeline_info.flags = 0;
444 pipeline_info.stage.pNext = NULL;
445 pipeline_info.stage.flags = 0;
446 pipeline_info.stage.stage = VK_SHADER_STAGE_COMPUTE_BIT;
447 pipeline_info.stage.pName = "main";
448 pipeline_info.stage.pSpecializationInfo = NULL;
449 pipeline_info.stage.module = program->vk_module;
450 pipeline_info.layout = program->vk_pipeline_layout;
451 pipeline_info.basePipelineHandle = VK_NULL_HANDLE;
452 pipeline_info.basePipelineIndex = -1;
453 if ((vr = VK_CALL(vkCreateComputePipelines(device_vk->vk_device,
454 VK_NULL_HANDLE, 1, &pipeline_info, NULL, &program->vk_pipeline))) < 0)
455 {
456 ERR("Failed to create Vulkan compute pipeline, vr %s.\n", wined3d_debug_vkresult(vr));
457 VK_CALL(vkDestroyShaderModule(device_vk->vk_device, program->vk_module, NULL));
458 program->vk_module = VK_NULL_HANDLE;
459 return NULL;
460 }
461
462 return program;
463}
VkStructureType sType
Definition: vulkan.h:17583
VkPipelineCreateFlags flags
Definition: vulkan.h:17585
const struct wined3d_vk_info * vk_info
Definition: wined3d_vk.h:590
@ VK_SHADER_STAGE_COMPUTE_BIT
Definition: vulkan.h:4880
VkResult VKAPI_CALL vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines)
@ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
Definition: vulkan.h:4993
@ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
Definition: vulkan.h:4982

Referenced by shader_spirv_apply_compute_state().

◆ shader_spirv_find_graphics_program_variant_vk()

static struct shader_spirv_graphics_program_variant_vk * shader_spirv_find_graphics_program_variant_vk ( struct shader_spirv_priv *  priv,
struct wined3d_context_vk *  context_vk,
struct wined3d_shader *  shader,
const struct wined3d_state *  state,
const struct shader_spirv_resource_bindings *  bindings 
)
static

Definition at line 349 of file shader_spirv.c.

352{
353 enum wined3d_shader_type shader_type = shader->reg_maps.shader_version.type;
355 size_t binding_base = bindings->binding_base[shader_type];
356 const struct wined3d_stream_output_desc *so_desc = NULL;
357 struct shader_spirv_graphics_program_vk *program_vk;
359 struct wined3d_shader_desc shader_desc;
360 size_t variant_count, i;
361
362 shader_spirv_compile_arguments_init(&args, &context_vk->c, shader, state, context_vk->sample_count);
363 if (bindings->so_stage == shader_type)
364 so_desc = state->shader[WINED3D_SHADER_TYPE_GEOMETRY]->u.gs.so_desc;
365
366 if (!(program_vk = shader->backend_data))
367 return NULL;
368
369 variant_count = program_vk->variant_count;
370 for (i = 0; i < variant_count; ++i)
371 {
372 variant_vk = &program_vk->variants[i];
373 if (variant_vk->so_desc == so_desc && variant_vk->binding_base == binding_base
374 && !memcmp(&variant_vk->compile_args, &args, sizeof(args)))
375 return variant_vk;
376 }
377
378 if (!wined3d_array_reserve((void **)&program_vk->variants, &program_vk->variants_size,
379 variant_count + 1, sizeof(*program_vk->variants)))
380 return NULL;
381
382 variant_vk = &program_vk->variants[variant_count];
383 variant_vk->compile_args = args;
384 variant_vk->binding_base = binding_base;
385
386 if (shader->source_type == VKD3D_SHADER_SOURCE_D3D_BYTECODE)
387 {
388 shader_desc.byte_code = shader->function;
389 shader_desc.byte_code_size = shader->functionLength;
390 }
391 else
392 {
393 shader_desc.byte_code = shader->byte_code;
394 shader_desc.byte_code_size = shader->byte_code_size;
395 }
396
397 if (!(variant_vk->vk_module = shader_spirv_compile_shader(context_vk, &shader_desc,
398 shader->source_type, shader_type, &args, bindings, so_desc)))
399 return NULL;
400 ++program_vk->variant_count;
401
402 return variant_vk;
403}
BOOL wined3d_array_reserve(void **elements, SIZE_T *capacity, SIZE_T count, SIZE_T size)
Definition: utils.c:6740
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
#define args
Definition: format.c:66
static void shader_spirv_compile_arguments_init(struct shader_spirv_compile_arguments *args, const struct wined3d_context *context, const struct wined3d_shader *shader, const struct wined3d_state *state, unsigned int sample_count)
Definition: shader_spirv.c:125
const struct wined3d_stream_output_desc * so_desc
Definition: shader_spirv.c:80
struct shader_spirv_compile_arguments compile_args
Definition: shader_spirv.c:79
VkSampleCountFlagBits sample_count
Definition: wined3d_vk.h:640
struct wined3d_context c
Definition: wined3d_vk.h:588
@ VKD3D_SHADER_SOURCE_D3D_BYTECODE

Referenced by shader_spirv_apply_draw_state().

◆ shader_spirv_free()

static void shader_spirv_free ( struct wined3d_device *  device,
struct wined3d_context *  context 
)
static

Definition at line 1087 of file shader_spirv.c.

1088{
1089 struct shader_spirv_priv *priv = device->shader_priv;
1090
1092 priv->fragment_pipe->free_private(device, context);
1093 priv->vertex_pipe->vp_free(device, context);
1094 free(priv);
1095}
static void shader_spirv_resource_bindings_cleanup(struct shader_spirv_resource_bindings *bindings)
Definition: shader_spirv.c:465

◆ shader_spirv_free_context_data()

static void shader_spirv_free_context_data ( struct wined3d_context *  context)
static

Definition at line 1102 of file shader_spirv.c.

1103{
1104}

◆ shader_spirv_get_caps()

static void shader_spirv_get_caps ( const struct wined3d_adapter *  adapter,
struct shader_caps *  caps 
)
static

Definition at line 1110 of file shader_spirv.c.

1111{
1112 memset(caps, 0, sizeof(*caps));
1113
1120
1123 caps->ps_1x_max_value = FLT_MAX;
1124 caps->varying_count = 0;
1126}
#define FLT_MAX
Definition: float.h:37
#define min(a, b)
Definition: monoChain.cc:55
unsigned int vs_version
unsigned int varying_count
unsigned int cs_version
unsigned int ps_uniform_count
unsigned int hs_version
unsigned int gs_version
unsigned int vs_uniform_count
unsigned int ps_version
unsigned int ds_version
unsigned int max_sm_hs
unsigned int max_sm_vs
unsigned int max_sm_ps
unsigned int max_sm_cs
unsigned int max_sm_ds
unsigned int max_sm_gs
#define WINED3D_MAX_PS_CONSTS_F
Definition: wined3d.h:1605
#define WINED3D_MAX_VS_CONSTS_F
Definition: wined3d.h:1604
#define WINED3D_SHADER_CAP_FULL_FFP_VARYINGS

◆ shader_spirv_handle_instruction()

static void shader_spirv_handle_instruction ( const struct wined3d_shader_instruction *  ins)
static

Definition at line 121 of file shader_spirv.c.

122{
123}

◆ shader_spirv_init_compile_args()

static void shader_spirv_init_compile_args ( const struct wined3d_vk_info *  vk_info,
struct wined3d_shader_spirv_compile_args *  args,
struct vkd3d_shader_interface_info *  vkd3d_interface,
enum vkd3d_shader_spirv_environment  environment,
enum wined3d_shader_type  shader_type,
enum vkd3d_shader_source_type  source_type,
const struct shader_spirv_compile_arguments *  compile_args,
const struct shader_spirv_resource_bindings *  bindings 
)
static

Definition at line 195 of file shader_spirv.c.

201{
202 unsigned int i;
203
204 memset(args, 0, sizeof(*args));
206 args->spirv_target.next = &args->parameter_info;
207 args->spirv_target.entry_point = "main";
208 args->spirv_target.environment = environment;
209
211 args->parameter_info.next = vkd3d_interface;
212
213 args->spirv_target.extensions = args->extensions;
214
216 args->extensions[args->spirv_target.extension_count++] = VKD3D_SHADER_SPIRV_EXTENSION_EXT_STENCIL_EXPORT;
217 assert(args->spirv_target.extension_count <= ARRAY_SIZE(args->extensions));
218
220 {
221 unsigned int rt_alpha_swizzle = compile_args->u.fs.args.rt_alpha_swizzle;
222
224
225 args->spirv_target.dual_source_blending = compile_args->u.fs.args.dual_source_blend;
226
227 for (i = 0; i < ARRAY_SIZE(args->ps_alpha_swizzle); ++i)
228 {
229 if (rt_alpha_swizzle && (1u << i))
230 args->ps_alpha_swizzle[i] = VKD3D_SHADER_SWIZZLE(W, X, Y, Z);
231 else
232 args->ps_alpha_swizzle[i] = VKD3D_SHADER_NO_SWIZZLE;
233 }
234
235 args->spirv_target.output_swizzles = args->ps_alpha_swizzle;
236 args->spirv_target.output_swizzle_count = ARRAY_SIZE(args->ps_alpha_swizzle);
237 }
239 {
240 if (source_type == VKD3D_SHADER_SOURCE_D3D_BYTECODE)
241 {
242 args->spirv_target.next = &args->varying_map;
243
245 args->varying_map.next = vkd3d_interface;
246 args->varying_map.varying_map = compile_args->u.vs.varying_map;
247 args->varying_map.varying_count = compile_args->u.vs.varying_count;
248 }
249 }
250}
#define Z(I)
#define Y(I)
#define assert(_expr)
Definition: assert.h:32
static void fill_ps_parameters(struct wined3d_shader_spirv_compile_args *vkd3d_args, const struct shader_spirv_compile_arguments *compile_args, uint32_t ffp_extra_binding)
Definition: shader_spirv.c:164
enum vkd3d_shader_spirv_environment environment
Definition: spirv.c:4841
Definition: polytest.cpp:36
BOOL supported[WINED3D_VK_EXT_COUNT]
Definition: wined3d_vk.h:261
@ VKD3D_SHADER_STRUCTURE_TYPE_PARAMETER_INFO
Definition: vkd3d_shader.h:114
@ VKD3D_SHADER_STRUCTURE_TYPE_VARYING_MAP_INFO
Definition: vkd3d_shader.h:104
@ VKD3D_SHADER_STRUCTURE_TYPE_SPIRV_TARGET_INFO
Definition: vkd3d_shader.h:76
@ VKD3D_SHADER_SPIRV_EXTENSION_EXT_STENCIL_EXPORT
#define VKD3D_SHADER_SWIZZLE(x, y, z, w)
#define VKD3D_SHADER_NO_SWIZZLE
@ WINED3D_VK_EXT_SHADER_STENCIL_EXPORT
Definition: wined3d_vk.h:244

Referenced by shader_spirv_compile_shader().

◆ shader_spirv_init_context_state()

static void shader_spirv_init_context_state ( struct wined3d_context *  context)
static

Definition at line 1106 of file shader_spirv.c.

1107{
1108}

◆ shader_spirv_init_shader_interface_vk()

static void shader_spirv_init_shader_interface_vk ( struct wined3d_shader_spirv_shader_interface *  iface,
const struct shader_spirv_resource_bindings *  b,
const struct wined3d_stream_output_desc *  so_desc 
)
static

Definition at line 252 of file shader_spirv.c.

254{
255 memset(iface, 0, sizeof(*iface));
257
258 if (so_desc)
259 {
261 iface->xfb_info.next = NULL;
262
263 iface->xfb_info.elements = (const struct vkd3d_shader_transform_feedback_element *)so_desc->elements;
264 iface->xfb_info.element_count = so_desc->element_count;
265 iface->xfb_info.buffer_strides = so_desc->buffer_strides;
266 iface->xfb_info.buffer_stride_count = so_desc->buffer_stride_count;
267
268 iface->vkd3d_interface.next = &iface->xfb_info;
269 }
270
271 iface->vkd3d_interface.bindings = b->bindings;
272 iface->vkd3d_interface.binding_count = b->binding_count;
273
274 iface->vkd3d_interface.uav_counters = b->uav_counters;
275 iface->vkd3d_interface.uav_counter_count = b->uav_counter_count;
276}
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
struct vkd3d_shader_interface_info vkd3d_interface
Definition: shader_spirv.c:117
struct vkd3d_shader_transform_feedback_info xfb_info
Definition: shader_spirv.c:118
unsigned int buffer_strides[WINED3D_MAX_STREAM_OUTPUT_BUFFERS]
Definition: wined3d.h:2123
unsigned int element_count
Definition: wined3d.h:2122
const struct wined3d_stream_output_element * elements
Definition: wined3d.h:2121
unsigned int buffer_stride_count
Definition: wined3d.h:2124
@ VKD3D_SHADER_STRUCTURE_TYPE_TRANSFORM_FEEDBACK_INFO
Definition: vkd3d_shader.h:78
@ VKD3D_SHADER_STRUCTURE_TYPE_INTERFACE_INFO
Definition: vkd3d_shader.h:70

Referenced by shader_spirv_compile_shader().

◆ shader_spirv_invalidate_compute_program()

static void shader_spirv_invalidate_compute_program ( struct wined3d_context_vk *  context_vk,
const struct shader_spirv_compute_program_vk *  program 
)
static

Definition at line 958 of file shader_spirv.c.

960{
961 if (context_vk->compute.vk_pipeline == program->vk_pipeline)
962 {
963 context_vk->c.shader_update_mask |= (1u << WINED3D_SHADER_TYPE_COMPUTE);
964 context_vk->compute.vk_pipeline = VK_NULL_HANDLE;
965 }
966}

Referenced by shader_spirv_invalidate_contexts_compute_program().

◆ shader_spirv_invalidate_contexts_compute_program()

static void shader_spirv_invalidate_contexts_compute_program ( struct wined3d_device *  device,
const struct shader_spirv_compute_program_vk *  program 
)
static

Definition at line 968 of file shader_spirv.c.

970{
971 unsigned int i;
972
973 for (i = 0; i < device->context_count; ++i)
974 {
976 }
977}
static void shader_spirv_invalidate_compute_program(struct wined3d_context_vk *context_vk, const struct shader_spirv_compute_program_vk *program)
Definition: shader_spirv.c:958

Referenced by shader_spirv_destroy_compute_vk().

◆ shader_spirv_invalidate_contexts_graphics_program_variant()

static void shader_spirv_invalidate_contexts_graphics_program_variant ( struct wined3d_device *  device,
const struct shader_spirv_graphics_program_variant_vk *  variant 
)
static

Definition at line 994 of file shader_spirv.c.

996{
997 unsigned int i;
998
999 for (i = 0; i < device->context_count; ++i)
1000 {
1002 }
1003}
static void shader_spirv_invalidate_graphics_program_variant(struct wined3d_context_vk *context_vk, const struct shader_spirv_graphics_program_variant_vk *variant)
Definition: shader_spirv.c:979

Referenced by shader_spirv_destroy().

◆ shader_spirv_invalidate_graphics_program_variant()

static void shader_spirv_invalidate_graphics_program_variant ( struct wined3d_context_vk *  context_vk,
const struct shader_spirv_graphics_program_variant_vk *  variant 
)
static

Definition at line 979 of file shader_spirv.c.

981{
983
985 {
986 if (context_vk->graphics.vk_modules[shader_type] != variant->vk_module)
987 continue;
988
989 context_vk->graphics.vk_modules[shader_type] = VK_NULL_HANDLE;
990 context_vk->c.shader_update_mask |= (1u << shader_type);
991 }
992}
@ WINED3D_SHADER_TYPE_GRAPHICS_COUNT
Definition: wined3d.h:846

Referenced by shader_spirv_invalidate_contexts_graphics_program_variant().

◆ shader_spirv_precompile()

static void shader_spirv_precompile ( void *  shader_priv,
struct wined3d_shader *  shader 
)
static

Definition at line 824 of file shader_spirv.c.

825{
826 struct shader_spirv_graphics_program_vk *program_vk;
827
828 TRACE("shader_priv %p, shader %p.\n", shader_priv, shader);
829
830 if (shader->reg_maps.shader_version.type == WINED3D_SHADER_TYPE_COMPUTE)
831 {
833 return;
834 }
835
836 if (!(program_vk = shader->backend_data))
837 {
838 if (!(program_vk = calloc(1, sizeof(*program_vk))))
839 ERR("Failed to allocate program.\n");
840 shader->backend_data = program_vk;
841 }
842
844}
#define calloc
Definition: rosglue.h:14
static void shader_spirv_scan_shader(struct wined3d_shader *shader, struct vkd3d_shader_scan_descriptor_info *descriptor_info, struct vkd3d_shader_scan_signature_info *signature_info)
Definition: shader_spirv.c:755
static void shader_spirv_precompile_compute(struct wined3d_shader *shader)
Definition: shader_spirv.c:810
#define TRACE(s)
Definition: solgame.cpp:4

◆ shader_spirv_precompile_compute()

static void shader_spirv_precompile_compute ( struct wined3d_shader *  shader)
static

Definition at line 810 of file shader_spirv.c.

811{
812 struct shader_spirv_compute_program_vk *program_vk;
813
814 if (!(program_vk = shader->backend_data))
815 {
816 if (!(program_vk = calloc(1, sizeof(*program_vk))))
817 ERR("Failed to allocate program.\n");
818 shader->backend_data = program_vk;
819 }
820
822}
struct vkd3d_shader_scan_descriptor_info descriptor_info
Definition: shader_spirv.c:102

Referenced by shader_spirv_precompile().

◆ shader_spirv_resource_bindings_add_binding()

static bool shader_spirv_resource_bindings_add_binding ( struct shader_spirv_resource_bindings *  bindings,
enum vkd3d_shader_descriptor_type  vkd3d_type,
VkDescriptorType  vk_type,
size_t  register_idx,
enum vkd3d_shader_visibility  vkd3d_visibility,
VkShaderStageFlagBits  vk_stage,
uint32_t  flags,
size_t *  binding_idx 
)
static

Definition at line 493 of file shader_spirv.c.

497{
498 SIZE_T binding_count = bindings->binding_count;
500
501 if (!wined3d_array_reserve((void **)&bindings->bindings, &bindings->bindings_size,
502 binding_count + 1, sizeof(*bindings->bindings)))
503 return false;
504
505 if (!shader_spirv_resource_bindings_add_vk_binding(bindings, vk_type, vk_stage, binding_idx))
506 return false;
507
508 binding = &bindings->bindings[binding_count];
509 binding->type = vkd3d_type;
510 binding->register_space = 0;
511 binding->register_index = register_idx;
512 binding->shader_visibility = vkd3d_visibility;
513 binding->flags = flags;
514 binding->binding.set = 0;
515 binding->binding.binding = *binding_idx;
516 binding->binding.count = 1;
517 ++bindings->binding_count;
518
519 return true;
520}
GLbitfield flags
Definition: glext.h:7161
static RPC_BINDING_HANDLE binding
Definition: server.c:166
static bool shader_spirv_resource_bindings_add_vk_binding(struct shader_spirv_resource_bindings *bindings, VkDescriptorType vk_type, VkShaderStageFlagBits vk_stage, size_t *binding_idx)
Definition: shader_spirv.c:471
enum vkd3d_primitive_type vkd3d_type
Definition: tpf.c:725
ULONG_PTR SIZE_T
Definition: typedefs.h:80

Referenced by shader_spirv_resource_bindings_init().

◆ shader_spirv_resource_bindings_add_uav_counter_binding()

static bool shader_spirv_resource_bindings_add_uav_counter_binding ( struct shader_spirv_resource_bindings *  bindings,
size_t  register_idx,
enum vkd3d_shader_visibility  vkd3d_visibility,
VkShaderStageFlagBits  vk_stage,
size_t *  binding_idx 
)
static

Definition at line 522 of file shader_spirv.c.

525{
526 SIZE_T uav_counter_count = bindings->uav_counter_count;
528
529 if (uav_counter_count >= ARRAY_SIZE(bindings->uav_counters))
530 return false;
531
533 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, vk_stage, binding_idx))
534 return false;
535
536 counter = &bindings->uav_counters[uav_counter_count];
537 counter->register_space = 0;
538 counter->register_index = register_idx;
539 counter->shader_visibility = vkd3d_visibility;
540 counter->binding.set = 0;
541 counter->binding.binding = *binding_idx;
542 counter->binding.count = 1;
543 counter->offset = 0;
544 ++bindings->uav_counter_count;
545
546 return true;
547}
struct vkd3d_shader_uav_counter_binding uav_counters[MAX_UNORDERED_ACCESS_VIEWS]
Definition: shader_spirv.c:38
@ VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
Definition: vulkan.h:2469

Referenced by shader_spirv_resource_bindings_init().

◆ shader_spirv_resource_bindings_add_vk_binding()

static bool shader_spirv_resource_bindings_add_vk_binding ( struct shader_spirv_resource_bindings *  bindings,
VkDescriptorType  vk_type,
VkShaderStageFlagBits  vk_stage,
size_t *  binding_idx 
)
static

Definition at line 471 of file shader_spirv.c.

473{
474 SIZE_T binding_count = bindings->vk_binding_count;
476
477 if (!wined3d_array_reserve((void **)&bindings->vk_bindings, &bindings->vk_bindings_size,
478 binding_count + 1, sizeof(*bindings->vk_bindings)))
479 return false;
480
481 *binding_idx = binding_count;
482 binding = &bindings->vk_bindings[binding_count];
483 binding->binding = binding_count;
484 binding->descriptorType = vk_type;
485 binding->descriptorCount = 1;
486 binding->stageFlags = vk_stage;
487 binding->pImmutableSamplers = NULL;
488 ++bindings->vk_binding_count;
489
490 return true;
491}

Referenced by shader_spirv_resource_bindings_add_binding(), and shader_spirv_resource_bindings_add_uav_counter_binding().

◆ shader_spirv_resource_bindings_cleanup()

static void shader_spirv_resource_bindings_cleanup ( struct shader_spirv_resource_bindings *  bindings)
static

Definition at line 465 of file shader_spirv.c.

466{
467 free(bindings->vk_bindings);
468 free(bindings->bindings);
469}

Referenced by shader_spirv_free().

◆ shader_spirv_resource_bindings_init()

static bool shader_spirv_resource_bindings_init ( struct shader_spirv_resource_bindings *  bindings,
struct wined3d_shader_resource_bindings *  wined3d_bindings,
const struct wined3d_state *  state,
uint32_t  shader_mask 
)
static

Definition at line 649 of file shader_spirv.c.

652{
653 const struct vkd3d_shader_scan_descriptor_info *descriptor_info;
654 enum wined3d_shader_descriptor_type wined3d_type;
655 enum vkd3d_shader_visibility shader_visibility;
657 VkDescriptorType vk_descriptor_type;
658 VkShaderStageFlagBits vk_stage;
659 struct wined3d_shader *shader;
660 size_t binding_idx;
661 unsigned int i;
662
663 bindings->binding_count = 0;
664 bindings->uav_counter_count = 0;
665 bindings->vk_binding_count = 0;
667 wined3d_bindings->count = 0;
668
670 {
671 bindings->binding_base[shader_type] = bindings->vk_binding_count;
672
673 if (!(shader_mask & (1u << shader_type)) || !(shader = state->shader[shader_type]))
674 continue;
675
677 {
678 descriptor_info = &((struct shader_spirv_compute_program_vk *)shader->backend_data)->descriptor_info;
679 }
680 else
681 {
682 descriptor_info = &((struct shader_spirv_graphics_program_vk *)shader->backend_data)->descriptor_info;
685 }
686
689
690 for (i = 0; i < descriptor_info->descriptor_count; ++i)
691 {
692 const struct vkd3d_shader_descriptor_info *d = &descriptor_info->descriptors[i];
694
695 if (d->register_space)
696 {
697 WARN("Unsupported register space %u.\n", d->register_space);
698 return false;
699 }
700
701 if (d->resource_type == VKD3D_SHADER_RESOURCE_BUFFER)
703 else
705
706 vk_descriptor_type = vk_descriptor_type_from_vkd3d(d->type, d->resource_type);
707 if (!shader_spirv_resource_bindings_add_binding(bindings, d->type, vk_descriptor_type,
708 d->register_index, shader_visibility, vk_stage, flags, &binding_idx))
709 return false;
710
711 wined3d_type = wined3d_descriptor_type_from_vkd3d(d->type);
713 wined3d_type, d->register_index, wined3d_shader_resource_type_from_vkd3d(d->resource_type),
714 wined3d_data_type_from_vkd3d(d->resource_data_type), binding_idx))
715 return false;
716
719 {
721 d->register_index, shader_visibility, vk_stage, &binding_idx))
722 return false;
726 return false;
727 }
728 }
729
730 /* vkd3d-shader doesn't scan the uniform buffers we use for parameters.
731 * It can't really be reasonably modified to do so either, because
732 * parameters are specified in terms of the destination environment
733 * (SPIRV binding set and index). Add them manually here.
734 *
735 * Note that vkd3d-shader will ignore the extra binding specified in
736 * struct shader_spirv_resource_bindings, but we use it elsewhere. */
737
738 if (shader->source_type == VKD3D_SHADER_SOURCE_D3D_BYTECODE)
739 {
742 shader_visibility, vk_stage, VKD3D_SHADER_BINDING_FLAG_BUFFER, &binding_idx))
743 return false;
747 return false;
748 bindings->ffp_extra_binding[shader_type] = binding_idx;
749 }
750 }
751
752 return true;
753}
VkShaderStageFlagBits vk_shader_stage_from_wined3d(enum wined3d_shader_type shader_type)
Definition: context_vk.c:59
UINT32 uint32_t
Definition: types.h:75
enum vkd3d_shader_visibility vkd3d_shader_visibility_from_wined3d(enum wined3d_shader_type shader_type)
Definition: shader.c:309
#define d
Definition: ke_i.h:81
static bool wined3d_shader_resource_bindings_add_binding(struct wined3d_shader_resource_bindings *bindings, enum wined3d_shader_type shader_type, enum wined3d_shader_descriptor_type shader_descriptor_type, size_t resource_idx, enum wined3d_shader_resource_type resource_type, enum wined3d_data_type resource_data_type, size_t binding_idx)
Definition: shader_spirv.c:549
static bool shader_spirv_resource_bindings_add_binding(struct shader_spirv_resource_bindings *bindings, enum vkd3d_shader_descriptor_type vkd3d_type, VkDescriptorType vk_type, size_t register_idx, enum vkd3d_shader_visibility vkd3d_visibility, VkShaderStageFlagBits vk_stage, uint32_t flags, size_t *binding_idx)
Definition: shader_spirv.c:493
static VkDescriptorType vk_descriptor_type_from_vkd3d(enum vkd3d_shader_descriptor_type type, enum vkd3d_shader_resource_type resource_type)
Definition: shader_spirv.c:573
static bool shader_spirv_resource_bindings_add_uav_counter_binding(struct shader_spirv_resource_bindings *bindings, size_t register_idx, enum vkd3d_shader_visibility vkd3d_visibility, VkShaderStageFlagBits vk_stage, size_t *binding_idx)
Definition: shader_spirv.c:522
static enum wined3d_shader_resource_type wined3d_shader_resource_type_from_vkd3d(enum vkd3d_shader_resource_type t)
Definition: shader_spirv.c:622
static enum wined3d_data_type wined3d_data_type_from_vkd3d(enum vkd3d_shader_resource_data_type t)
Definition: shader_spirv.c:627
static enum wined3d_shader_descriptor_type wined3d_descriptor_type_from_vkd3d(enum vkd3d_shader_descriptor_type type)
Definition: shader_spirv.c:600
struct vkd3d_shader_descriptor_info * descriptors
@ VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_COUNTER
vkd3d_shader_visibility
Definition: vkd3d_shader.h:383
@ VKD3D_SHADER_DESCRIPTOR_TYPE_UAV
Definition: vkd3d_shader.h:430
@ VKD3D_SHADER_DESCRIPTOR_TYPE_CBV
Definition: vkd3d_shader.h:435
@ VKD3D_SHADER_RESOURCE_BUFFER
@ VKD3D_SHADER_BINDING_FLAG_IMAGE
Definition: vkd3d_shader.h:469
@ VKD3D_SHADER_BINDING_FLAG_BUFFER
Definition: vkd3d_shader.h:468
VkShaderStageFlagBits
Definition: vulkan.h:4873
VkDescriptorType
Definition: vulkan.h:2463
@ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
Definition: vulkan.h:2470
@ WINED3D_DATA_UINT
@ WINED3D_DATA_FLOAT
@ WINED3D_SHADER_RESOURCE_BUFFER
#define WINED3D_FFP_CONSTANTS_EXTRA_REGISTER
wined3d_shader_descriptor_type
Definition: wined3d_vk.h:556
@ WINED3D_SHADER_DESCRIPTOR_TYPE_UAV_COUNTER
Definition: wined3d_vk.h:560
@ WINED3D_SHADER_DESCRIPTOR_TYPE_CBV
Definition: wined3d_vk.h:557

Referenced by shader_spirv_apply_compute_state(), and shader_spirv_apply_draw_state().

◆ shader_spirv_scan_shader()

static void shader_spirv_scan_shader ( struct wined3d_shader *  shader,
struct vkd3d_shader_scan_descriptor_info *  descriptor_info,
struct vkd3d_shader_scan_signature_info *  signature_info 
)
static

Definition at line 755 of file shader_spirv.c.

758{
760 char *messages;
761 int ret;
762
763 memset(descriptor_info, 0, sizeof(*descriptor_info));
765
766 if (signature_info)
767 {
768 memset(signature_info, 0, sizeof(*signature_info));
770 descriptor_info->next = signature_info;
771 }
772
774 info.next = descriptor_info;
775 if (shader->source_type == VKD3D_SHADER_SOURCE_D3D_BYTECODE)
776 {
777 info.source.code = shader->function;
778 info.source.size = shader->functionLength;
779 }
780 else
781 {
782 info.source.code = shader->byte_code;
783 info.source.size = shader->byte_code_size;
784 }
785 info.source_type = shader->source_type;
787 info.options = spirv_compile_options;
788 info.option_count = ARRAY_SIZE(spirv_compile_options);
789 info.log_level = VKD3D_SHADER_LOG_WARNING;
790 info.source_name = NULL;
791
792 if ((ret = vkd3d_shader_scan(&info, &messages)) < 0)
793 ERR("Failed to scan shader, ret %d.\n", ret);
794 if (messages && *messages && FIXME_ON(d3d_shader))
795 {
796 const char *ptr, *end, *line;
797
798 FIXME("Shader log:\n");
799 ptr = messages;
800 end = ptr + strlen(ptr);
801 while ((line = wined3d_get_line(&ptr, end)))
802 {
803 FIXME(" %.*s", (int)(ptr - line), line);
804 }
805 FIXME("\n");
806 }
808}
enum api function
Definition: notification.c:71
enum vkd3d_shader_structure_type type
enum vkd3d_shader_structure_type type
VKD3D_SHADER_API int vkd3d_shader_scan(const struct vkd3d_shader_compile_info *compile_info, char **messages)
@ VKD3D_SHADER_STRUCTURE_TYPE_SCAN_DESCRIPTOR_INFO
Definition: vkd3d_shader.h:72
@ VKD3D_SHADER_STRUCTURE_TYPE_SCAN_SIGNATURE_INFO
Definition: vkd3d_shader.h:99

Referenced by shader_spirv_precompile(), and shader_spirv_precompile_compute().

◆ shader_spirv_update_float_pixel_constants()

static void shader_spirv_update_float_pixel_constants ( struct wined3d_device *  device,
UINT  start,
UINT  count 
)
static

Definition at line 953 of file shader_spirv.c.

954{
955 WARN("Not implemented.\n");
956}

◆ shader_spirv_update_float_vertex_constants()

static void shader_spirv_update_float_vertex_constants ( struct wined3d_device *  device,
UINT  start,
UINT  count 
)
static

Definition at line 948 of file shader_spirv.c.

949{
950 WARN("Not implemented.\n");
951}

◆ spirv_fragment_pipe_vk_fp_alloc()

static void * spirv_fragment_pipe_vk_fp_alloc ( const struct wined3d_shader_backend_ops *  shader_backend,
void *  shader_priv 
)
static

Definition at line 1254 of file shader_spirv.c.

1255{
1256 if (shader_backend != &spirv_shader_backend_vk)
1257 {
1258 FIXME("SPIR-V fragment pipe without SPIR-V shader backend not implemented.\n");
1259 return NULL;
1260 }
1261
1262 return shader_priv;
1263}

◆ spirv_fragment_pipe_vk_fp_alloc_context_data()

static BOOL spirv_fragment_pipe_vk_fp_alloc_context_data ( struct wined3d_context *  context)
static

Definition at line 1270 of file shader_spirv.c.

1271{
1272 return TRUE;
1273}

◆ spirv_fragment_pipe_vk_fp_apply_draw_state()

static void spirv_fragment_pipe_vk_fp_apply_draw_state ( struct wined3d_context *  context,
const struct wined3d_state *  state 
)
static

Definition at line 1232 of file shader_spirv.c.

1234{
1235 /* Nothing to do. */
1236}

◆ spirv_fragment_pipe_vk_fp_disable()

static void spirv_fragment_pipe_vk_fp_disable ( const struct wined3d_context *  context)
static

Definition at line 1238 of file shader_spirv.c.

1239{
1240 /* Nothing to do. */
1241}

◆ spirv_fragment_pipe_vk_fp_free()

static void spirv_fragment_pipe_vk_fp_free ( struct wined3d_device *  device,
struct wined3d_context *  context 
)
static

Definition at line 1265 of file shader_spirv.c.

1266{
1267 /* Nothing to do. */
1268}

◆ spirv_fragment_pipe_vk_fp_free_context_data()

static void spirv_fragment_pipe_vk_fp_free_context_data ( struct wined3d_context *  context)
static

Definition at line 1275 of file shader_spirv.c.

1276{
1277 /* Nothing to do. */
1278}

◆ spirv_fragment_pipe_vk_fp_get_caps()

static void spirv_fragment_pipe_vk_fp_get_caps ( const struct wined3d_adapter *  adapter,
struct fragment_caps *  caps 
)
static

Definition at line 1243 of file shader_spirv.c.

1244{
1245 memset(caps, 0, sizeof(*caps));
1247}
unsigned int max_blend_stages
#define WINED3D_MAX_FFP_TEXTURES
Definition: wined3d.h:1597

◆ spirv_fragment_pipe_vk_fp_get_emul_mask()

static unsigned int spirv_fragment_pipe_vk_fp_get_emul_mask ( const struct wined3d_adapter *  adapter)
static

Definition at line 1249 of file shader_spirv.c.

1250{
1251 return 0;
1252}

◆ spirv_vertex_pipe_vk_vp_alloc()

static void * spirv_vertex_pipe_vk_vp_alloc ( const struct wined3d_shader_backend_ops *  shader_backend,
void *  shader_priv 
)
static

Definition at line 1189 of file shader_spirv.c.

1190{
1191 if (shader_backend != &spirv_shader_backend_vk)
1192 {
1193 FIXME("SPIR-V vertex pipe without SPIR-V shader backend not implemented.\n");
1194 return NULL;
1195 }
1196
1197 return shader_priv;
1198}

◆ spirv_vertex_pipe_vk_vp_apply_draw_state()

static void spirv_vertex_pipe_vk_vp_apply_draw_state ( struct wined3d_context *  context,
const struct wined3d_state *  state 
)
static

Definition at line 1168 of file shader_spirv.c.

1169{
1170 /* Nothing to do. */
1171}

◆ spirv_vertex_pipe_vk_vp_disable()

static void spirv_vertex_pipe_vk_vp_disable ( const struct wined3d_context *  context)
static

Definition at line 1173 of file shader_spirv.c.

1174{
1175 /* Nothing to do. */
1176}

◆ spirv_vertex_pipe_vk_vp_free()

static void spirv_vertex_pipe_vk_vp_free ( struct wined3d_device *  device,
struct wined3d_context *  context 
)
static

Definition at line 1200 of file shader_spirv.c.

1201{
1202 /* Nothing to do. */
1203}

◆ spirv_vertex_pipe_vk_vp_get_caps()

static void spirv_vertex_pipe_vk_vp_get_caps ( const struct wined3d_adapter *  adapter,
struct wined3d_vertex_caps *  caps 
)
static

Definition at line 1178 of file shader_spirv.c.

1179{
1180 memset(caps, 0, sizeof(*caps));
1181 caps->emulated_flatshading = true;
1182}

◆ spirv_vertex_pipe_vk_vp_get_emul_mask()

static unsigned int spirv_vertex_pipe_vk_vp_get_emul_mask ( const struct wined3d_adapter *  adapter)
static

Definition at line 1184 of file shader_spirv.c.

1185{
1186 return 0;
1187}

◆ vk_descriptor_type_from_vkd3d()

static VkDescriptorType vk_descriptor_type_from_vkd3d ( enum vkd3d_shader_descriptor_type  type,
enum vkd3d_shader_resource_type  resource_type 
)
static

Definition at line 573 of file shader_spirv.c.

575{
576 switch (type)
577 {
580
582 if (resource_type == VKD3D_SHADER_RESOURCE_BUFFER)
585
587 if (resource_type == VKD3D_SHADER_RESOURCE_BUFFER)
590
593
594 default:
595 FIXME("Unhandled descriptor type %#x.\n", type);
596 return ~0u;
597 }
598}
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
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
@ VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER
Definition: vkd3d_shader.h:440
@ VKD3D_SHADER_DESCRIPTOR_TYPE_SRV
Definition: vkd3d_shader.h:425
@ VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
Definition: vulkan.h:2466
@ VK_DESCRIPTOR_TYPE_SAMPLER
Definition: vulkan.h:2464
@ VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
Definition: vulkan.h:2468
@ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
Definition: vulkan.h:2467

Referenced by shader_spirv_resource_bindings_init().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( d3d_shader  )

◆ wined3d_data_type_from_vkd3d()

static enum wined3d_data_type wined3d_data_type_from_vkd3d ( enum vkd3d_shader_resource_data_type  t)
static

Definition at line 627 of file shader_spirv.c.

628{
629 switch (t)
630 {
632 return WINED3D_DATA_UNORM;
634 return WINED3D_DATA_SNORM;
636 return WINED3D_DATA_INT;
638 return WINED3D_DATA_UINT;
640 return WINED3D_DATA_FLOAT;
642 return WINED3D_DATA_UINT;
643 default:
644 FIXME("Unhandled resource data type %#x.\n", t);
645 return WINED3D_DATA_FLOAT;
646 }
647}
GLdouble GLdouble t
Definition: gl.h:2047
@ VKD3D_SHADER_RESOURCE_DATA_MIXED
@ VKD3D_SHADER_RESOURCE_DATA_SNORM
@ VKD3D_SHADER_RESOURCE_DATA_UINT
@ VKD3D_SHADER_RESOURCE_DATA_FLOAT
@ VKD3D_SHADER_RESOURCE_DATA_UNORM
@ VKD3D_SHADER_RESOURCE_DATA_INT
@ WINED3D_DATA_INT
@ WINED3D_DATA_SNORM
@ WINED3D_DATA_UNORM

Referenced by shader_spirv_resource_bindings_init().

◆ wined3d_descriptor_type_from_vkd3d()

static enum wined3d_shader_descriptor_type wined3d_descriptor_type_from_vkd3d ( enum vkd3d_shader_descriptor_type  type)
static

Definition at line 600 of file shader_spirv.c.

601{
602 switch (type)
603 {
606
609
612
615
616 default:
617 FIXME("Unhandled descriptor type %#x.\n", type);
618 return ~0u;
619 }
620}
@ WINED3D_SHADER_DESCRIPTOR_TYPE_UAV
Definition: wined3d_vk.h:559
@ WINED3D_SHADER_DESCRIPTOR_TYPE_SRV
Definition: wined3d_vk.h:558
@ WINED3D_SHADER_DESCRIPTOR_TYPE_SAMPLER
Definition: wined3d_vk.h:561

Referenced by shader_spirv_resource_bindings_init().

◆ wined3d_shader_resource_bindings_add_binding()

static bool wined3d_shader_resource_bindings_add_binding ( struct wined3d_shader_resource_bindings *  bindings,
enum wined3d_shader_type  shader_type,
enum wined3d_shader_descriptor_type  shader_descriptor_type,
size_t  resource_idx,
enum wined3d_shader_resource_type  resource_type,
enum wined3d_data_type  resource_data_type,
size_t  binding_idx 
)
static

Definition at line 549 of file shader_spirv.c.

553{
555 SIZE_T binding_count = bindings->count;
556
557 if (!wined3d_array_reserve((void **)&bindings->bindings, &bindings->size,
558 binding_count + 1, sizeof(*bindings->bindings)))
559 return false;
560
561 binding = &bindings->bindings[binding_count];
562 binding->shader_type = shader_type;
563 binding->shader_descriptor_type = shader_descriptor_type;
564 binding->resource_idx = resource_idx;
565 binding->resource_type = resource_type;
566 binding->resource_data_type = resource_data_type;
567 binding->binding_idx = binding_idx;
568 ++bindings->count;
569
570 return true;
571}
enum wined3d_data_type resource_data_type
Definition: wined3d_vk.h:570
enum wined3d_shader_descriptor_type shader_descriptor_type
Definition: wined3d_vk.h:567
enum wined3d_shader_resource_type resource_type
Definition: wined3d_vk.h:569
struct wined3d_shader_resource_binding * bindings
Definition: wined3d_vk.h:576

Referenced by shader_spirv_resource_bindings_init().

◆ wined3d_shader_resource_type_from_vkd3d()

static enum wined3d_shader_resource_type wined3d_shader_resource_type_from_vkd3d ( enum vkd3d_shader_resource_type  t)
static

Definition at line 622 of file shader_spirv.c.

623{
624 return (enum wined3d_shader_resource_type)t;
625}
wined3d_shader_resource_type

Referenced by shader_spirv_resource_bindings_init().

◆ wined3d_spirv_fragment_pipe_init_vk()

const struct wined3d_fragment_pipe_ops * wined3d_spirv_fragment_pipe_init_vk ( void  )

Definition at line 1311 of file shader_spirv.c.

1312{
1313 return &spirv_fragment_pipe_vk;
1314}
static const struct wined3d_fragment_pipe_ops spirv_fragment_pipe_vk

Referenced by wined3d_adapter_vk_init().

◆ wined3d_spirv_shader_backend_init_vk()

const struct wined3d_shader_backend_ops * wined3d_spirv_shader_backend_init_vk ( void  )

Definition at line 1161 of file shader_spirv.c.

1162{
1163 TRACE("Using %s.\n", vkd3d_shader_get_version(NULL, NULL));
1164
1166}
VKD3D_SHADER_API const char * vkd3d_shader_get_version(unsigned int *major, unsigned int *minor)

Referenced by wined3d_adapter_vk_init().

◆ wined3d_spirv_vertex_pipe_init_vk()

const struct wined3d_vertex_pipe_ops * wined3d_spirv_vertex_pipe_init_vk ( void  )

Definition at line 1227 of file shader_spirv.c.

1228{
1229 return &spirv_vertex_pipe_vk;
1230}
static const struct wined3d_vertex_pipe_ops spirv_vertex_pipe_vk

Referenced by wined3d_adapter_vk_init().

Variable Documentation

◆ spirv_compile_options

const struct vkd3d_shader_compile_option spirv_compile_options[]
static
Initial value:

Definition at line 27 of file shader_spirv.c.

Referenced by shader_spirv_compile_shader(), and shader_spirv_scan_shader().

◆ spirv_fragment_pipe_vk

const struct wined3d_fragment_pipe_ops spirv_fragment_pipe_vk
static
Initial value:
=
{
.color_fixup_supported = shader_spirv_color_fixup_supported,
}
static void spirv_fragment_pipe_vk_fp_disable(const struct wined3d_context *context)
static void spirv_fragment_pipe_vk_fp_free_context_data(struct wined3d_context *context)
static void spirv_fragment_pipe_vk_fp_apply_draw_state(struct wined3d_context *context, const struct wined3d_state *state)
static unsigned int spirv_fragment_pipe_vk_fp_get_emul_mask(const struct wined3d_adapter *adapter)
static BOOL shader_spirv_color_fixup_supported(struct color_fixup_desc fixup)
static void spirv_fragment_pipe_vk_fp_free(struct wined3d_device *device, struct wined3d_context *context)
static void * spirv_fragment_pipe_vk_fp_alloc(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv)
static BOOL spirv_fragment_pipe_vk_fp_alloc_context_data(struct wined3d_context *context)
static const struct wined3d_state_entry_template spirv_fragment_pipe_vk_fp_states[]
static void spirv_fragment_pipe_vk_fp_get_caps(const struct wined3d_adapter *adapter, struct fragment_caps *caps)

Definition at line 1297 of file shader_spirv.c.

Referenced by wined3d_spirv_fragment_pipe_init_vk().

◆ spirv_fragment_pipe_vk_fp_states

const struct wined3d_state_entry_template spirv_fragment_pipe_vk_fp_states[]
static
Initial value:
=
{
{0},
}
void state_nop(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
Definition: ffp_gl.c:42
@ WINED3D_RS_FOGCOLOR
Definition: wined3d.h:317
@ WINED3D_RS_SHADEMODE
Definition: wined3d.h:295
@ WINED3D_RS_FOGEND
Definition: wined3d.h:320
@ WINED3D_RS_SRGBWRITEENABLE
Definition: wined3d.h:400
@ WINED3D_RS_FOGSTART
Definition: wined3d.h:319
@ WINED3D_RS_FOGTABLEMODE
Definition: wined3d.h:318
@ WINED3D_RS_FOGENABLE
Definition: wined3d.h:311
@ WINED3D_RS_POINTSPRITEENABLE
Definition: wined3d.h:364
@ WINED3D_RS_FOGVERTEXMODE
Definition: wined3d.h:350
@ WINED3D_RS_FOGDENSITY
Definition: wined3d.h:321
@ WINED3D_RS_ALPHATESTENABLE
Definition: wined3d.h:301
@ WINED3D_RS_ALPHAFUNC
Definition: wined3d.h:308
#define STATE_RENDER(a)

Definition at line 1280 of file shader_spirv.c.

◆ spirv_shader_backend_vk

static const struct wined3d_shader_backend_ops spirv_shader_backend_vk
static
Initial value:
=
{
.shader_handle_instruction = shader_spirv_handle_instruction,
.shader_precompile = shader_spirv_precompile,
.shader_apply_draw_state = shader_spirv_apply_draw_state,
.shader_apply_compute_state = shader_spirv_apply_compute_state,
.shader_disable = shader_spirv_disable,
.shader_update_float_vertex_constants = shader_spirv_update_float_vertex_constants,
.shader_update_float_pixel_constants = shader_spirv_update_float_pixel_constants,
.shader_destroy = shader_spirv_destroy,
.shader_alloc_private = shader_spirv_alloc,
.shader_free_private = shader_spirv_free,
.shader_allocate_context_data = shader_spirv_allocate_context_data,
.shader_free_context_data = shader_spirv_free_context_data,
.shader_init_context_state = shader_spirv_init_context_state,
.shader_get_caps = shader_spirv_get_caps,
.shader_color_fixup_supported = shader_spirv_color_fixup_supported,
.shader_compile = shader_spirv_compile,
}
static HRESULT shader_spirv_alloc(struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe, const struct wined3d_fragment_pipe_ops *fragment_pipe)
static void shader_spirv_free(struct wined3d_device *device, struct wined3d_context *context)
static BOOL shader_spirv_allocate_context_data(struct wined3d_context *context)
static void shader_spirv_handle_instruction(const struct wined3d_shader_instruction *ins)
Definition: shader_spirv.c:121
static void shader_spirv_apply_draw_state(void *shader_priv, struct wined3d_context *context, const struct wined3d_state *state)
Definition: shader_spirv.c:846
static void shader_spirv_free_context_data(struct wined3d_context *context)
static void shader_spirv_precompile(void *shader_priv, struct wined3d_shader *shader)
Definition: shader_spirv.c:824
static void shader_spirv_init_context_state(struct wined3d_context *context)
static void shader_spirv_update_float_vertex_constants(struct wined3d_device *device, UINT start, UINT count)
Definition: shader_spirv.c:948
static void shader_spirv_destroy(struct wined3d_shader *shader)
static void shader_spirv_apply_compute_state(void *shader_priv, struct wined3d_context *context, const struct wined3d_state *state)
Definition: shader_spirv.c:900
static void shader_spirv_get_caps(const struct wined3d_adapter *adapter, struct shader_caps *caps)
static void shader_spirv_disable(void *shader_priv, struct wined3d_context *context)
Definition: shader_spirv.c:931
static uint64_t shader_spirv_compile(struct wined3d_context *context, const struct wined3d_shader_desc *shader_desc, enum wined3d_shader_type shader_type)
static void shader_spirv_update_float_pixel_constants(struct wined3d_device *device, UINT start, UINT count)
Definition: shader_spirv.c:953

Definition at line 25 of file shader_spirv.c.

Referenced by shader_spirv_alloc(), spirv_fragment_pipe_vk_fp_alloc(), spirv_vertex_pipe_vk_vp_alloc(), and wined3d_spirv_shader_backend_init_vk().

◆ spirv_vertex_pipe_vk

const struct wined3d_vertex_pipe_ops spirv_vertex_pipe_vk
static
Initial value:
=
{
}
static void spirv_vertex_pipe_vk_vp_free(struct wined3d_device *device, struct wined3d_context *context)
static void spirv_vertex_pipe_vk_vp_disable(const struct wined3d_context *context)
static void * spirv_vertex_pipe_vk_vp_alloc(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv)
static void spirv_vertex_pipe_vk_vp_get_caps(const struct wined3d_adapter *adapter, struct wined3d_vertex_caps *caps)
static void spirv_vertex_pipe_vk_vp_apply_draw_state(struct wined3d_context *context, const struct wined3d_state *state)
static const struct wined3d_state_entry_template spirv_vertex_pipe_vk_vp_states[]
static unsigned int spirv_vertex_pipe_vk_vp_get_emul_mask(const struct wined3d_adapter *adapter)

Definition at line 1216 of file shader_spirv.c.

Referenced by wined3d_spirv_vertex_pipe_init_vk().

◆ spirv_vertex_pipe_vk_vp_states