ReactOS 0.4.17-dev-966-gf06eace
shader.c File Reference
#include <stdio.h>
#include <string.h>
#include "wined3d_private.h"
Include dependency graph for shader.c:

Go to the source code of this file.

Classes

struct  shader_none_priv
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (d3d_shader)
 
const char * debug_d3dshaderinstructionhandler (enum WINED3D_SHADER_INSTRUCTION_HANDLER handler_idx)
 
enum vkd3d_shader_visibility vkd3d_shader_visibility_from_wined3d (enum wined3d_shader_type shader_type)
 
static const char * shader_semantic_name_from_usage (enum wined3d_decl_usage usage)
 
static enum wined3d_decl_usage shader_usage_from_semantic_name (const char *name)
 
static enum wined3d_sysval_semantic shader_sysval_semantic_from_usage (enum wined3d_decl_usage usage)
 
BOOL shader_match_semantic (const char *semantic_name, enum wined3d_decl_usage usage)
 
static void shader_signature_from_semantic (struct wined3d_shader_signature_element *e, const struct wined3d_shader_semantic *s)
 
static void shader_signature_from_usage (struct wined3d_shader_signature_element *e, enum wined3d_decl_usage usage, UINT usage_idx, UINT reg_idx, DWORD write_mask)
 
static const struct wined3d_shader_frontend * shader_select_frontend (enum vkd3d_shader_source_type source_type)
 
void string_buffer_clear (struct wined3d_string_buffer *buffer)
 
BOOL string_buffer_init (struct wined3d_string_buffer *buffer)
 
void string_buffer_free (struct wined3d_string_buffer *buffer)
 
BOOL string_buffer_resize (struct wined3d_string_buffer *buffer, int rc)
 
int shader_vaddline (struct wined3d_string_buffer *buffer, const char *format, va_list args)
 
int shader_addline (struct wined3d_string_buffer *buffer, const char *format,...)
 
struct wined3d_string_buffer * string_buffer_get (struct wined3d_string_buffer_list *list)
 
static int string_buffer_vsprintf (struct wined3d_string_buffer *buffer, const char *format, va_list args)
 
void string_buffer_sprintf (struct wined3d_string_buffer *buffer, const char *format,...)
 
void string_buffer_release (struct wined3d_string_buffer_list *list, struct wined3d_string_buffer *buffer)
 
void string_buffer_list_init (struct wined3d_string_buffer_list *list)
 
void string_buffer_list_cleanup (struct wined3d_string_buffer_list *list)
 
static void shader_delete_constant_list (struct list *clist)
 
static void shader_set_limits (struct wined3d_shader *shader)
 
static BOOL shader_record_register_usage (struct wined3d_shader *shader, struct wined3d_shader_reg_maps *reg_maps, const struct wined3d_shader_register *reg, enum wined3d_shader_type shader_type, unsigned int constf_size)
 
static void shader_record_sample (struct wined3d_shader_reg_maps *reg_maps, unsigned int resource_idx, unsigned int sampler_idx, unsigned int bind_idx)
 
static unsigned int get_instr_extra_regcount (enum WINED3D_SHADER_INSTRUCTION_HANDLER instr, unsigned int param)
 
static HRESULT shader_reg_maps_add_tgsm (struct wined3d_shader_reg_maps *reg_maps, unsigned int register_idx, unsigned int size, unsigned int stride)
 
static HRESULT shader_record_shader_phase (struct wined3d_shader *shader, struct wined3d_shader_phase **current_phase, const struct wined3d_shader_instruction *ins, const DWORD *current_instruction_ptr, const DWORD *previous_instruction_ptr)
 
static HRESULT shader_calculate_clip_or_cull_distance_mask (const struct wined3d_shader_signature_element *e, unsigned int *mask)
 
static void wined3d_insert_interpolation_mode (uint32_t *packed_interpolation_mode, unsigned int register_idx, enum wined3d_shader_interpolation_mode mode)
 
static HRESULT shader_scan_output_signature (struct wined3d_shader *shader)
 
static HRESULT shader_get_registers_used (struct wined3d_shader *shader, DWORD constf_size)
 
static void shader_cleanup_reg_maps (struct wined3d_shader_reg_maps *reg_maps)
 
unsigned int shader_find_free_input_register (const struct wined3d_shader_reg_maps *reg_maps, unsigned int max)
 
HRESULT shader_generate_code (const struct wined3d_shader *shader, struct wined3d_string_buffer *buffer, const struct wined3d_shader_reg_maps *reg_maps, void *backend_ctx, const DWORD *start, const DWORD *end)
 
static void shader_cleanup (struct wined3d_shader *shader)
 
static void shader_none_handle_instruction (const struct wined3d_shader_instruction *ins)
 
static void shader_none_precompile (void *shader_priv, struct wined3d_shader *shader)
 
static void shader_none_apply_compute_state (void *shader_priv, struct wined3d_context *context, const struct wined3d_state *state)
 
static void shader_none_update_float_vertex_constants (struct wined3d_device *device, UINT start, UINT count)
 
static void shader_none_update_float_pixel_constants (struct wined3d_device *device, UINT start, UINT count)
 
static void shader_none_destroy (struct wined3d_shader *shader)
 
static void shader_none_free_context_data (struct wined3d_context *context)
 
static void shader_none_init_context_state (struct wined3d_context *context)
 
static void shader_none_apply_draw_state (void *shader_priv, struct wined3d_context *context, const struct wined3d_state *state)
 
static void shader_none_disable (void *shader_priv, struct wined3d_context *context)
 
static HRESULT shader_none_alloc (struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe, const struct wined3d_fragment_pipe_ops *fragment_pipe)
 
static void shader_none_free (struct wined3d_device *device, struct wined3d_context *context)
 
static BOOL shader_none_allocate_context_data (struct wined3d_context *context)
 
static void shader_none_get_caps (const struct wined3d_adapter *adapter, struct shader_caps *caps)
 
static BOOL shader_none_color_fixup_supported (struct color_fixup_desc fixup)
 
static uint64_t shader_none_shader_compile (struct wined3d_context *context, const struct wined3d_shader_desc *shader_desc, enum wined3d_shader_type shader_type)
 
static unsigned int shader_max_version_from_feature_level (enum wined3d_feature_level level)
 
static struct wined3d_shader_signature_element * shader_find_signature_element (const struct wined3d_shader_signature *s, unsigned int stream_idx, const char *semantic_name, unsigned int semantic_idx)
 
BOOL shader_get_stream_output_register_info (const struct wined3d_shader *shader, const struct wined3d_stream_output_element *so_element, unsigned int *register_idx, unsigned int *component_idx)
 
static HRESULT geometry_shader_init_so_desc (struct wined3d_geometry_shader *gs, struct wined3d_device *device, const struct wined3d_stream_output_desc *so_desc)
 
static HRESULT geometry_shader_init_stream_output (struct wined3d_shader *shader, const struct wined3d_stream_output_desc *so_desc)
 
static void shader_trace (const void *code, size_t size, enum vkd3d_shader_source_type source_type)
 
static HRESULT shader_set_function (struct wined3d_shader *shader, const struct wined3d_shader_desc *desc, enum wined3d_shader_type type, const struct wined3d_stream_output_desc *so_desc, unsigned int float_const_count)
 
ULONG CDECL wined3d_shader_incref (struct wined3d_shader *shader)
 
static void wined3d_shader_init_object (void *object)
 
static void wined3d_shader_destroy_object (void *object)
 
ULONG CDECL wined3d_shader_decref (struct wined3d_shader *shader)
 
void *CDECL wined3d_shader_get_parent (const struct wined3d_shader *shader)
 
HRESULT CDECL wined3d_shader_get_byte_code (const struct wined3d_shader *shader, void *byte_code, UINT *byte_code_size)
 
HRESULT CDECL wined3d_shader_set_local_constants_float (struct wined3d_shader *shader, UINT start_idx, const float *src_data, UINT count)
 
static void init_interpolation_compile_args (uint32_t *interpolation_args, const struct wined3d_shader *pixel_shader, const struct wined3d_d3d_info *d3d_info)
 
void find_vs_compile_args (const struct wined3d_state *state, const struct wined3d_shader *shader, struct vs_compile_args *args, const struct wined3d_context *context)
 
static BOOL match_usage (BYTE usage1, BYTE usage_idx1, BYTE usage2, BYTE usage_idx2)
 
bool vshader_get_input (const struct wined3d_shader *shader, uint8_t usage_req, uint8_t usage_idx_req, unsigned int *regnum)
 
static void shader_init (struct wined3d_shader *shader, struct wined3d_device *device, void *parent, const struct wined3d_parent_ops *parent_ops)
 
static HRESULT vertex_shader_init (struct wined3d_shader *shader, struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
 
static HRESULT geometry_shader_init (struct wined3d_shader *shader, struct wined3d_device *device, const struct wined3d_shader_desc *desc, const struct wined3d_stream_output_desc *so_desc, void *parent, const struct wined3d_parent_ops *parent_ops)
 
void find_ds_compile_args (const struct wined3d_state *state, const struct wined3d_shader *shader, struct ds_compile_args *args, const struct wined3d_context *context)
 
void find_gs_compile_args (const struct wined3d_state *state, const struct wined3d_shader *shader, struct gs_compile_args *args, const struct wined3d_context *context)
 
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)
 
static HRESULT pixel_shader_init (struct wined3d_shader *shader, struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
 
enum wined3d_shader_resource_type pixelshader_get_resource_type (const struct wined3d_shader_reg_maps *reg_maps, unsigned int resource_idx, DWORD tex_types)
 
HRESULT CDECL wined3d_shader_create_cs (struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
 
HRESULT CDECL wined3d_shader_create_ds (struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
 
HRESULT CDECL wined3d_shader_create_gs (struct wined3d_device *device, const struct wined3d_shader_desc *desc, const struct wined3d_stream_output_desc *so_desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
 
HRESULT CDECL wined3d_shader_create_hs (struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
 
HRESULT CDECL wined3d_shader_create_ps (struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
 
HRESULT CDECL wined3d_shader_create_vs (struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
 
HRESULT wined3d_shader_create_ffp_vs (struct wined3d_device *device, const struct wined3d_ffp_vs_settings *settings, struct wined3d_shader **shader)
 
HRESULT wined3d_shader_create_ffp_ps (struct wined3d_device *device, const struct ffp_frag_settings *settings, struct wined3d_shader **shader)
 

Variables

const struct wined3d_vec4 wined3d_srgb_const []
 
static const char *const shader_opcode_names []
 
static const char *const semantic_names []
 
const struct wined3d_shader_backend_ops none_shader_backend
 

Function Documentation

◆ debug_d3dshaderinstructionhandler()

const char * debug_d3dshaderinstructionhandler ( enum WINED3D_SHADER_INSTRUCTION_HANDLER  handler_idx)

Definition at line 301 of file shader.c.

302{
303 if (handler_idx >= ARRAY_SIZE(shader_opcode_names))
304 return wine_dbg_sprintf("UNRECOGNIZED(%#x)", handler_idx);
305
306 return shader_opcode_names[handler_idx];
307}
#define ARRAY_SIZE(A)
Definition: main.h:20
static const char *const shader_opcode_names[]
Definition: shader.c:40
const char * wine_dbg_sprintf(const char *format,...)
Definition: compat.c:296

Referenced by shader_get_registers_used(), shader_glsl_binop(), shader_glsl_compare(), shader_glsl_handle_instruction(), shader_glsl_map2gl(), shader_glsl_sample(), shader_glsl_unary_op(), shader_record_shader_phase(), and shader_sm1_validate_instruction().

◆ find_ds_compile_args()

void find_ds_compile_args ( const struct wined3d_state *  state,
const struct wined3d_shader *  shader,
struct ds_compile_args *  args,
const struct wined3d_context *  context 
)

Definition at line 2838 of file shader.c.

2840{
2841 const struct wined3d_shader *geometry_shader = state->shader[WINED3D_SHADER_TYPE_GEOMETRY];
2842 const struct wined3d_shader *pixel_shader = state->shader[WINED3D_SHADER_TYPE_PIXEL];
2843 const struct wined3d_shader *hull_shader = state->shader[WINED3D_SHADER_TYPE_HULL];
2844
2845 args->tessellator_output_primitive = hull_shader->u.hs.tessellator_output_primitive;
2846 args->tessellator_partitioning = hull_shader->u.hs.tessellator_partitioning;
2847
2848 args->output_count = geometry_shader ? geometry_shader->limits->packed_input
2849 : pixel_shader ? pixel_shader->limits->packed_input : shader->limits->packed_output;
2850 args->next_shader_type = geometry_shader ? WINED3D_SHADER_TYPE_GEOMETRY : WINED3D_SHADER_TYPE_PIXEL;
2851
2852 init_interpolation_compile_args(args->interpolation_mode,
2853 args->next_shader_type == WINED3D_SHADER_TYPE_PIXEL ? pixel_shader : NULL, context->d3d_info);
2854
2855 args->padding = 0;
2856}
static int state
Definition: maze.c:121
#define NULL
Definition: types.h:112
static void init_interpolation_compile_args(uint32_t *interpolation_args, const struct wined3d_shader *pixel_shader, const struct wined3d_d3d_info *d3d_info)
Definition: shader.c:2675
GLuint shader
Definition: glext.h:6030
Definition: match.c:390
Definition: http.c:7252
union wined3d_shader::@358 u
const struct wined3d_shader_limits * limits
struct wined3d_hull_shader hs
@ WINED3D_SHADER_TYPE_HULL
Definition: wined3d.h:844
@ WINED3D_SHADER_TYPE_PIXEL
Definition: wined3d.h:841
@ WINED3D_SHADER_TYPE_GEOMETRY
Definition: wined3d.h:843

Referenced by set_glsl_shader_program().

◆ find_gs_compile_args()

void find_gs_compile_args ( const struct wined3d_state *  state,
const struct wined3d_shader *  shader,
struct gs_compile_args *  args,
const struct wined3d_context *  context 
)

Definition at line 2858 of file shader.c.

2860{
2861 const struct wined3d_shader *pixel_shader = state->shader[WINED3D_SHADER_TYPE_PIXEL];
2862
2863 args->output_count = pixel_shader ? pixel_shader->limits->packed_input : shader->limits->packed_output;
2864
2865 if (!(args->primitive_type = shader->u.gs.input_type))
2866 args->primitive_type = state->primitive_type;
2867
2868 init_interpolation_compile_args(args->interpolation_mode, pixel_shader, context->d3d_info);
2869}

Referenced by set_glsl_shader_program().

◆ find_ps_compile_args()

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 at line 2871 of file shader.c.

2873{
2874 const struct wined3d_shader *vs = state->shader[WINED3D_SHADER_TYPE_VERTEX];
2875 const struct wined3d_d3d_info *d3d_info = context->d3d_info;
2877 struct wined3d_texture *texture;
2878 unsigned int i;
2879
2880 memset(args, 0, sizeof(*args)); /* FIXME: Make sure all bits are set. */
2881 if (!d3d_info->srgb_write_control && needs_srgb_write(d3d_info, state, &state->fb))
2882 {
2883 static unsigned int warned = 0;
2884
2885 args->srgb_correction = 1;
2886 if (state->blend_state && state->blend_state->desc.rt[0].enable && !warned++)
2887 WARN("Blending into a sRGB render target with no GL_ARB_framebuffer_sRGB "
2888 "support, expect rendering artifacts.\n");
2889 }
2890
2891 if (shader->reg_maps.shader_version.major == 1
2892 && shader->reg_maps.shader_version.minor <= 3)
2893 {
2894 for (i = 0; i < shader->limits->sampler; ++i)
2895 {
2897
2899 {
2900 uint32_t tex_transform = flags & ~WINED3D_TTFF_PROJECTED;
2901
2902 if (!vs || vs->is_ffp_vs)
2903 {
2904 enum wined3d_shader_resource_type resource_type = shader->reg_maps.resource_info[i].type;
2905 unsigned int j;
2906 unsigned int index = state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX];
2907 uint32_t max_valid = WINED3D_TTFF_COUNT4;
2908
2909 for (j = 0; j < state->vertex_declaration->element_count; ++j)
2910 {
2912 &state->vertex_declaration->elements[j];
2913
2915 && element->usage_idx == index)
2916 {
2917 max_valid = element->format->component_count;
2918 break;
2919 }
2920 }
2921 if (!tex_transform || tex_transform > max_valid)
2922 {
2923 WARN("Fixing up projected texture transform flags from %#x to %#x.\n",
2924 tex_transform, max_valid);
2925 tex_transform = max_valid;
2926 }
2927 if ((resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_1D && tex_transform > WINED3D_TTFF_COUNT1)
2928 || (resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_2D
2929 && tex_transform > WINED3D_TTFF_COUNT2)
2930 || (resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_3D
2931 && tex_transform > WINED3D_TTFF_COUNT3))
2932 tex_transform |= WINED3D_PSARGS_PROJECTED;
2933 else
2934 {
2935 WARN("Application requested projected texture with unsuitable texture coordinates.\n");
2936 WARN("(texture unit %u, transform flags %#x, sampler type %u).\n",
2937 i, tex_transform, resource_type);
2938 }
2939 }
2940 else
2942
2943 args->tex_transform |= tex_transform << i * WINED3D_PSARGS_TEXTRANSFORM_SHIFT;
2944 }
2945 }
2946 }
2947 if (shader->reg_maps.shader_version.major == 1
2948 && shader->reg_maps.shader_version.minor <= 4)
2949 {
2950 for (i = 0; i < shader->limits->sampler; ++i)
2951 {
2953
2954 if (!shader->reg_maps.resource_info[i].type)
2955 continue;
2956
2957 /* Treat unbound textures as 2D. The dummy texture will provide
2958 * the proper sample value. The tex_types bitmap defaults to
2959 * 2D because of the memset. */
2960 if (!(view = state->shader_resource_view[WINED3D_SHADER_TYPE_PIXEL][i]))
2961 continue;
2962 texture = texture_from_resource(view->resource);
2963
2964 switch (texture->resource.type)
2965 {
2966 case WINED3D_RTYPE_NONE:
2969 assert(0);
2970
2972 if (texture->resource.usage & WINED3DUSAGE_LEGACY_CUBEMAP)
2974 break;
2975
2978 break;
2979 }
2980
2981 args->tex_types |= (type << (i * WINED3D_PSARGS_TEXTYPE_SHIFT));
2982 }
2983 }
2984 else if (shader->reg_maps.shader_version.major <= 3)
2985 {
2986 for (i = 0; i < shader->limits->sampler; ++i)
2987 {
2988 enum wined3d_shader_resource_type resource_type;
2989 enum wined3d_shader_tex_types tex_type;
2990
2991 if (!(resource_type = shader->reg_maps.resource_info[i].type))
2992 continue;
2993
2994 switch (resource_type)
2995 {
2997 tex_type = WINED3D_SHADER_TEX_3D;
2998 break;
3000 tex_type = WINED3D_SHADER_TEX_CUBE;
3001 break;
3002 default:
3003 tex_type = WINED3D_SHADER_TEX_2D;
3004 break;
3005 }
3006
3007 if ((view = state->shader_resource_view[WINED3D_SHADER_TYPE_PIXEL][i]))
3008 {
3009 texture = texture_from_resource(view->resource);
3010 /* Star Wars: The Old Republic uses mismatched samplers for rendering water. */
3011 if (texture->resource.type == WINED3D_RTYPE_TEXTURE_2D
3012 && resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_3D
3013 && !(texture->resource.usage & WINED3DUSAGE_LEGACY_CUBEMAP))
3014 tex_type = WINED3D_SHADER_TEX_2D;
3015 else if (texture->resource.type == WINED3D_RTYPE_TEXTURE_3D
3016 && resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_2D)
3017 tex_type = WINED3D_SHADER_TEX_3D;
3018 }
3019 args->tex_types |= tex_type << i * WINED3D_PSARGS_TEXTYPE_SHIFT;
3020 }
3021 }
3022
3023 if (shader->reg_maps.shader_version.major >= 4)
3024 {
3025 /* In SM4+ we use dcl_sampler in order to determine if we should use shadow sampler. */
3026 args->shadow = 0;
3027 for (i = 0 ; i < WINED3D_MAX_FRAGMENT_SAMPLERS; ++i)
3028 args->color_fixup[i] = COLOR_FIXUP_IDENTITY;
3029 }
3030 else
3031 {
3032 for (i = 0; i < WINED3D_MAX_FRAGMENT_SAMPLERS; ++i)
3033 {
3034 if (!shader->reg_maps.resource_info[i].type)
3035 continue;
3036
3037 if (!(view = state->shader_resource_view[WINED3D_SHADER_TYPE_PIXEL][i]))
3038 {
3039 args->color_fixup[i] = COLOR_FIXUP_IDENTITY;
3040 continue;
3041 }
3042 texture = texture_from_resource(view->resource);
3043
3044 if (can_use_texture_swizzle(d3d_info, texture->resource.format))
3045 args->color_fixup[i] = COLOR_FIXUP_IDENTITY;
3046 else
3047 args->color_fixup[i] = texture->resource.format->color_fixup;
3048
3049 if (texture->resource.format_caps & WINED3D_FORMAT_CAP_SHADOW)
3050 args->shadow |= 1u << i;
3051 }
3052 }
3053
3054 if (shader->reg_maps.shader_version.major >= 3)
3055 {
3056 if (position_transformed)
3057 args->vp_mode = WINED3D_VP_MODE_NONE;
3058 else if (use_vs(state))
3059 args->vp_mode = WINED3D_VP_MODE_SHADER;
3060 else
3061 args->vp_mode = WINED3D_VP_MODE_FF;
3063 }
3064 else
3065 {
3066 args->vp_mode = WINED3D_VP_MODE_SHADER;
3067 if (state->render_states[WINED3D_RS_FOGENABLE])
3068 {
3069 switch (state->render_states[WINED3D_RS_FOGTABLEMODE])
3070 {
3071 case WINED3D_FOG_NONE:
3073 case WINED3D_FOG_EXP: args->fog = WINED3D_FFP_PS_FOG_EXP; break;
3074 case WINED3D_FOG_EXP2: args->fog = WINED3D_FFP_PS_FOG_EXP2; break;
3075 }
3076 }
3077 else
3078 {
3080 }
3081 }
3082
3083 if (!d3d_info->full_ffp_varyings)
3084 {
3085 const struct wined3d_shader *vs = state->shader[WINED3D_SHADER_TYPE_VERTEX];
3086
3087 args->texcoords_initialized = 0;
3088 for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i)
3089 {
3090 if (vs)
3091 {
3092 if (state->shader[WINED3D_SHADER_TYPE_VERTEX]->reg_maps.output_registers & (1u << i))
3093 args->texcoords_initialized |= 1u << i;
3094 }
3095 else
3096 {
3097 const struct wined3d_stream_info *si = &context->stream_info;
3098 unsigned int coord_idx = state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX];
3099
3100 if ((state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX] >> WINED3D_FFP_TCI_SHIFT)
3102 || (coord_idx < WINED3D_MAX_FFP_TEXTURES && (si->use_map & (1u << (WINED3D_FFP_TEXCOORD0 + coord_idx)))))
3103 args->texcoords_initialized |= 1u << i;
3104 }
3105 }
3106 }
3107 else
3108 {
3109 args->texcoords_initialized = wined3d_mask_from_size(WINED3D_MAX_FFP_TEXTURES);
3110 }
3111
3112 args->pointsprite = state->render_states[WINED3D_RS_POINTSPRITEENABLE]
3113 && state->primitive_type == WINED3D_PT_POINTLIST;
3114
3115 if (d3d_info->ffp_alpha_test)
3116 args->alpha_test_func = WINED3D_CMP_ALWAYS - 1;
3117 else
3118 args->alpha_test_func = (state->render_states[WINED3D_RS_ALPHATESTENABLE]
3120 : WINED3D_CMP_ALWAYS) - 1;
3121
3122 if (d3d_info->emulated_flatshading)
3123 args->flatshading = state->render_states[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT;
3124
3125 for (i = 0; i < ARRAY_SIZE(state->fb.render_targets); ++i)
3126 {
3127 struct wined3d_rendertarget_view *rtv = state->fb.render_targets[i];
3128 if (rtv && rtv->format->id == WINED3DFMT_A8_UNORM && !is_identity_fixup(rtv->format->color_fixup))
3129 args->rt_alpha_swizzle |= 1u << i;
3130 }
3131
3132 args->dual_source_blend = state->blend_state && state->blend_state->dual_source;
3133}
#define WARN(fmt,...)
Definition: precomp.h:61
UINT32 uint32_t
Definition: types.h:75
#define assert(_expr)
Definition: assert.h:32
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLenum GLuint texture
Definition: glext.h:6295
GLuint index
Definition: glext.h:6031
GLbitfield flags
Definition: glext.h:7161
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
static SYSTEM_INFO si
Definition: virtual.c:39
static vector_t * vs
Definition: server.c:146
#define memset(x, y, z)
Definition: compat.h:39
uint32_t full_ffp_varyings
uint32_t emulated_flatshading
uint32_t srgb_write_control
const struct wined3d_format * format
@ WINED3D_SHADE_FLAT
Definition: wined3d.h:488
@ WINED3D_FOG_LINEAR
Definition: wined3d.h:483
@ WINED3D_FOG_EXP
Definition: wined3d.h:481
@ WINED3D_FOG_NONE
Definition: wined3d.h:480
@ WINED3D_FOG_EXP2
Definition: wined3d.h:482
@ WINED3D_DECL_USAGE_TEXCOORD
Definition: wined3d.h:812
@ WINED3D_RS_SHADEMODE
Definition: wined3d.h:295
@ WINED3D_RS_FOGTABLEMODE
Definition: wined3d.h:318
@ WINED3D_RS_FOGENABLE
Definition: wined3d.h:311
@ WINED3D_RS_POINTSPRITEENABLE
Definition: wined3d.h:364
@ WINED3D_RS_ALPHATESTENABLE
Definition: wined3d.h:301
@ WINED3D_RS_ALPHAFUNC
Definition: wined3d.h:308
@ WINED3D_PT_POINTLIST
Definition: wined3d.h:76
#define WINED3DUSAGE_LEGACY_CUBEMAP
Definition: wined3d.h:934
@ WINED3D_RTYPE_TEXTURE_2D
Definition: wined3d.h:720
@ WINED3D_RTYPE_TEXTURE_1D
Definition: wined3d.h:719
@ WINED3D_RTYPE_NONE
Definition: wined3d.h:717
@ WINED3D_RTYPE_BUFFER
Definition: wined3d.h:718
@ WINED3D_RTYPE_TEXTURE_3D
Definition: wined3d.h:721
#define WINED3D_MAX_FRAGMENT_SAMPLERS
Definition: wined3d.h:1598
@ WINED3D_TSS_TEXCOORD_INDEX
Definition: wined3d.h:604
@ WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS
Definition: wined3d.h:607
@ WINED3DFMT_A8_UNORM
Definition: wined3d.h:222
@ WINED3D_CMP_ALWAYS
Definition: wined3d.h:468
@ WINED3D_TTFF_COUNT2
Definition: wined3d.h:620
@ WINED3D_TTFF_COUNT4
Definition: wined3d.h:622
@ WINED3D_TTFF_COUNT3
Definition: wined3d.h:621
@ WINED3D_TTFF_COUNT1
Definition: wined3d.h:619
@ WINED3D_TTFF_PROJECTED
Definition: wined3d.h:623
@ WINED3D_SHADER_TYPE_VERTEX
Definition: wined3d.h:842
#define WINED3D_MAX_FFP_TEXTURES
Definition: wined3d.h:1597
#define WINED3D_PSARGS_PROJECTED
@ WINED3D_FFP_TEXCOORD0
#define WINED3D_FFP_TCI_SHIFT
@ WINED3D_VP_MODE_NONE
@ WINED3D_VP_MODE_FF
@ WINED3D_VP_MODE_SHADER
static BOOL use_vs(const struct wined3d_state *state)
#define WINED3D_FORMAT_CAP_SHADOW
#define WINED3D_PSARGS_TEXTRANSFORM_SHIFT
#define WINED3D_FFP_TCI_MASK
wined3d_shader_resource_type
@ WINED3D_SHADER_RESOURCE_TEXTURE_3D
@ WINED3D_SHADER_RESOURCE_TEXTURE_2D
@ WINED3D_SHADER_RESOURCE_TEXTURE_CUBE
@ WINED3D_SHADER_RESOURCE_TEXTURE_1D
static enum wined3d_cmp_func wined3d_sanitize_cmp_func(enum wined3d_cmp_func func)
static BOOL can_use_texture_swizzle(const struct wined3d_d3d_info *d3d_info, const struct wined3d_format *format)
static uint32_t wined3d_mask_from_size(unsigned int size)
static const struct color_fixup_desc COLOR_FIXUP_IDENTITY
static BOOL is_identity_fixup(struct color_fixup_desc fixup)
#define WINED3D_PSARGS_TEXTYPE_SHIFT
static BOOL needs_srgb_write(const struct wined3d_d3d_info *d3d_info, const struct wined3d_state *state, const struct wined3d_fb_state *fb)
wined3d_shader_tex_types
@ WINED3D_SHADER_TEX_3D
@ WINED3D_SHADER_TEX_2D
@ WINED3D_SHADER_TEX_CUBE
@ WINED3D_FFP_PS_FOG_EXP
@ WINED3D_FFP_PS_FOG_OFF
@ WINED3D_FFP_PS_FOG_EXP2
@ WINED3D_FFP_PS_FOG_LINEAR
static struct wined3d_texture * texture_from_resource(struct wined3d_resource *resource)

Referenced by set_glsl_shader_program(), and shader_spirv_compile_arguments_init().

◆ find_vs_compile_args()

void find_vs_compile_args ( const struct wined3d_state *  state,
const struct wined3d_shader *  shader,
struct vs_compile_args *  args,
const struct wined3d_context *  context 
)

Definition at line 2689 of file shader.c.

2691{
2692 const struct wined3d_shader *geometry_shader = state->shader[WINED3D_SHADER_TYPE_GEOMETRY];
2693 const struct wined3d_shader *pixel_shader = state->shader[WINED3D_SHADER_TYPE_PIXEL];
2694 const struct wined3d_shader *hull_shader = state->shader[WINED3D_SHADER_TYPE_HULL];
2695 const struct wined3d_d3d_info *d3d_info = context->d3d_info;
2696 WORD swizzle_map = context->stream_info.swizzle_map;
2697
2698 if (state->render_states[WINED3D_RS_FOGTABLEMODE] != WINED3D_FOG_NONE)
2699 {
2700 if (state->transforms[WINED3D_TS_PROJECTION]._14 == 0.0f
2701 && state->transforms[WINED3D_TS_PROJECTION]._24 == 0.0f
2702 && state->transforms[WINED3D_TS_PROJECTION]._34 == 0.0f
2703 && state->transforms[WINED3D_TS_PROJECTION]._44 == 1.0f)
2704 {
2705 /* Fog source is vertex output Z.
2706 *
2707 * However, if drawing RHW (which means we are using an HLSL
2708 * replacement shader, since we got here), and depth testing is
2709 * disabled, primitives are not supposed to be clipped by the
2710 * viewport. We handle this in the vertex shader by essentially
2711 * flushing output Z to zero.
2712 *
2713 * Fog needs to still read from the original Z, however. In this
2714 * case we read from oFog, which contains the original Z. */
2715
2716 if (state->vertex_declaration->position_transformed)
2717 args->fog_src = VS_FOG_COORD;
2718 else
2719 args->fog_src = VS_FOG_Z;
2720 }
2721 else
2722 {
2723 args->fog_src = VS_FOG_W;
2724 }
2725 }
2726 else
2727 {
2728 args->fog_src = VS_FOG_COORD;
2729 }
2730
2731 args->clip_enabled = state->render_states[WINED3D_RS_CLIPPING]
2732 && state->render_states[WINED3D_RS_CLIPPLANEENABLE];
2733 args->point_size = state->primitive_type == WINED3D_PT_POINTLIST;
2734 args->next_shader_type = hull_shader ? WINED3D_SHADER_TYPE_HULL
2736 if (shader->reg_maps.shader_version.major >= 4)
2737 args->next_shader_input_count = hull_shader ? hull_shader->limits->packed_input
2738 : geometry_shader ? geometry_shader->limits->packed_input
2739 : pixel_shader ? pixel_shader->limits->packed_input : 0;
2740 else
2741 args->next_shader_input_count = 0;
2742 args->swizzle_map = swizzle_map;
2743 if (d3d_info->emulated_flatshading)
2744 args->flatshading = state->render_states[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT;
2745 else
2746 args->flatshading = 0;
2747
2748 init_interpolation_compile_args(args->interpolation_mode,
2749 args->next_shader_type == WINED3D_SHADER_TYPE_PIXEL ? pixel_shader : NULL, d3d_info);
2750}
unsigned short WORD
Definition: ntddk_ex.h:93
@ WINED3D_RS_CLIPPLANEENABLE
Definition: wined3d.h:360
@ WINED3D_RS_CLIPPING
Definition: wined3d.h:346
@ WINED3D_TS_PROJECTION
Definition: wined3d.h:668
@ VS_FOG_COORD
@ VS_FOG_W
@ VS_FOG_Z

Referenced by set_glsl_shader_program().

◆ geometry_shader_init()

static HRESULT geometry_shader_init ( struct wined3d_shader *  shader,
struct wined3d_device *  device,
const struct wined3d_shader_desc *  desc,
const struct wined3d_stream_output_desc *  so_desc,
void *  parent,
const struct wined3d_parent_ops *  parent_ops 
)
static

Definition at line 2820 of file shader.c.

2823{
2824 HRESULT hr;
2825
2826 shader_init(shader, device, parent, parent_ops);
2827
2829 goto fail;
2830
2831 return WINED3D_OK;
2832
2833fail:
2835 return hr;
2836}
HRESULT hr
Definition: delayimp.cpp:582
static HRESULT shader_set_function(struct wined3d_shader *shader, const struct wined3d_shader_desc *desc, enum wined3d_shader_type type, const struct wined3d_stream_output_desc *so_desc, unsigned int float_const_count)
Definition: shader.c:2319
static void shader_init(struct wined3d_shader *shader, struct wined3d_device *device, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: shader.c:2786
static void shader_cleanup(struct wined3d_shader *shader)
Definition: shader.c:1927
r parent
Definition: btrfs.c:3010
#define FAILED(hr)
Definition: intsafe.h:51
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683
Definition: devices.h:37
#define WINED3D_OK
Definition: wined3d.h:33

Referenced by wined3d_shader_create_gs().

◆ geometry_shader_init_so_desc()

static HRESULT geometry_shader_init_so_desc ( struct wined3d_geometry_shader *  gs,
struct wined3d_device *  device,
const struct wined3d_stream_output_desc *  so_desc 
)
static

Definition at line 2139 of file shader.c.

2141{
2142 struct wined3d_so_desc_entry *s;
2143 struct wine_rb_entry *entry;
2144 unsigned int i;
2145 size_t size;
2146 char *name;
2147
2148 if ((entry = wine_rb_get(&device->so_descs, so_desc)))
2149 {
2150 gs->so_desc = &WINE_RB_ENTRY_VALUE(entry, struct wined3d_so_desc_entry, entry)->desc;
2151 return WINED3D_OK;
2152 }
2153
2154 size = FIELD_OFFSET(struct wined3d_so_desc_entry, elements[so_desc->element_count]);
2155 for (i = 0; i < so_desc->element_count; ++i)
2156 {
2157 const char *n = so_desc->elements[i].semantic_name;
2158
2159 if (n)
2160 size += strlen(n) + 1;
2161 }
2162 if (!(s = malloc(size)))
2163 return E_OUTOFMEMORY;
2164
2165 s->desc = *so_desc;
2166
2167 memcpy(s->elements, so_desc->elements, so_desc->element_count * sizeof(*s->elements));
2168 s->desc.elements = s->elements;
2169
2170 name = (char *)&s->elements[s->desc.element_count];
2171 for (i = 0; i < so_desc->element_count; ++i)
2172 {
2173 struct wined3d_stream_output_element *e = &s->elements[i];
2174
2175 if (!e->semantic_name)
2176 continue;
2177
2178 size = strlen(e->semantic_name) + 1;
2179 memcpy(name, e->semantic_name, size);
2180 e->semantic_name = name;
2181 name += size;
2182 }
2183
2184 if (wine_rb_put(&device->so_descs, &s->desc, &s->entry) == -1)
2185 {
2186 free(s);
2187 return E_FAIL;
2188 }
2189 gs->so_desc = &s->desc;
2190
2191 return WINED3D_OK;
2192}
#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
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
GLdouble s
Definition: gl.h:2039
GLdouble n
Definition: glext.h:7729
GLsizeiptr size
Definition: glext.h:5919
#define gs
Definition: i386-dis.c:445
uint32_t entry
Definition: isohybrid.c:63
#define e
Definition: ke_i.h:82
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
for(i=0;i< sizeof(testsuite)/sizeof(testsuite[0]);++i) ok(call_test(testsuite[i].func)
#define wine_rb_entry
Definition: rbtree.h:404
#define WINE_RB_ENTRY_VALUE
Definition: rbtree.h:414
#define wine_rb_put
Definition: rbtree.h:410
#define wine_rb_get
Definition: rbtree.h:409
Definition: name.c:39
unsigned int element_count
Definition: wined3d.h:2122
const struct wined3d_stream_output_element * elements
Definition: wined3d.h:2121
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255

Referenced by geometry_shader_init_stream_output().

◆ geometry_shader_init_stream_output()

static HRESULT geometry_shader_init_stream_output ( struct wined3d_shader *  shader,
const struct wined3d_stream_output_desc *  so_desc 
)
static

Definition at line 2194 of file shader.c.

2196{
2197 const struct wined3d_shader_frontend *fe = shader->frontend;
2198 const struct wined3d_shader_signature_element *output;
2199 unsigned int i, component_idx, register_idx, mask;
2200 struct wined3d_shader_version shader_version;
2201 const DWORD *ptr;
2202 void *fe_data;
2203 HRESULT hr;
2204
2205 if (!so_desc)
2206 return WINED3D_OK;
2207
2208 if (!(fe_data = fe->shader_init(shader->function, shader->functionLength, &shader->output_signature)))
2209 {
2210 WARN("Failed to initialise frontend data.\n");
2212 }
2213 fe->shader_read_header(fe_data, &ptr, &shader_version);
2214 fe->shader_free(fe_data);
2215
2216 switch (shader_version.type)
2217 {
2220 shader->function = NULL;
2221 shader->functionLength = 0;
2222 break;
2224 break;
2225 default:
2226 WARN("Wrong shader type %s.\n", debug_shader_type(shader_version.type));
2227 return E_INVALIDARG;
2228 }
2229
2230 if (!shader->function)
2231 {
2232 shader->reg_maps.shader_version = shader_version;
2233 shader->reg_maps.shader_version.type = WINED3D_SHADER_TYPE_GEOMETRY;
2236 return hr;
2237 }
2238
2239 for (i = 0; i < so_desc->element_count; ++i)
2240 {
2241 const struct wined3d_stream_output_element *e = &so_desc->elements[i];
2242
2243 if (!e->semantic_name)
2244 continue;
2245 if (!(output = shader_find_signature_element(&shader->output_signature,
2246 e->stream_idx, e->semantic_name, e->semantic_idx))
2248 {
2249 WARN("Failed to find output signature element for stream output entry.\n");
2250 return E_INVALIDARG;
2251 }
2252
2253 mask = wined3d_mask_from_size(e->component_count) << component_idx;
2254 if ((output->mask & 0xff & mask) != mask)
2255 {
2256 WARN("Invalid component range %u-%u (mask %#x), output mask %#x.\n",
2257 component_idx, e->component_count, mask, output->mask & 0xff);
2258 return E_INVALIDARG;
2259 }
2260 }
2261
2262 if (FAILED(hr = geometry_shader_init_so_desc(&shader->u.gs, shader->device, so_desc)))
2263 {
2264 WARN("Failed to initialise stream output description, hr %#lx.\n", hr);
2265 return hr;
2266 }
2267
2268 return WINED3D_OK;
2269}
#define E_INVALIDARG
Definition: ddrawi.h:101
BOOL shader_get_stream_output_register_info(const struct wined3d_shader *shader, const struct wined3d_stream_output_element *so_element, unsigned int *register_idx, unsigned int *component_idx)
Definition: shader.c:2117
static HRESULT geometry_shader_init_so_desc(struct wined3d_geometry_shader *gs, struct wined3d_device *device, const struct wined3d_stream_output_desc *so_desc)
Definition: shader.c:2139
static void shader_set_limits(struct wined3d_shader *shader)
Definition: shader.c:565
static struct wined3d_shader_signature_element * shader_find_signature_element(const struct wined3d_shader_signature *s, unsigned int stream_idx, const char *semantic_name, unsigned int semantic_idx)
Definition: shader.c:2100
static HRESULT shader_scan_output_signature(struct wined3d_shader *shader)
Definition: shader.c:968
const char * debug_shader_type(enum wined3d_shader_type type)
Definition: utils.c:5313
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLint GLuint mask
Definition: glext.h:6028
static PVOID ptr
Definition: dispmode.c:27
void(* shader_read_header)(void *data, const DWORD **ptr, struct wined3d_shader_version *shader_version)
void *(* shader_init)(const DWORD *byte_code, size_t byte_code_size, const struct wined3d_shader_signature *output_signature)
void(* shader_free)(void *data)
@ WINED3D_SHADER_TYPE_DOMAIN
Definition: wined3d.h:845
#define WINED3DERR_INVALIDCALL
Definition: wined3d.h:44

Referenced by shader_set_function().

◆ get_instr_extra_regcount()

static unsigned int get_instr_extra_regcount ( enum WINED3D_SHADER_INSTRUCTION_HANDLER  instr,
unsigned int  param 
)
static

Definition at line 839 of file shader.c.

840{
841 switch (instr)
842 {
843 case WINED3DSIH_M4x4:
844 case WINED3DSIH_M3x4:
845 return param == 1 ? 3 : 0;
846
847 case WINED3DSIH_M4x3:
848 case WINED3DSIH_M3x3:
849 return param == 1 ? 2 : 0;
850
851 case WINED3DSIH_M3x2:
852 return param == 1 ? 1 : 0;
853
854 default:
855 return 0;
856 }
857}
GLfloat param
Definition: glext.h:5796
@ WINED3DSIH_M3x3
@ WINED3DSIH_M3x4
@ WINED3DSIH_M3x2
@ WINED3DSIH_M4x3
@ WINED3DSIH_M4x4

Referenced by shader_get_registers_used().

◆ init_interpolation_compile_args()

static void init_interpolation_compile_args ( uint32_t *  interpolation_args,
const struct wined3d_shader *  pixel_shader,
const struct wined3d_d3d_info *  d3d_info 
)
static

Definition at line 2675 of file shader.c.

2677{
2678 if (!d3d_info->shader_output_interpolation || !pixel_shader
2679 || pixel_shader->reg_maps.shader_version.major < 4)
2680 {
2681 memset(interpolation_args, 0, sizeof(pixel_shader->u.ps.interpolation_mode));
2682 return;
2683 }
2684
2685 memcpy(interpolation_args, pixel_shader->u.ps.interpolation_mode,
2686 sizeof(pixel_shader->u.ps.interpolation_mode));
2687}
uint32_t shader_output_interpolation
struct wined3d_pixel_shader ps
struct wined3d_shader_reg_maps reg_maps

Referenced by find_ds_compile_args(), find_gs_compile_args(), and find_vs_compile_args().

◆ match_usage()

static BOOL match_usage ( BYTE  usage1,
BYTE  usage_idx1,
BYTE  usage2,
BYTE  usage_idx2 
)
static

Definition at line 2752 of file shader.c.

2753{
2754 if (usage_idx1 != usage_idx2)
2755 return FALSE;
2756 if (usage1 == usage2)
2757 return TRUE;
2759 return TRUE;
2761 return TRUE;
2762
2763 return FALSE;
2764}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
@ WINED3D_DECL_USAGE_POSITION
Definition: wined3d.h:807
@ WINED3D_DECL_USAGE_POSITIONT
Definition: wined3d.h:816

Referenced by vshader_get_input().

◆ pixel_shader_init()

static HRESULT pixel_shader_init ( struct wined3d_shader *  shader,
struct wined3d_device *  device,
const struct wined3d_shader_desc *  desc,
void *  parent,
const struct wined3d_parent_ops *  parent_ops 
)
static

Definition at line 3135 of file shader.c.

3137{
3138 const struct wined3d_d3d_info *d3d_info = &device->adapter->d3d_info;
3139 HRESULT hr;
3140
3141 shader_init(shader, device, parent, parent_ops);
3142
3144 WINED3D_SHADER_TYPE_PIXEL, NULL, d3d_info->limits.ps_uniform_count)))
3145 {
3147 return hr;
3148 }
3149
3150 return WINED3D_OK;
3151}
struct wined3d_d3d_limits limits

Referenced by wined3d_shader_create_ps().

◆ pixelshader_get_resource_type()

enum wined3d_shader_resource_type pixelshader_get_resource_type ( const struct wined3d_shader_reg_maps *  reg_maps,
unsigned int  resource_idx,
DWORD  tex_types 
)

Definition at line 3153 of file shader.c.

3155{
3156 static enum wined3d_shader_resource_type shader_resource_type_from_shader_tex_types[] =
3157 {
3158 WINED3D_SHADER_RESOURCE_TEXTURE_2D, /* WINED3D_SHADER_TEX_2D */
3159 WINED3D_SHADER_RESOURCE_TEXTURE_3D, /* WINED3D_SHADER_TEX_3D */
3160 WINED3D_SHADER_RESOURCE_TEXTURE_CUBE, /* WINED3D_SHADER_TEX_CUBE */
3161 };
3162
3163 unsigned int idx;
3164
3165 if (reg_maps->shader_version.major > 3)
3166 return reg_maps->resource_info[resource_idx].type;
3167
3168 if (!reg_maps->resource_info[resource_idx].type)
3169 return 0;
3170
3171 idx = (tex_types >> resource_idx * WINED3D_PSARGS_TEXTYPE_SHIFT) & WINED3D_PSARGS_TEXTYPE_MASK;
3172 assert(idx < ARRAY_SIZE(shader_resource_type_from_shader_tex_types));
3173 return shader_resource_type_from_shader_tex_types[idx];
3174}
unsigned int idx
Definition: utils.c:40
struct wined3d_shader_version shader_version
struct wined3d_shader_resource_info resource_info[MAX_SHADER_RESOURCE_VIEWS]
#define WINED3D_PSARGS_TEXTYPE_MASK

Referenced by shader_generate_glsl_declarations(), shader_glsl_get_sample_function(), and shader_glsl_tex().

◆ shader_addline()

int shader_addline ( struct wined3d_string_buffer *  buffer,
const char *  format,
  ... 
)

Definition at line 467 of file shader.c.

468{
470 int ret;
471
472 for (;;)
473 {
476 va_end(args);
477 if (!ret)
478 return ret;
480 return -1;
481 }
482}
int shader_vaddline(struct wined3d_string_buffer *buffer, const char *format, va_list args)
Definition: shader.c:453
BOOL string_buffer_resize(struct wined3d_string_buffer *buffer, int rc)
Definition: shader.c:435
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
char * va_list
Definition: vadefs.h:50
return ret
Definition: mutex.c:147
GLuint buffer
Definition: glext.h:5915
#define args
Definition: format.c:66

Referenced by ffp_hlsl_generate_pixel_shader(), ffp_hlsl_generate_vertex_shader(), gen_nv12_read(), gen_packed_yuv_read(), gen_yv12_read(), generate_fragment_op(), generate_lighting(), generate_lighting_footer(), get_fragment_op_arg(), glsl_blitter_generate_p8_shader(), glsl_blitter_generate_plain_shader(), glsl_blitter_generate_program(), glsl_blitter_generate_yuv_shader(), PRINTF_ATTR(), shader_generate_glsl_declarations(), shader_glsl_add_instruction_modifiers(), shader_glsl_add_version_declaration(), shader_glsl_append_dst_ext(), shader_glsl_append_imm_ivec(), shader_glsl_append_imm_vec(), shader_glsl_append_sampler_binding_qualifier(), shader_glsl_atomic(), shader_glsl_bem(), shader_glsl_binop(), shader_glsl_bitwise_op(), shader_glsl_break(), shader_glsl_breakc(), shader_glsl_bufinfo(), shader_glsl_call(), shader_glsl_callnz(), shader_glsl_case(), shader_glsl_cast(), shader_glsl_cnd(), shader_glsl_color_correction_ext(), shader_glsl_compare(), shader_glsl_conditional_move(), shader_glsl_conditional_op(), shader_glsl_continue(), shader_glsl_cross(), shader_glsl_cut(), shader_glsl_declare_generic_vertex_attribute(), shader_glsl_declare_shader_inputs(), shader_glsl_declare_shader_outputs(), shader_glsl_declare_typed_vertex_attribute(), shader_glsl_default(), shader_glsl_dot(), shader_glsl_dp2add(), shader_glsl_dst(), shader_glsl_else(), shader_glsl_emit(), shader_glsl_enable_extensions(), shader_glsl_end(), shader_glsl_expp(), shader_glsl_ffp_fragment_op(), shader_glsl_ffp_vertex_lighting(), shader_glsl_ffp_vertex_lighting_footer(), shader_glsl_fixup_position(), shader_glsl_float16(), shader_glsl_gather4(), shader_glsl_gen_sample_c_lz_emulation(), shader_glsl_generate_alpha_test(), shader_glsl_generate_clip_or_cull_distances(), shader_glsl_generate_color_output(), shader_glsl_generate_colour_key_test(), shader_glsl_generate_compute_shader(), shader_glsl_generate_condition(), shader_glsl_generate_default_control_point_phase(), shader_glsl_generate_domain_shader(), shader_glsl_generate_ds_epilogue(), shader_glsl_generate_ffp_fragment_shader(), shader_glsl_generate_ffp_vertex_shader(), shader_glsl_generate_fog_code(), shader_glsl_generate_fragment_shader(), shader_glsl_generate_geometry_shader(), shader_glsl_generate_hull_shader(), shader_glsl_generate_patch_constant_name(), shader_glsl_generate_patch_constant_setup(), shader_glsl_generate_ps_epilogue(), shader_glsl_generate_shader_phase(), shader_glsl_generate_shader_phase_invocation(), shader_glsl_generate_sm4_output_setup(), shader_glsl_generate_srgb_write_correction(), shader_glsl_generate_stream_output_setup(), shader_glsl_generate_vertex_shader(), shader_glsl_generate_vs3_rasterizer_input_setup(), shader_glsl_generate_vs_epilogue(), shader_glsl_get_ffp_fragment_op_arg(), shader_glsl_if(), shader_glsl_ifc(), shader_glsl_input_pack(), shader_glsl_interpolate(), shader_glsl_label(), shader_glsl_ld_raw_structured(), shader_glsl_ld_uav(), shader_glsl_lit(), shader_glsl_loop(), shader_glsl_lrp(), shader_glsl_mad(), shader_glsl_map2gl(), shader_glsl_mov(), shader_glsl_mul_extended(), shader_glsl_nrm(), shader_glsl_pow(), shader_glsl_relop(), shader_glsl_rep(), shader_glsl_resinfo(), shader_glsl_ret(), shader_glsl_sample_info(), shader_glsl_scalar_op(), shader_glsl_setup_sm3_rasterizer_input(), shader_glsl_setup_sm4_shader_output(), shader_glsl_setup_vs3_output(), shader_glsl_sgn(), shader_glsl_sincos(), shader_glsl_store_raw_structured(), shader_glsl_store_uav(), shader_glsl_swapc(), shader_glsl_switch(), shader_glsl_sync(), shader_glsl_texbem(), shader_glsl_texcoord(), shader_glsl_texdepth(), shader_glsl_texdp3(), shader_glsl_texkill(), shader_glsl_texm3x2depth(), shader_glsl_texm3x2pad(), shader_glsl_texm3x2tex(), shader_glsl_texm3x3(), shader_glsl_texm3x3pad(), shader_glsl_texm3x3spec(), shader_glsl_texm3x3tex(), shader_glsl_texm3x3vspec(), shader_glsl_to_int(), shader_glsl_to_uint(), shader_glsl_uav_counter(), shader_glsl_udiv(), and shader_glsl_unary_op().

◆ shader_calculate_clip_or_cull_distance_mask()

static HRESULT shader_calculate_clip_or_cull_distance_mask ( const struct wined3d_shader_signature_element *  e,
unsigned int *  mask 
)
static

Definition at line 941 of file shader.c.

943{
944 /* Clip and cull distances are packed in 4 component registers. 0 and 1 are
945 * the only allowed semantic indices.
946 */
947 if (e->semantic_idx >= WINED3D_MAX_CLIP_DISTANCES / 4)
948 {
949 *mask = 0;
950 WARN("Invalid clip/cull distance index %u.\n", e->semantic_idx);
952 }
953
954 *mask = (e->mask & WINED3DSP_WRITEMASK_ALL) << (4 * e->semantic_idx);
955 return WINED3D_OK;
956}
#define WINED3D_MAX_CLIP_DISTANCES
Definition: wined3d.h:1601
#define WINED3DSP_WRITEMASK_ALL

Referenced by shader_scan_output_signature().

◆ shader_cleanup()

static void shader_cleanup ( struct wined3d_shader *  shader)
static

Definition at line 1927 of file shader.c.

1928{
1929 if (shader->reg_maps.shader_version.type == WINED3D_SHADER_TYPE_HULL)
1930 {
1931 free(shader->u.hs.phases.control_point);
1932 free(shader->u.hs.phases.fork);
1933 free(shader->u.hs.phases.join);
1934 }
1935
1936 free(shader->patch_constant_signature.elements);
1937 free(shader->output_signature.elements);
1938 free(shader->input_signature.elements);
1939 shader->device->shader_backend->shader_destroy(shader);
1940 shader_cleanup_reg_maps(&shader->reg_maps);
1941 free(shader->byte_code);
1942 shader_delete_constant_list(&shader->constantsF);
1943 shader_delete_constant_list(&shader->constantsB);
1944 shader_delete_constant_list(&shader->constantsI);
1945 list_remove(&shader->shader_list_entry);
1946
1947 if (shader->frontend && shader->frontend_data)
1948 shader->frontend->shader_free(shader->frontend_data);
1949}
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static void shader_delete_constant_list(struct list *clist)
Definition: shader.c:556
static void shader_cleanup_reg_maps(struct wined3d_shader_reg_maps *reg_maps)
Definition: shader.c:1849

Referenced by geometry_shader_init(), pixel_shader_init(), shader_set_function(), vertex_shader_init(), wined3d_shader_create_cs(), wined3d_shader_create_ds(), wined3d_shader_create_hs(), and wined3d_shader_destroy_object().

◆ shader_cleanup_reg_maps()

static void shader_cleanup_reg_maps ( struct wined3d_shader_reg_maps *  reg_maps)
static

Definition at line 1849 of file shader.c.

1850{
1851 struct wined3d_shader_indexable_temp *reg, *reg_next;
1852
1853 free(reg_maps->constf);
1854 free(reg_maps->sampler_map.entries);
1855
1857 free(reg);
1858 list_init(&reg_maps->indexable_temps);
1859
1860 free(reg_maps->tgsm);
1861}
static void list_init(struct list_entry *head)
Definition: list.h:51
static int reg
Definition: i386-dis.c:1290
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:242
struct wined3d_shader_tgsm * tgsm
struct wined3d_shader_sampler_map sampler_map

Referenced by shader_cleanup().

◆ shader_delete_constant_list()

static void shader_delete_constant_list ( struct list *  clist)
static

Definition at line 556 of file shader.c.

557{
558 struct wined3d_shader_lconst *constant, *constant_next;
559
560 LIST_FOR_EACH_ENTRY_SAFE(constant, constant_next, clist, struct wined3d_shader_lconst, entry)
561 free(constant);
562 list_init(clist);
563}

Referenced by shader_cleanup().

◆ shader_find_free_input_register()

unsigned int shader_find_free_input_register ( const struct wined3d_shader_reg_maps *  reg_maps,
unsigned int  max 
)

Definition at line 1863 of file shader.c.

1864{
1865 DWORD map = 1u << max;
1866 map |= map - 1;
1867 map &= reg_maps->shader_version.major < 3 ? ~reg_maps->texcoord : ~reg_maps->input_registers;
1868
1869 return wined3d_log2i(map);
1870}
Definition: _map.h:48
#define max(a, b)
Definition: svc.c:63
static unsigned int wined3d_log2i(unsigned int x)
Definition: wined3d.h:2952

◆ shader_find_signature_element()

static struct wined3d_shader_signature_element * shader_find_signature_element ( const struct wined3d_shader_signature *  s,
unsigned int  stream_idx,
const char *  semantic_name,
unsigned int  semantic_idx 
)
static

Definition at line 2100 of file shader.c.

2102{
2103 struct wined3d_shader_signature_element *e = s->elements;
2104 unsigned int i;
2105
2106 for (i = 0; i < s->element_count; ++i)
2107 {
2108 if (e[i].stream_idx == stream_idx
2111 return &e[i];
2112 }
2113
2114 return NULL;
2115}
#define stricmp(_String1, _String2)
Definition: compat.h:24

Referenced by geometry_shader_init_stream_output(), and shader_get_stream_output_register_info().

◆ shader_generate_code()

HRESULT shader_generate_code ( const struct wined3d_shader *  shader,
struct wined3d_string_buffer *  buffer,
const struct wined3d_shader_reg_maps *  reg_maps,
void *  backend_ctx,
const DWORD *  start,
const DWORD *  end 
)

Definition at line 1873 of file shader.c.

1876{
1877 struct wined3d_device *device = shader->device;
1878 const struct wined3d_shader_frontend *fe = shader->frontend;
1879 void *fe_data = shader->frontend_data;
1880 struct wined3d_shader_version shader_version;
1882 struct wined3d_shader_instruction ins;
1883 struct wined3d_shader_tex_mx tex_mx;
1885 const DWORD *ptr;
1886
1887 /* Initialize current parsing state. */
1888 tex_mx.current_row = 0;
1889 state.current_loop_depth = 0;
1890 state.current_loop_reg = 0;
1891 state.in_subroutine = FALSE;
1892
1893 ctx.shader = shader;
1894 ctx.reg_maps = reg_maps;
1895 ctx.buffer = buffer;
1896 ctx.tex_mx = &tex_mx;
1897 ctx.state = &state;
1898 ctx.backend_data = backend_ctx;
1899 ins.ctx = &ctx;
1900
1901 fe->shader_read_header(fe_data, &ptr, &shader_version);
1902 if (start)
1903 ptr = start;
1904
1905 while (!fe->shader_is_end(fe_data, &ptr) && ptr != end)
1906 {
1907 /* Read opcode. */
1908 fe->shader_read_instruction(fe_data, &ptr, &ins);
1909
1910 /* Unknown opcode and its parameters. */
1911 if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
1912 {
1913 WARN("Encountered unrecognised or invalid instruction.\n");
1915 }
1916
1917 if (ins.predicate)
1918 FIXME("Predicates not implemented.\n");
1919
1920 /* Call appropriate function for output target */
1921 device->shader_backend->shader_handle_instruction(&ins);
1922 }
1923
1924 return WINED3D_OK;
1925}
#define FIXME(fmt,...)
Definition: precomp.h:53
GLuint start
Definition: gl.h:1545
GLuint GLuint end
Definition: gl.h:1545
const struct wined3d_shader_reg_maps * reg_maps
struct wined3d_shader_tex_mx * tex_mx
BOOL(* shader_is_end)(void *data, const DWORD **ptr)
void(* shader_read_instruction)(void *data, const DWORD **ptr, struct wined3d_shader_instruction *ins)
@ WINED3DSIH_TABLE_SIZE

Referenced by shader_glsl_generate_compute_shader(), shader_glsl_generate_domain_shader(), shader_glsl_generate_fragment_shader(), shader_glsl_generate_geometry_shader(), shader_glsl_generate_hull_shader(), shader_glsl_generate_shader_phase(), and shader_glsl_generate_vertex_shader().

◆ shader_get_registers_used()

static HRESULT shader_get_registers_used ( struct wined3d_shader *  shader,
DWORD  constf_size 
)
static

Definition at line 1003 of file shader.c.

1004{
1005 struct wined3d_shader_signature_element input_signature_elements[max(MAX_ATTRIBS, MAX_REG_INPUT)];
1006 struct wined3d_shader_signature_element output_signature_elements[MAX_REG_OUTPUT];
1007 struct wined3d_shader_signature *output_signature = &shader->output_signature;
1008 struct wined3d_shader_signature *input_signature = &shader->input_signature;
1009 struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps;
1010 const struct wined3d_shader_frontend *fe = shader->frontend;
1011 unsigned int cur_loop_depth = 0, max_loop_depth = 0;
1012 struct wined3d_shader_version shader_version;
1013 struct wined3d_shader_phase *phase = NULL;
1014 const DWORD *ptr, *prev_ins, *current_ins;
1015 void *fe_data = shader->frontend_data;
1016 unsigned int i;
1017 HRESULT hr;
1018
1019 memset(reg_maps, 0, sizeof(*reg_maps));
1020 memset(input_signature_elements, 0, sizeof(input_signature_elements));
1021 memset(output_signature_elements, 0, sizeof(output_signature_elements));
1022 reg_maps->min_rel_offset = ~0U;
1023 list_init(&reg_maps->indexable_temps);
1024
1025 fe->shader_read_header(fe_data, &ptr, &shader_version);
1026 prev_ins = current_ins = ptr;
1027 reg_maps->shader_version = shader_version;
1028
1030
1031 if (!(reg_maps->constf = calloc(((min(shader->limits->constant_float, constf_size) + 31) / 32),
1032 sizeof(*reg_maps->constf))))
1033 {
1034 ERR("Failed to allocate constant map memory.\n");
1035 return E_OUTOFMEMORY;
1036 }
1037
1038 while (!fe->shader_is_end(fe_data, &ptr))
1039 {
1040 struct wined3d_shader_instruction ins;
1041
1042 current_ins = ptr;
1043 /* Fetch opcode. */
1044 fe->shader_read_instruction(fe_data, &ptr, &ins);
1045
1046 /* Unhandled opcode, and its parameters. */
1047 if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
1048 {
1049 WARN("Encountered unrecognised or invalid instruction.\n");
1051 }
1052
1053 /* Handle declarations. */
1054 if (ins.handler_idx == WINED3DSIH_DCL
1055 || ins.handler_idx == WINED3DSIH_DCL_UAV_TYPED)
1056 {
1057 struct wined3d_shader_semantic *semantic = &ins.declaration.semantic;
1058 unsigned int reg_idx = semantic->reg.reg.idx[0].offset;
1059
1060 switch (semantic->reg.reg.type)
1061 {
1062 /* Mark input registers used. */
1063 case WINED3DSPR_INPUT:
1064 if (reg_idx >= MAX_REG_INPUT)
1065 {
1066 ERR("Invalid input register index %u.\n", reg_idx);
1067 break;
1068 }
1069 if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL && shader_version.major == 3
1070 && semantic->usage == WINED3D_DECL_USAGE_POSITION && !semantic->usage_idx)
1072 reg_maps->input_registers |= 1u << reg_idx;
1073 shader_signature_from_semantic(&input_signature_elements[reg_idx], semantic);
1074 break;
1075
1076 /* Vertex shader: mark 3.0 output registers used, save token. */
1077 case WINED3DSPR_OUTPUT:
1078 if (reg_idx >= MAX_REG_OUTPUT)
1079 {
1080 ERR("Invalid output register index %u.\n", reg_idx);
1081 break;
1082 }
1083 reg_maps->output_registers |= 1u << reg_idx;
1084 shader_signature_from_semantic(&output_signature_elements[reg_idx], semantic);
1085 if (semantic->usage == WINED3D_DECL_USAGE_FOG)
1086 reg_maps->fog = 1;
1087 if (semantic->usage == WINED3D_DECL_USAGE_PSIZE)
1088 reg_maps->point_size = 1;
1089 break;
1090
1091 case WINED3DSPR_SAMPLER:
1092 shader_record_sample(reg_maps, reg_idx, reg_idx, reg_idx);
1094 if (reg_idx >= ARRAY_SIZE(reg_maps->resource_info))
1095 {
1096 ERR("Invalid resource index %u.\n", reg_idx);
1097 break;
1098 }
1099 reg_maps->resource_info[reg_idx].type = semantic->resource_type;
1100 if (semantic->resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_2DMS && semantic->sample_count == 1)
1101 reg_maps->resource_info[reg_idx].type = WINED3D_SHADER_RESOURCE_TEXTURE_2D;
1102 if (semantic->resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY && semantic->sample_count == 1)
1104 reg_maps->resource_info[reg_idx].data_type = semantic->resource_data_type;
1105 wined3d_bitmap_set(reg_maps->resource_map, reg_idx);
1106 break;
1107
1108 case WINED3DSPR_UAV:
1109 if (reg_idx >= ARRAY_SIZE(reg_maps->uav_resource_info))
1110 {
1111 ERR("Invalid UAV resource index %u.\n", reg_idx);
1112 break;
1113 }
1114 reg_maps->uav_resource_info[reg_idx].type = semantic->resource_type;
1115 reg_maps->uav_resource_info[reg_idx].data_type = semantic->resource_data_type;
1116 if (ins.flags)
1117 FIXME("Ignoring typed UAV flags %#x.\n", ins.flags);
1118 break;
1119
1120 default:
1121 TRACE("Not recording DCL register type %#x.\n", semantic->reg.reg.type);
1122 break;
1123 }
1124 }
1125 else if (ins.handler_idx == WINED3DSIH_DCL_CONSTANT_BUFFER)
1126 {
1127 struct wined3d_shader_register *reg = &ins.declaration.src.reg;
1128 if (reg->idx[0].offset >= WINED3D_MAX_CBS)
1129 {
1130 ERR("Invalid CB index %u.\n", reg->idx[0].offset);
1131 }
1132 else
1133 {
1134 reg_maps->cb_sizes[reg->idx[0].offset] = reg->idx[1].offset;
1135 wined3d_bitmap_set(&reg_maps->cb_map, reg->idx[0].offset);
1136 }
1137 }
1138 else if (ins.handler_idx == WINED3DSIH_DCL_GLOBAL_FLAGS)
1139 {
1141 {
1142 if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
1143 shader->u.ps.force_early_depth_stencil = TRUE;
1144 else
1145 FIXME("Invalid instruction %#x for shader type %#x.\n",
1146 ins.handler_idx, shader_version.type);
1147 }
1148 else
1149 {
1150 WARN("Ignoring global flags %#x.\n", ins.flags);
1151 }
1152 }
1153 else if (ins.handler_idx == WINED3DSIH_DCL_GS_INSTANCES)
1154 {
1155 if (shader_version.type == WINED3D_SHADER_TYPE_GEOMETRY)
1156 shader->u.gs.instance_count = ins.declaration.count;
1157 else
1158 FIXME("Invalid instruction %#x for shader type %#x.\n",
1159 ins.handler_idx, shader_version.type);
1160 }
1161 else if (ins.handler_idx == WINED3DSIH_DCL_HS_FORK_PHASE_INSTANCE_COUNT
1162 || ins.handler_idx == WINED3DSIH_DCL_HS_JOIN_PHASE_INSTANCE_COUNT)
1163 {
1164 if (phase)
1165 phase->instance_count = ins.declaration.count;
1166 else
1167 FIXME("Instruction %s outside of shader phase.\n",
1168 debug_d3dshaderinstructionhandler(ins.handler_idx));
1169 }
1170 else if (ins.handler_idx == WINED3DSIH_DCL_IMMEDIATE_CONSTANT_BUFFER)
1171 {
1172 if (reg_maps->icb)
1173 FIXME("Multiple immediate constant buffers.\n");
1174 reg_maps->icb = ins.declaration.icb;
1175 }
1176 else if (ins.handler_idx == WINED3DSIH_DCL_INDEXABLE_TEMP)
1177 {
1178 if (phase)
1179 {
1180 FIXME("Indexable temporary registers not supported.\n");
1181 }
1182 else
1183 {
1185
1186 if (!(reg = malloc(sizeof(*reg))))
1187 return E_OUTOFMEMORY;
1188
1189 *reg = ins.declaration.indexable_temp;
1190 list_add_tail(&reg_maps->indexable_temps, &reg->entry);
1191 }
1192 }
1193 else if (ins.handler_idx == WINED3DSIH_DCL_INPUT_PRIMITIVE)
1194 {
1195 if (shader_version.type == WINED3D_SHADER_TYPE_GEOMETRY)
1196 shader->u.gs.input_type = ins.declaration.primitive_type.type;
1197 else
1198 FIXME("Invalid instruction %#x for shader type %#x.\n",
1199 ins.handler_idx, shader_version.type);
1200 }
1201 else if (ins.handler_idx == WINED3DSIH_DCL_INPUT_PS)
1202 {
1203 unsigned int reg_idx = ins.declaration.dst.reg.idx[0].offset;
1204 if (reg_idx >= MAX_REG_INPUT)
1205 {
1206 ERR("Invalid register index %u.\n", reg_idx);
1207 break;
1208 }
1209 if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
1210 wined3d_insert_interpolation_mode(shader->u.ps.interpolation_mode, reg_idx, ins.flags);
1211 else
1212 FIXME("Invalid instruction %#x for shader type %#x.\n",
1213 ins.handler_idx, shader_version.type);
1214 }
1215 else if (ins.handler_idx == WINED3DSIH_DCL_OUTPUT)
1216 {
1217 if (ins.declaration.dst.reg.type == WINED3DSPR_DEPTHOUT
1218 || ins.declaration.dst.reg.type == WINED3DSPR_DEPTHOUTGE
1219 || ins.declaration.dst.reg.type == WINED3DSPR_DEPTHOUTLE)
1220 {
1221 if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
1222 shader->u.ps.depth_output = ins.declaration.dst.reg.type;
1223 else
1224 FIXME("Invalid instruction %#x for shader type %#x.\n",
1225 ins.handler_idx, shader_version.type);
1226 }
1227 }
1228 else if (ins.handler_idx == WINED3DSIH_DCL_OUTPUT_CONTROL_POINT_COUNT)
1229 {
1230 if (shader_version.type == WINED3D_SHADER_TYPE_HULL)
1231 shader->u.hs.output_vertex_count = ins.declaration.count;
1232 else
1233 FIXME("Invalid instruction %#x for shader type %#x.\n", ins.handler_idx, shader_version.type);
1234 }
1235 else if (ins.handler_idx == WINED3DSIH_DCL_OUTPUT_TOPOLOGY)
1236 {
1237 if (shader_version.type == WINED3D_SHADER_TYPE_GEOMETRY)
1238 shader->u.gs.output_type = ins.declaration.primitive_type.type;
1239 else
1240 FIXME("Invalid instruction %#x for shader type %#x.\n",
1241 ins.handler_idx, shader_version.type);
1242 }
1243 else if (ins.handler_idx == WINED3DSIH_DCL_RESOURCE_RAW)
1244 {
1245 unsigned int reg_idx = ins.declaration.dst.reg.idx[0].offset;
1246 if (reg_idx >= ARRAY_SIZE(reg_maps->resource_info))
1247 {
1248 ERR("Invalid resource index %u.\n", reg_idx);
1249 break;
1250 }
1251 reg_maps->resource_info[reg_idx].type = WINED3D_SHADER_RESOURCE_BUFFER;
1252 reg_maps->resource_info[reg_idx].data_type = WINED3D_DATA_UINT;
1253 reg_maps->resource_info[reg_idx].flags = WINED3D_VIEW_BUFFER_RAW;
1254 wined3d_bitmap_set(reg_maps->resource_map, reg_idx);
1255 }
1256 else if (ins.handler_idx == WINED3DSIH_DCL_RESOURCE_STRUCTURED)
1257 {
1258 unsigned int reg_idx = ins.declaration.structured_resource.reg.reg.idx[0].offset;
1259 if (reg_idx >= ARRAY_SIZE(reg_maps->resource_info))
1260 {
1261 ERR("Invalid resource index %u.\n", reg_idx);
1262 break;
1263 }
1264 reg_maps->resource_info[reg_idx].type = WINED3D_SHADER_RESOURCE_BUFFER;
1265 reg_maps->resource_info[reg_idx].data_type = WINED3D_DATA_UINT;
1266 reg_maps->resource_info[reg_idx].flags = 0;
1267 reg_maps->resource_info[reg_idx].stride = ins.declaration.structured_resource.byte_stride / 4;
1268 wined3d_bitmap_set(reg_maps->resource_map, reg_idx);
1269 }
1270 else if (ins.handler_idx == WINED3DSIH_DCL_SAMPLER)
1271 {
1272 if (ins.flags & WINED3DSI_SAMPLER_COMPARISON_MODE)
1273 reg_maps->sampler_comparison_mode |= (1u << ins.declaration.dst.reg.idx[0].offset);
1274 }
1275 else if (ins.handler_idx == WINED3DSIH_DCL_TEMPS)
1276 {
1277 if (phase)
1278 phase->temporary_count = ins.declaration.count;
1279 else
1280 reg_maps->temporary_count = ins.declaration.count;
1281 }
1282 else if (ins.handler_idx == WINED3DSIH_DCL_TESSELLATOR_DOMAIN)
1283 {
1284 if (shader_version.type == WINED3D_SHADER_TYPE_DOMAIN)
1285 shader->u.ds.tessellator_domain = ins.declaration.tessellator_domain;
1286 else if (shader_version.type != WINED3D_SHADER_TYPE_HULL)
1287 FIXME("Invalid instruction %#x for shader type %#x.\n", ins.handler_idx, shader_version.type);
1288 }
1289 else if (ins.handler_idx == WINED3DSIH_DCL_TESSELLATOR_OUTPUT_PRIMITIVE)
1290 {
1291 if (shader_version.type == WINED3D_SHADER_TYPE_HULL)
1292 shader->u.hs.tessellator_output_primitive = ins.declaration.tessellator_output_primitive;
1293 else
1294 FIXME("Invalid instruction %#x for shader type %#x.\n", ins.handler_idx, shader_version.type);
1295 }
1296 else if (ins.handler_idx == WINED3DSIH_DCL_TESSELLATOR_PARTITIONING)
1297 {
1298 if (shader_version.type == WINED3D_SHADER_TYPE_HULL)
1299 shader->u.hs.tessellator_partitioning = ins.declaration.tessellator_partitioning;
1300 else
1301 FIXME("Invalid instruction %#x for shader type %#x.\n", ins.handler_idx, shader_version.type);
1302 }
1303 else if (ins.handler_idx == WINED3DSIH_DCL_TGSM_RAW)
1304 {
1305 if (FAILED(hr = shader_reg_maps_add_tgsm(reg_maps, ins.declaration.tgsm_raw.reg.reg.idx[0].offset,
1306 ins.declaration.tgsm_raw.byte_count / 4, 0)))
1307 return hr;
1308 }
1309 else if (ins.handler_idx == WINED3DSIH_DCL_TGSM_STRUCTURED)
1310 {
1311 unsigned int stride = ins.declaration.tgsm_structured.byte_stride / 4;
1312 unsigned int size = stride * ins.declaration.tgsm_structured.structure_count;
1313 if (FAILED(hr = shader_reg_maps_add_tgsm(reg_maps,
1314 ins.declaration.tgsm_structured.reg.reg.idx[0].offset, size, stride)))
1315 return hr;
1316 }
1317 else if (ins.handler_idx == WINED3DSIH_DCL_THREAD_GROUP)
1318 {
1319 if (shader_version.type == WINED3D_SHADER_TYPE_COMPUTE)
1320 {
1321 shader->u.cs.thread_group_size = ins.declaration.thread_group_size;
1322 }
1323 else
1324 {
1325 FIXME("Invalid instruction %#x for shader type %#x.\n",
1326 ins.handler_idx, shader_version.type);
1327 }
1328 }
1329 else if (ins.handler_idx == WINED3DSIH_DCL_UAV_RAW)
1330 {
1331 unsigned int reg_idx = ins.declaration.dst.reg.idx[0].offset;
1332 if (reg_idx >= ARRAY_SIZE(reg_maps->uav_resource_info))
1333 {
1334 ERR("Invalid UAV resource index %u.\n", reg_idx);
1335 break;
1336 }
1337 if (ins.flags)
1338 FIXME("Ignoring raw UAV flags %#x.\n", ins.flags);
1339 reg_maps->uav_resource_info[reg_idx].type = WINED3D_SHADER_RESOURCE_BUFFER;
1340 reg_maps->uav_resource_info[reg_idx].data_type = WINED3D_DATA_UINT;
1341 reg_maps->uav_resource_info[reg_idx].flags = WINED3D_VIEW_BUFFER_RAW;
1342 }
1343 else if (ins.handler_idx == WINED3DSIH_DCL_UAV_STRUCTURED)
1344 {
1345 unsigned int reg_idx = ins.declaration.structured_resource.reg.reg.idx[0].offset;
1346 if (reg_idx >= ARRAY_SIZE(reg_maps->uav_resource_info))
1347 {
1348 ERR("Invalid UAV resource index %u.\n", reg_idx);
1349 break;
1350 }
1351 if (ins.flags)
1352 FIXME("Ignoring structured UAV flags %#x.\n", ins.flags);
1353 reg_maps->uav_resource_info[reg_idx].type = WINED3D_SHADER_RESOURCE_BUFFER;
1354 reg_maps->uav_resource_info[reg_idx].data_type = WINED3D_DATA_UINT;
1355 reg_maps->uav_resource_info[reg_idx].flags = 0;
1356 reg_maps->uav_resource_info[reg_idx].stride = ins.declaration.structured_resource.byte_stride / 4;
1357 }
1358 else if (ins.handler_idx == WINED3DSIH_DCL_VERTICES_OUT)
1359 {
1360 if (shader_version.type == WINED3D_SHADER_TYPE_GEOMETRY)
1361 shader->u.gs.vertices_out = ins.declaration.count;
1362 else
1363 FIXME("Invalid instruction %#x for shader type %#x.\n",
1364 ins.handler_idx, shader_version.type);
1365 }
1366 else if (ins.handler_idx == WINED3DSIH_DEF)
1367 {
1368 struct wined3d_shader_lconst *lconst;
1369 float *value;
1370
1371 if (!(lconst = malloc(sizeof(*lconst))))
1372 return E_OUTOFMEMORY;
1373
1374 lconst->idx = ins.dst[0].reg.idx[0].offset;
1375 memcpy(lconst->value, ins.src[0].reg.u.immconst_data, 4 * sizeof(DWORD));
1376 value = (float *)lconst->value;
1377
1378 /* In pixel shader 1.X shaders, the constants are clamped between [-1;1] */
1379 if (shader_version.major == 1 && shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
1380 {
1381 if (value[0] < -1.0f) value[0] = -1.0f;
1382 else if (value[0] > 1.0f) value[0] = 1.0f;
1383 if (value[1] < -1.0f) value[1] = -1.0f;
1384 else if (value[1] > 1.0f) value[1] = 1.0f;
1385 if (value[2] < -1.0f) value[2] = -1.0f;
1386 else if (value[2] > 1.0f) value[2] = 1.0f;
1387 if (value[3] < -1.0f) value[3] = -1.0f;
1388 else if (value[3] > 1.0f) value[3] = 1.0f;
1389 }
1390
1391 list_add_head(&shader->constantsF, &lconst->entry);
1392
1393 if (isinf(value[0]) || isnan(value[0]) || isinf(value[1]) || isnan(value[1])
1394 || isinf(value[2]) || isnan(value[2]) || isinf(value[3]) || isnan(value[3]))
1395 {
1396 shader->lconst_inf_or_nan = TRUE;
1397 }
1398 }
1399 else if (ins.handler_idx == WINED3DSIH_DEFI)
1400 {
1401 struct wined3d_shader_lconst *lconst;
1402
1403 if (!(lconst = malloc(sizeof(*lconst))))
1404 return E_OUTOFMEMORY;
1405
1406 lconst->idx = ins.dst[0].reg.idx[0].offset;
1407 memcpy(lconst->value, ins.src[0].reg.u.immconst_data, 4 * sizeof(DWORD));
1408
1409 list_add_head(&shader->constantsI, &lconst->entry);
1410 reg_maps->local_int_consts |= (1u << lconst->idx);
1411 }
1412 else if (ins.handler_idx == WINED3DSIH_DEFB)
1413 {
1414 struct wined3d_shader_lconst *lconst;
1415
1416 if (!(lconst = malloc(sizeof(*lconst))))
1417 return E_OUTOFMEMORY;
1418
1419 lconst->idx = ins.dst[0].reg.idx[0].offset;
1420 memcpy(lconst->value, ins.src[0].reg.u.immconst_data, sizeof(DWORD));
1421
1422 list_add_head(&shader->constantsB, &lconst->entry);
1423 reg_maps->local_bool_consts |= (1u << lconst->idx);
1424 }
1425 /* Handle shader phases. */
1426 else if (ins.handler_idx == WINED3DSIH_HS_CONTROL_POINT_PHASE
1427 || ins.handler_idx == WINED3DSIH_HS_FORK_PHASE
1428 || ins.handler_idx == WINED3DSIH_HS_JOIN_PHASE)
1429 {
1430 if (FAILED(hr = shader_record_shader_phase(shader, &phase, &ins, current_ins, prev_ins)))
1431 return hr;
1432 }
1433 /* For subroutine prototypes. */
1434 else if (ins.handler_idx == WINED3DSIH_LABEL)
1435 {
1436 reg_maps->labels |= 1u << ins.src[0].reg.idx[0].offset;
1437 }
1438 /* Set texture, address, temporary registers. */
1439 else
1440 {
1441 BOOL color0_mov = FALSE;
1442 unsigned int i;
1443
1444 /* This will loop over all the registers and try to
1445 * make a bitmask of the ones we're interested in.
1446 *
1447 * Relative addressing tokens are ignored, but that's
1448 * okay, since we'll catch any address registers when
1449 * they are initialized (required by spec). */
1450 for (i = 0; i < ins.dst_count; ++i)
1451 {
1452 if (!shader_record_register_usage(shader, reg_maps, &ins.dst[i].reg,
1453 shader_version.type, constf_size))
1455
1456 if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX)
1457 {
1458 UINT idx = ins.dst[i].reg.idx[0].offset;
1459
1460 switch (ins.dst[i].reg.type)
1461 {
1462 case WINED3DSPR_RASTOUT:
1463 if (shader_version.major >= 3)
1464 break;
1465 switch (idx)
1466 {
1467 case 0: /* oPos */
1468 reg_maps->output_registers |= 1u << 10;
1469 shader_signature_from_usage(&output_signature_elements[10],
1471 break;
1472
1473 case 1: /* oFog */
1474 reg_maps->output_registers |= 1u << 11;
1475 shader_signature_from_usage(&output_signature_elements[11],
1477 break;
1478
1479 case 2: /* oPts */
1480 reg_maps->output_registers |= 1u << 11;
1481 shader_signature_from_usage(&output_signature_elements[12],
1483 break;
1484 }
1485 break;
1486
1487 case WINED3DSPR_ATTROUT:
1488 if (shader_version.major >= 3)
1489 break;
1490 if (idx < 2)
1491 {
1492 idx += 8;
1493 if (reg_maps->output_registers & (1u << idx))
1494 {
1495 output_signature_elements[idx].mask |= ins.dst[i].write_mask;
1496 }
1497 else
1498 {
1499 reg_maps->output_registers |= 1u << idx;
1500 shader_signature_from_usage(&output_signature_elements[idx],
1501 WINED3D_DECL_USAGE_COLOR, idx - 8, idx, ins.dst[i].write_mask);
1502 }
1503 }
1504 break;
1505
1506 case WINED3DSPR_TEXCRDOUT: /* WINED3DSPR_OUTPUT */
1507 if (shader_version.major >= 3)
1508 {
1509 if (idx >= ARRAY_SIZE(reg_maps->u.output_registers_mask))
1510 {
1511 WARN("Invalid output register index %u.\n", idx);
1512 break;
1513 }
1514 reg_maps->u.output_registers_mask[idx] |= ins.dst[i].write_mask;
1515 break;
1516 }
1517 if (idx >= ARRAY_SIZE(reg_maps->u.texcoord_mask))
1518 {
1519 WARN("Invalid texcoord index %u.\n", idx);
1520 break;
1521 }
1522 reg_maps->u.texcoord_mask[idx] |= ins.dst[i].write_mask;
1523 if (reg_maps->output_registers & (1u << idx))
1524 {
1525 output_signature_elements[idx].mask |= ins.dst[i].write_mask;
1526 }
1527 else
1528 {
1529 reg_maps->output_registers |= 1u << idx;
1530 shader_signature_from_usage(&output_signature_elements[idx],
1531 WINED3D_DECL_USAGE_TEXCOORD, idx, idx, ins.dst[i].write_mask);
1532 }
1533 break;
1534
1535 default:
1536 break;
1537 }
1538 }
1539
1540 if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
1541 {
1542 if (ins.dst[i].reg.type == WINED3DSPR_COLOROUT && !ins.dst[i].reg.idx[0].offset)
1543 {
1544 /* Many 2.0 and 3.0 pixel shaders end with a MOV from a temp register to
1545 * COLOROUT 0. If we know this in advance, the ARB shader backend can skip
1546 * the mov and perform the sRGB write correction from the source register.
1547 *
1548 * However, if the mov is only partial, we can't do this, and if the write
1549 * comes from an instruction other than MOV it is hard to do as well. If
1550 * COLOROUT 0 is overwritten partially later, the marker is dropped again. */
1551 shader->u.ps.color0_mov = FALSE;
1552 if (ins.handler_idx == WINED3DSIH_MOV
1553 && ins.dst[i].write_mask == WINED3DSP_WRITEMASK_ALL)
1554 {
1555 /* Used later when the source register is read. */
1556 color0_mov = TRUE;
1557 }
1558 }
1559 /* Also drop the MOV marker if the source register is overwritten prior to the shader
1560 * end
1561 */
1562 else if (ins.dst[i].reg.type == WINED3DSPR_TEMP
1563 && ins.dst[i].reg.idx[0].offset == shader->u.ps.color0_reg)
1564 {
1565 shader->u.ps.color0_mov = FALSE;
1566 }
1567 }
1568
1569 /* Declare 1.x samplers implicitly, based on the destination reg. number. */
1570 if (shader_version.major == 1
1571 && (ins.handler_idx == WINED3DSIH_TEX
1572 || ins.handler_idx == WINED3DSIH_TEXBEM
1573 || ins.handler_idx == WINED3DSIH_TEXBEML
1574 || ins.handler_idx == WINED3DSIH_TEXDP3TEX
1575 || ins.handler_idx == WINED3DSIH_TEXM3x2TEX
1576 || ins.handler_idx == WINED3DSIH_TEXM3x3SPEC
1577 || ins.handler_idx == WINED3DSIH_TEXM3x3TEX
1578 || ins.handler_idx == WINED3DSIH_TEXM3x3VSPEC
1579 || ins.handler_idx == WINED3DSIH_TEXREG2AR
1580 || ins.handler_idx == WINED3DSIH_TEXREG2GB
1581 || ins.handler_idx == WINED3DSIH_TEXREG2RGB))
1582 {
1583 unsigned int reg_idx = ins.dst[i].reg.idx[0].offset;
1584
1585 if (reg_idx >= ARRAY_SIZE(reg_maps->resource_info))
1586 {
1587 WARN("Invalid 1.x sampler index %u.\n", reg_idx);
1588 continue;
1589 }
1590
1591 TRACE("Setting fake 2D resource for 1.x pixelshader.\n");
1592 reg_maps->resource_info[reg_idx].type = WINED3D_SHADER_RESOURCE_TEXTURE_2D;
1593 reg_maps->resource_info[reg_idx].data_type = WINED3D_DATA_FLOAT;
1594 shader_record_sample(reg_maps, reg_idx, reg_idx, reg_idx);
1595 wined3d_bitmap_set(reg_maps->resource_map, reg_idx);
1596
1597 /* texbem is only valid with < 1.4 pixel shaders */
1598 if (ins.handler_idx == WINED3DSIH_TEXBEM
1599 || ins.handler_idx == WINED3DSIH_TEXBEML)
1600 {
1601 reg_maps->bumpmat |= 1u << reg_idx;
1602 if (ins.handler_idx == WINED3DSIH_TEXBEML)
1603 {
1604 reg_maps->luminanceparams |= 1u << reg_idx;
1605 }
1606 }
1607 }
1608 else if (ins.handler_idx == WINED3DSIH_BEM)
1609 {
1610 reg_maps->bumpmat |= 1u << ins.dst[i].reg.idx[0].offset;
1611 }
1612 }
1613
1614 if (ins.handler_idx == WINED3DSIH_IMM_ATOMIC_ALLOC || ins.handler_idx == WINED3DSIH_IMM_ATOMIC_CONSUME)
1615 {
1616 unsigned int reg_idx = ins.src[0].reg.idx[0].offset;
1617 if (reg_idx >= MAX_UNORDERED_ACCESS_VIEWS)
1618 {
1619 ERR("Invalid UAV index %u.\n", reg_idx);
1620 break;
1621 }
1622 reg_maps->uav_counter_mask |= (1u << reg_idx);
1623 }
1624 else if ((WINED3DSIH_ATOMIC_AND <= ins.handler_idx && ins.handler_idx <= WINED3DSIH_ATOMIC_XOR)
1625 || (WINED3DSIH_IMM_ATOMIC_AND <= ins.handler_idx && ins.handler_idx <= WINED3DSIH_IMM_ATOMIC_XOR)
1626 || (ins.handler_idx == WINED3DSIH_BUFINFO && ins.src[0].reg.type == WINED3DSPR_UAV)
1627 || ins.handler_idx == WINED3DSIH_LD_UAV_TYPED
1628 || (ins.handler_idx == WINED3DSIH_LD_RAW && ins.src[1].reg.type == WINED3DSPR_UAV)
1629 || (ins.handler_idx == WINED3DSIH_LD_STRUCTURED && ins.src[2].reg.type == WINED3DSPR_UAV))
1630 {
1631 const struct wined3d_shader_register *reg;
1632
1633 if (ins.handler_idx == WINED3DSIH_LD_UAV_TYPED || ins.handler_idx == WINED3DSIH_LD_RAW)
1634 reg = &ins.src[1].reg;
1635 else if (ins.handler_idx == WINED3DSIH_LD_STRUCTURED)
1636 reg = &ins.src[2].reg;
1637 else if (WINED3DSIH_ATOMIC_AND <= ins.handler_idx && ins.handler_idx <= WINED3DSIH_ATOMIC_XOR)
1638 reg = &ins.dst[0].reg;
1639 else if (ins.handler_idx == WINED3DSIH_BUFINFO)
1640 reg = &ins.src[0].reg;
1641 else
1642 reg = &ins.dst[1].reg;
1643
1644 if (reg->type == WINED3DSPR_UAV)
1645 {
1646 if (reg->idx[0].offset >= MAX_UNORDERED_ACCESS_VIEWS)
1647 {
1648 ERR("Invalid UAV index %u.\n", reg->idx[0].offset);
1649 break;
1650 }
1651 reg_maps->uav_read_mask |= (1u << reg->idx[0].offset);
1652 }
1653 }
1654 else if (ins.handler_idx == WINED3DSIH_NRM)
1655 {
1656 reg_maps->usesnrm = 1;
1657 }
1658 else if (ins.handler_idx == WINED3DSIH_DSY
1659 || ins.handler_idx == WINED3DSIH_DSY_COARSE
1660 || ins.handler_idx == WINED3DSIH_DSY_FINE)
1661 {
1662 reg_maps->usesdsy = 1;
1663 }
1664 else if (ins.handler_idx == WINED3DSIH_DSX
1665 || ins.handler_idx == WINED3DSIH_DSX_COARSE
1666 || ins.handler_idx == WINED3DSIH_DSX_FINE)
1667 {
1668 reg_maps->usesdsx = 1;
1669 }
1670 else if (ins.handler_idx == WINED3DSIH_TEXLDD) reg_maps->usestexldd = 1;
1671 else if (ins.handler_idx == WINED3DSIH_TEXLDL) reg_maps->usestexldl = 1;
1672 else if (ins.handler_idx == WINED3DSIH_MOVA) reg_maps->usesmova = 1;
1673 else if (ins.handler_idx == WINED3DSIH_IFC) reg_maps->usesifc = 1;
1674 else if (ins.handler_idx == WINED3DSIH_CALL) reg_maps->usescall = 1;
1675 else if (ins.handler_idx == WINED3DSIH_POW) reg_maps->usespow = 1;
1676 else if (ins.handler_idx == WINED3DSIH_LOOP
1677 || ins.handler_idx == WINED3DSIH_REP)
1678 {
1679 ++cur_loop_depth;
1680 if (cur_loop_depth > max_loop_depth)
1681 max_loop_depth = cur_loop_depth;
1682 }
1683 else if (ins.handler_idx == WINED3DSIH_ENDLOOP
1684 || ins.handler_idx == WINED3DSIH_ENDREP)
1685 {
1686 --cur_loop_depth;
1687 }
1688 else if (ins.handler_idx == WINED3DSIH_GATHER4
1689 || ins.handler_idx == WINED3DSIH_GATHER4_C
1690 || ins.handler_idx == WINED3DSIH_SAMPLE
1691 || ins.handler_idx == WINED3DSIH_SAMPLE_B
1692 || ins.handler_idx == WINED3DSIH_SAMPLE_C
1693 || ins.handler_idx == WINED3DSIH_SAMPLE_C_LZ
1694 || ins.handler_idx == WINED3DSIH_SAMPLE_GRAD
1695 || ins.handler_idx == WINED3DSIH_SAMPLE_LOD)
1696 {
1697 shader_record_sample(reg_maps, ins.src[1].reg.idx[0].offset,
1698 ins.src[2].reg.idx[0].offset, reg_maps->sampler_map.count);
1699 }
1700 else if (ins.handler_idx == WINED3DSIH_GATHER4_PO
1701 || ins.handler_idx == WINED3DSIH_GATHER4_PO_C)
1702 {
1703 shader_record_sample(reg_maps, ins.src[2].reg.idx[0].offset,
1704 ins.src[3].reg.idx[0].offset, reg_maps->sampler_map.count);
1705 }
1706 else if ((ins.handler_idx == WINED3DSIH_BUFINFO && ins.src[0].reg.type == WINED3DSPR_RESOURCE)
1707 || (ins.handler_idx == WINED3DSIH_SAMPLE_INFO && ins.src[0].reg.type == WINED3DSPR_RESOURCE))
1708 {
1709 shader_record_sample(reg_maps, ins.src[0].reg.idx[0].offset,
1710 WINED3D_SAMPLER_DEFAULT, reg_maps->sampler_map.count);
1711 }
1712 else if (ins.handler_idx == WINED3DSIH_LD
1713 || ins.handler_idx == WINED3DSIH_LD2DMS
1714 || (ins.handler_idx == WINED3DSIH_LD_RAW && ins.src[1].reg.type == WINED3DSPR_RESOURCE)
1715 || (ins.handler_idx == WINED3DSIH_RESINFO && ins.src[1].reg.type == WINED3DSPR_RESOURCE))
1716 {
1717 shader_record_sample(reg_maps, ins.src[1].reg.idx[0].offset,
1718 WINED3D_SAMPLER_DEFAULT, reg_maps->sampler_map.count);
1719 }
1720 else if (ins.handler_idx == WINED3DSIH_LD_STRUCTURED
1721 && ins.src[2].reg.type == WINED3DSPR_RESOURCE)
1722 {
1723 shader_record_sample(reg_maps, ins.src[2].reg.idx[0].offset,
1724 WINED3D_SAMPLER_DEFAULT, reg_maps->sampler_map.count);
1725 }
1726
1727 if (ins.predicate)
1728 if (!shader_record_register_usage(shader, reg_maps, &ins.predicate->reg,
1729 shader_version.type, constf_size))
1731
1732 for (i = 0; i < ins.src_count; ++i)
1733 {
1734 unsigned int count = get_instr_extra_regcount(ins.handler_idx, i);
1735 struct wined3d_shader_register reg = ins.src[i].reg;
1736
1737 if (!shader_record_register_usage(shader, reg_maps, &ins.src[i].reg,
1738 shader_version.type, constf_size))
1740 while (count)
1741 {
1742 ++reg.idx[0].offset;
1743 if (!shader_record_register_usage(shader, reg_maps, &reg,
1744 shader_version.type, constf_size))
1746 --count;
1747 }
1748
1749 if (color0_mov)
1750 {
1751 if (ins.src[i].reg.type == WINED3DSPR_TEMP
1752 && ins.src[i].swizzle == WINED3DSP_NOSWIZZLE)
1753 {
1754 shader->u.ps.color0_mov = TRUE;
1755 shader->u.ps.color0_reg = ins.src[i].reg.idx[0].offset;
1756 }
1757 }
1758 }
1759 }
1760
1761 prev_ins = current_ins;
1762 }
1763 reg_maps->loop_depth = max_loop_depth;
1764
1765 if (phase)
1766 {
1767 phase->end = prev_ins;
1768 phase = NULL;
1769 }
1770
1771 /* PS before 2.0 don't have explicit color outputs. Instead the value of
1772 * R0 is written to the render target. */
1773 if (shader_version.major < 2 && shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
1774 reg_maps->rt_mask |= (1u << 0);
1775
1776 if (input_signature->elements)
1777 {
1778 for (i = 0; i < input_signature->element_count; ++i)
1779 {
1780 if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX)
1781 {
1782 if (input_signature->elements[i].register_idx >= ARRAY_SIZE(shader->u.vs.attributes))
1783 {
1784 WARN("Invalid input signature register index %u.\n", input_signature->elements[i].register_idx);
1786 }
1787 }
1788 else if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
1789 {
1790 if (input_signature->elements[i].sysval_semantic == WINED3D_SV_POSITION)
1791 reg_maps->vpos = 1;
1792 else if (input_signature->elements[i].sysval_semantic == WINED3D_SV_IS_FRONT_FACE)
1793 reg_maps->usesfacing = 1;
1794 }
1795 reg_maps->input_registers |= 1u << input_signature->elements[i].register_idx;
1796 }
1797 }
1798 else if (!input_signature->elements && reg_maps->input_registers)
1799 {
1800 unsigned int count = wined3d_popcount(reg_maps->input_registers);
1802 unsigned int i;
1803
1804 if (!(input_signature->elements = calloc(count, sizeof(*input_signature->elements))))
1805 return E_OUTOFMEMORY;
1806 input_signature->element_count = count;
1807
1808 e = input_signature->elements;
1809 for (i = 0; i < ARRAY_SIZE(input_signature_elements); ++i)
1810 {
1811 if (!(reg_maps->input_registers & (1u << i)))
1812 continue;
1813 input_signature_elements[i].register_idx = i;
1814 *e++ = input_signature_elements[i];
1815 }
1816 }
1817
1818 if (output_signature->elements)
1819 {
1821 return hr;
1822 }
1823 else if (reg_maps->output_registers)
1824 {
1826 unsigned int count = 0;
1827
1828 for (i = 0; i < ARRAY_SIZE(output_signature_elements); ++i)
1829 {
1830 if (output_signature_elements[i].semantic_name)
1831 ++count;
1832 }
1833
1834 if (!(output_signature->elements = calloc(count, sizeof(*output_signature->elements))))
1835 return E_OUTOFMEMORY;
1836 output_signature->element_count = count;
1837
1838 e = output_signature->elements;
1839 for (i = 0; i < ARRAY_SIZE(output_signature_elements); ++i)
1840 {
1841 if (output_signature_elements[i].semantic_name)
1842 *e++ = output_signature_elements[i];
1843 }
1844 }
1845
1846 return WINED3D_OK;
1847}
#define U(x)
Definition: wordpad.c:45
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
static void list_add_head(struct list_entry *head, struct list_entry *entry)
Definition: list.h:76
#define ERR(fmt,...)
Definition: precomp.h:57
static void shader_signature_from_usage(struct wined3d_shader_signature_element *e, enum wined3d_decl_usage usage, UINT usage_idx, UINT reg_idx, DWORD write_mask)
Definition: shader.c:383
static void wined3d_insert_interpolation_mode(uint32_t *packed_interpolation_mode, unsigned int register_idx, enum wined3d_shader_interpolation_mode mode)
Definition: shader.c:958
static unsigned int get_instr_extra_regcount(enum WINED3D_SHADER_INSTRUCTION_HANDLER instr, unsigned int param)
Definition: shader.c:839
static void shader_signature_from_semantic(struct wined3d_shader_signature_element *e, const struct wined3d_shader_semantic *s)
Definition: shader.c:371
static HRESULT shader_reg_maps_add_tgsm(struct wined3d_shader_reg_maps *reg_maps, unsigned int register_idx, unsigned int size, unsigned int stride)
Definition: shader.c:859
static HRESULT shader_record_shader_phase(struct wined3d_shader *shader, struct wined3d_shader_phase **current_phase, const struct wined3d_shader_instruction *ins, const DWORD *current_instruction_ptr, const DWORD *previous_instruction_ptr)
Definition: shader.c:886
static void shader_record_sample(struct wined3d_shader_reg_maps *reg_maps, unsigned int resource_idx, unsigned int sampler_idx, unsigned int bind_idx)
Definition: shader.c:794
const char * debug_d3dshaderinstructionhandler(enum WINED3D_SHADER_INSTRUCTION_HANDLER handler_idx)
Definition: shader.c:301
static BOOL shader_record_register_usage(struct wined3d_shader *shader, struct wined3d_shader_reg_maps *reg_maps, const struct wined3d_shader_register *reg, enum wined3d_shader_type shader_type, unsigned int constf_size)
Definition: shader.c:670
#define isinf(x)
Definition: math.h:359
#define isnan(x)
Definition: math.h:360
unsigned int BOOL
Definition: ntddk_ex.h:94
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLsizei stride
Definition: glext.h:5848
unsigned int UINT
Definition: sysinfo.c:13
if(dx< 0)
Definition: linetemp.h:194
#define min(a, b)
Definition: monoChain.cc:55
#define calloc
Definition: rosglue.h:14
#define TRACE(s)
Definition: solgame.cpp:4
unsigned int instance_count
unsigned int temporary_count
UINT cb_sizes[WINED3D_MAX_CBS]
DWORD texcoord_mask[MAX_REG_TEXCRD]
union wined3d_shader_reg_maps::@346 u
const struct wined3d_shader_immediate_constant_buffer * icb
BYTE output_registers_mask[MAX_REG_OUTPUT]
uint32_t resource_map[WINED3D_BITMAP_SIZE(MAX_SHADER_RESOURCE_VIEWS)]
struct wined3d_shader_resource_info uav_resource_info[MAX_UNORDERED_ACCESS_VIEWS]
struct wined3d_shader_dst_param reg
enum wined3d_decl_usage usage
enum wined3d_data_type resource_data_type
enum wined3d_shader_resource_type resource_type
struct wined3d_shader_signature_element * elements
Definition: pdh_main.c:64
@ WINED3D_DECL_USAGE_PSIZE
Definition: wined3d.h:811
@ WINED3D_DECL_USAGE_COLOR
Definition: wined3d.h:817
@ WINED3D_DECL_USAGE_FOG
Definition: wined3d.h:818
#define WINED3D_VIEW_BUFFER_RAW
Definition: wined3d.h:1579
@ WINED3D_SHADER_TYPE_COMPUTE
Definition: wined3d.h:848
#define MAX_REG_OUTPUT
#define WINED3DSP_WRITEMASK_0
@ WINED3D_DATA_UINT
@ WINED3D_DATA_FLOAT
@ WINED3DSIH_DSX_COARSE
@ WINED3DSIH_DCL_TESSELLATOR_PARTITIONING
@ WINED3DSIH_DCL_TEMPS
@ WINED3DSIH_GATHER4_PO_C
@ WINED3DSIH_ATOMIC_XOR
@ WINED3DSIH_DSX_FINE
@ WINED3DSIH_DCL_OUTPUT
@ WINED3DSIH_IMM_ATOMIC_XOR
@ WINED3DSIH_TEXREG2RGB
@ WINED3DSIH_TEXLDL
@ WINED3DSIH_DEFI
@ WINED3DSIH_SAMPLE_B
@ WINED3DSIH_DCL_CONSTANT_BUFFER
@ WINED3DSIH_TEXREG2AR
@ WINED3DSIH_TEXREG2GB
@ WINED3DSIH_LOOP
@ WINED3DSIH_DSY_COARSE
@ WINED3DSIH_SAMPLE_LOD
@ WINED3DSIH_LD
@ WINED3DSIH_TEXM3x3TEX
@ WINED3DSIH_SAMPLE_GRAD
@ WINED3DSIH_ATOMIC_AND
@ WINED3DSIH_TEXM3x3VSPEC
@ WINED3DSIH_LD2DMS
@ WINED3DSIH_SAMPLE
@ WINED3DSIH_MOV
@ WINED3DSIH_DCL_IMMEDIATE_CONSTANT_BUFFER
@ WINED3DSIH_NRM
@ WINED3DSIH_DCL_THREAD_GROUP
@ WINED3DSIH_DCL_TESSELLATOR_OUTPUT_PRIMITIVE
@ WINED3DSIH_LD_RAW
@ WINED3DSIH_GATHER4
@ WINED3DSIH_HS_CONTROL_POINT_PHASE
@ WINED3DSIH_DEFB
@ WINED3DSIH_LD_STRUCTURED
@ WINED3DSIH_IMM_ATOMIC_AND
@ WINED3DSIH_TEXM3x2TEX
@ WINED3DSIH_IMM_ATOMIC_CONSUME
@ WINED3DSIH_HS_FORK_PHASE
@ WINED3DSIH_SAMPLE_INFO
@ WINED3DSIH_DSX
@ WINED3DSIH_DCL
@ WINED3DSIH_DCL_VERTICES_OUT
@ WINED3DSIH_CALL
@ WINED3DSIH_HS_JOIN_PHASE
@ WINED3DSIH_ENDREP
@ WINED3DSIH_BEM
@ WINED3DSIH_TEXDP3TEX
@ WINED3DSIH_TEXBEML
@ WINED3DSIH_DCL_OUTPUT_TOPOLOGY
@ WINED3DSIH_TEXM3x3SPEC
@ WINED3DSIH_DCL_SAMPLER
@ WINED3DSIH_TEXBEM
@ WINED3DSIH_DCL_GS_INSTANCES
@ WINED3DSIH_DCL_TGSM_RAW
@ WINED3DSIH_DCL_UAV_TYPED
@ WINED3DSIH_TEXLDD
@ WINED3DSIH_REP
@ WINED3DSIH_IFC
@ WINED3DSIH_SAMPLE_C_LZ
@ WINED3DSIH_ENDLOOP
@ WINED3DSIH_DSY
@ WINED3DSIH_MOVA
@ WINED3DSIH_DCL_INPUT_PS
@ WINED3DSIH_GATHER4_C
@ WINED3DSIH_LD_UAV_TYPED
@ WINED3DSIH_DEF
@ WINED3DSIH_GATHER4_PO
@ WINED3DSIH_DCL_UAV_STRUCTURED
@ WINED3DSIH_DCL_HS_FORK_PHASE_INSTANCE_COUNT
@ WINED3DSIH_DCL_GLOBAL_FLAGS
@ WINED3DSIH_POW
@ WINED3DSIH_BUFINFO
@ WINED3DSIH_IMM_ATOMIC_ALLOC
@ WINED3DSIH_TEX
@ WINED3DSIH_DCL_TESSELLATOR_DOMAIN
@ WINED3DSIH_LABEL
@ WINED3DSIH_RESINFO
@ WINED3DSIH_DCL_TGSM_STRUCTURED
@ WINED3DSIH_SAMPLE_C
@ WINED3DSIH_DCL_UAV_RAW
@ WINED3DSIH_DCL_OUTPUT_CONTROL_POINT_COUNT
@ WINED3DSIH_DCL_INDEXABLE_TEMP
@ WINED3DSIH_DCL_RESOURCE_RAW
@ WINED3DSIH_DCL_INPUT_PRIMITIVE
@ WINED3DSIH_DCL_HS_JOIN_PHASE_INSTANCE_COUNT
@ WINED3DSIH_DSY_FINE
@ WINED3DSIH_DCL_RESOURCE_STRUCTURED
#define WINED3D_MAX_CBS
#define WINED3DSI_SAMPLER_COMPARISON_MODE
#define MAX_REG_INPUT
@ WINED3D_SV_IS_FRONT_FACE
@ WINED3D_SV_POSITION
#define MAX_UNORDERED_ACCESS_VIEWS
@ WINED3D_SHADER_RESOURCE_BUFFER
@ WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY
@ WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY
@ WINED3D_SHADER_RESOURCE_TEXTURE_2DMS
#define WINED3D_SAMPLER_DEFAULT
static BOOL wined3d_bitmap_set(uint32_t *map, unsigned int idx)
@ WINED3DSPR_RESOURCE
@ WINED3DSPR_COLOROUT
@ WINED3DSPR_ATTROUT
@ WINED3DSPR_DEPTHOUTGE
@ WINED3DSPR_UAV
@ WINED3DSPR_SAMPLER
@ WINED3DSPR_RASTOUT
@ WINED3DSPR_OUTPUT
@ WINED3DSPR_INPUT
@ WINED3DSPR_TEMP
@ WINED3DSPR_DEPTHOUT
@ WINED3DSPR_TEXCRDOUT
@ WINED3DSPR_DEPTHOUTLE
#define WINED3DSP_NOSWIZZLE
@ WINED3DSGF_FORCE_EARLY_DEPTH_STENCIL
#define MAX_ATTRIBS
static unsigned int wined3d_popcount(unsigned int x)
#define WINED3DSP_WRITEMASK_1

Referenced by shader_set_function().

◆ shader_get_stream_output_register_info()

BOOL shader_get_stream_output_register_info ( const struct wined3d_shader *  shader,
const struct wined3d_stream_output_element *  so_element,
unsigned int *  register_idx,
unsigned int *  component_idx 
)

Definition at line 2117 of file shader.c.

2119{
2120 const struct wined3d_shader_signature_element *output;
2121 unsigned int idx;
2122
2123 if (!(output = shader_find_signature_element(&shader->output_signature,
2124 so_element->stream_idx, so_element->semantic_name, so_element->semantic_idx)))
2125 return FALSE;
2126
2127 for (idx = 0; idx < 4; ++idx)
2128 {
2129 if (output->mask & (1u << idx))
2130 break;
2131 }
2132 idx += so_element->component_idx;
2133
2134 *register_idx = output->register_idx;
2135 *component_idx = idx;
2136 return TRUE;
2137}

Referenced by geometry_shader_init_stream_output(), shader_glsl_generate_stream_output_setup(), and shader_glsl_generate_transform_feedback_varyings().

◆ shader_init()

static void shader_init ( struct wined3d_shader *  shader,
struct wined3d_device *  device,
void *  parent,
const struct wined3d_parent_ops *  parent_ops 
)
static

Definition at line 2786 of file shader.c.

2788{
2789 shader->ref = 1;
2790 shader->device = device;
2791 shader->parent = parent;
2792 shader->parent_ops = parent_ops;
2793
2794 list_init(&shader->linked_programs);
2795 list_init(&shader->constantsF);
2796 list_init(&shader->constantsB);
2797 list_init(&shader->constantsI);
2798 shader->lconst_inf_or_nan = FALSE;
2799 list_init(&shader->reg_maps.indexable_temps);
2800 list_init(&shader->shader_list_entry);
2801}

Referenced by geometry_shader_init(), pixel_shader_init(), vertex_shader_init(), wined3d_shader_create_cs(), wined3d_shader_create_ds(), wined3d_shader_create_ffp_ps(), wined3d_shader_create_ffp_vs(), and wined3d_shader_create_hs().

◆ shader_match_semantic()

BOOL shader_match_semantic ( const char *  semantic_name,
enum wined3d_decl_usage  usage 
)

Definition at line 366 of file shader.c.

367{
368 return !strcmp(semantic_name, shader_semantic_name_from_usage(usage));
369}
static const char * shader_semantic_name_from_usage(enum wined3d_decl_usage usage)
Definition: shader.c:331
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3324
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919

Referenced by glsl_is_color_reg_read(), shader_glsl_generate_vs3_rasterizer_input_setup(), shader_glsl_input_pack(), and shader_glsl_setup_sm3_rasterizer_input().

◆ shader_max_version_from_feature_level()

static unsigned int shader_max_version_from_feature_level ( enum wined3d_feature_level  level)
static

Definition at line 2080 of file shader.c.

2081{
2082 switch (level)
2083 {
2086 return 5;
2089 return 4;
2091 return 3;
2094 return 2;
2095 default:
2096 return 1;
2097 }
2098}
GLint level
Definition: gl.h:1546
@ WINED3D_FEATURE_LEVEL_11
Definition: wined3d.h:109
@ WINED3D_FEATURE_LEVEL_10_1
Definition: wined3d.h:108
@ WINED3D_FEATURE_LEVEL_9_3
Definition: wined3d.h:106
@ WINED3D_FEATURE_LEVEL_10
Definition: wined3d.h:107
@ WINED3D_FEATURE_LEVEL_11_1
Definition: wined3d.h:110
@ WINED3D_FEATURE_LEVEL_9_1
Definition: wined3d.h:104
@ WINED3D_FEATURE_LEVEL_9_2
Definition: wined3d.h:105

Referenced by shader_set_function().

◆ shader_none_alloc()

static HRESULT shader_none_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 1993 of file shader.c.

1995{
1996 void *vertex_priv, *fragment_priv;
1997 struct shader_none_priv *priv;
1998
1999 if (!(priv = malloc(sizeof(*priv))))
2000 return E_OUTOFMEMORY;
2001
2002 if (!(vertex_priv = vertex_pipe->vp_alloc(&none_shader_backend, priv)))
2003 {
2004 ERR("Failed to initialize vertex pipe.\n");
2005 free(priv);
2006 return E_FAIL;
2007 }
2008
2009 if (!(fragment_priv = fragment_pipe->alloc_private(&none_shader_backend, priv)))
2010 {
2011 ERR("Failed to initialize fragment pipe.\n");
2012 vertex_pipe->vp_free(device, NULL);
2013 free(priv);
2014 return E_FAIL;
2015 }
2016
2017 priv->vertex_pipe = vertex_pipe;
2019
2020 device->vertex_priv = vertex_priv;
2021 device->fragment_priv = fragment_priv;
2022 device->shader_priv = priv;
2023
2024 return WINED3D_OK;
2025}
const struct wined3d_shader_backend_ops none_shader_backend
Definition: shader.c:2060
const struct wined3d_vertex_pipe_ops * vertex_pipe
Definition: shader.c:1953
const struct wined3d_fragment_pipe_ops * fragment_pipe
Definition: shader.c:1954

◆ shader_none_allocate_context_data()

static BOOL shader_none_allocate_context_data ( struct wined3d_context *  context)
static

Definition at line 2036 of file shader.c.

2037{
2038 return TRUE;
2039}

◆ shader_none_apply_compute_state()

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

Definition at line 1959 of file shader.c.

1960 {}

◆ shader_none_apply_draw_state()

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

Definition at line 1968 of file shader.c.

1970{
1971 struct shader_none_priv *priv = shader_priv;
1972
1973 priv->vertex_pipe->vp_apply_draw_state(context, state);
1974 priv->fragment_pipe->fp_apply_draw_state(context, state);
1975}

◆ shader_none_color_fixup_supported()

static BOOL shader_none_color_fixup_supported ( struct color_fixup_desc  fixup)
static

Definition at line 2047 of file shader.c.

2048{
2049 /* We "support" every possible fixup, since we don't support any shader
2050 * model, and will never have to actually sample a texture. */
2051 return TRUE;
2052}

◆ shader_none_destroy()

static void shader_none_destroy ( struct wined3d_shader *  shader)
static

Definition at line 1963 of file shader.c.

1963{}

◆ shader_none_disable()

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

Definition at line 1978 of file shader.c.

1979{
1980 struct shader_none_priv *priv = shader_priv;
1981
1982 priv->vertex_pipe->vp_disable(context);
1983 priv->fragment_pipe->fp_disable(context);
1984
1985 context->shader_update_mask = (1u << WINED3D_SHADER_TYPE_PIXEL)
1988 | (1u << WINED3D_SHADER_TYPE_HULL)
1991}

◆ shader_none_free()

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

Definition at line 2027 of file shader.c.

2028{
2029 struct shader_none_priv *priv = device->shader_priv;
2030
2031 priv->fragment_pipe->free_private(device, context);
2032 priv->vertex_pipe->vp_free(device, context);
2033 free(priv);
2034}

◆ shader_none_free_context_data()

static void shader_none_free_context_data ( struct wined3d_context *  context)
static

Definition at line 1964 of file shader.c.

1964{}

◆ shader_none_get_caps()

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

Definition at line 2041 of file shader.c.

2042{
2043 /* Set the shader caps to 0 for the none shader backend */
2044 memset(caps, 0, sizeof(*caps));
2045}

◆ shader_none_handle_instruction()

static void shader_none_handle_instruction ( const struct wined3d_shader_instruction *  ins)
static

Definition at line 1957 of file shader.c.

1957{}

◆ shader_none_init_context_state()

static void shader_none_init_context_state ( struct wined3d_context *  context)
static

Definition at line 1965 of file shader.c.

1965{}

◆ shader_none_precompile()

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

Definition at line 1958 of file shader.c.

1958{}

◆ shader_none_shader_compile()

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

Definition at line 2054 of file shader.c.

2056{
2057 return 0;
2058}

◆ shader_none_update_float_pixel_constants()

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

Definition at line 1962 of file shader.c.

1962{}

◆ shader_none_update_float_vertex_constants()

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

Definition at line 1961 of file shader.c.

1961{}

◆ shader_record_register_usage()

static BOOL shader_record_register_usage ( struct wined3d_shader *  shader,
struct wined3d_shader_reg_maps *  reg_maps,
const struct wined3d_shader_register *  reg,
enum wined3d_shader_type  shader_type,
unsigned int  constf_size 
)
static

Definition at line 670 of file shader.c.

672{
673 switch (reg->type)
674 {
675 case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */
677 reg_maps->texcoord |= 1u << reg->idx[0].offset;
678 else
679 reg_maps->address |= 1u << reg->idx[0].offset;
680 break;
681
682 case WINED3DSPR_TEMP:
683 reg_maps->temporary |= 1u << reg->idx[0].offset;
684 break;
685
686 case WINED3DSPR_INPUT:
687 if (reg->idx[0].rel_addr)
688 reg_maps->input_rel_addressing = 1;
690 {
691 /* If relative addressing is used, we must assume that all
692 * registers are used. Even if it is a construct like v3[aL],
693 * we can't assume that v0, v1 and v2 aren't read because aL
694 * can be negative. */
695 if (reg->idx[0].rel_addr)
696 shader->u.ps.input_reg_used = ~0u;
697 else
698 shader->u.ps.input_reg_used |= 1u << reg->idx[0].offset;
699 }
700 else
701 {
702 reg_maps->input_registers |= 1u << reg->idx[0].offset;
703 }
704 break;
705
707 if (reg->idx[0].offset == 1)
708 reg_maps->fog = 1;
709 if (reg->idx[0].offset == 2)
710 reg_maps->point_size = 1;
711 break;
712
715 {
716 if (!reg->idx[0].offset)
717 reg_maps->vpos = 1;
718 else if (reg->idx[0].offset == 1)
719 reg_maps->usesfacing = 1;
720 }
721 break;
722
723 case WINED3DSPR_CONST:
724 if (reg->idx[0].rel_addr)
725 {
726 if (reg->idx[0].offset < reg_maps->min_rel_offset)
727 reg_maps->min_rel_offset = reg->idx[0].offset;
728 if (reg->idx[0].offset > reg_maps->max_rel_offset)
729 reg_maps->max_rel_offset = reg->idx[0].offset;
730 reg_maps->usesrelconstF = TRUE;
731 }
732 else
733 {
734 if (reg->idx[0].offset >= min(shader->limits->constant_float, constf_size))
735 {
736 WARN("Shader using float constant %u which is not supported.\n", reg->idx[0].offset);
737 return FALSE;
738 }
739 else
740 {
741 wined3d_insert_bits(reg_maps->constf, reg->idx[0].offset, 1, 0x1);
742 }
743 }
744 break;
745
747 if (reg->idx[0].offset >= shader->limits->constant_int)
748 {
749 WARN("Shader using integer constant %u which is not supported.\n", reg->idx[0].offset);
750 return FALSE;
751 }
752 else
753 {
754 reg_maps->integer_constants |= (1u << reg->idx[0].offset);
755 }
756 break;
757
759 if (reg->idx[0].offset >= shader->limits->constant_bool)
760 {
761 WARN("Shader using bool constant %u which is not supported.\n", reg->idx[0].offset);
762 return FALSE;
763 }
764 else
765 {
766 reg_maps->boolean_constants |= (1u << reg->idx[0].offset);
767 }
768 break;
769
771 reg_maps->rt_mask |= (1u << reg->idx[0].offset);
772 break;
773
775 reg_maps->vocp = 1;
776 break;
777
779 reg_maps->sample_mask = 1;
780 break;
781
783 reg_maps->stencil_ref = 1;
784 break;
785
786 default:
787 TRACE("Not recording register of type %#x and [%#x][%#x].\n",
788 reg->type, reg->idx[0].offset, reg->idx[1].offset);
789 break;
790 }
791 return TRUE;
792}
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 void wined3d_insert_bits(uint32_t *bitstream, unsigned int offset, unsigned int count, DWORD bits)
@ WINED3DSPR_CONSTBOOL
@ WINED3DSPR_CONST
@ WINED3DSPR_OUTCONTROLPOINT
@ WINED3DSPR_CONSTINT
@ WINED3DSPR_STENCILREF
@ WINED3DSPR_SAMPLEMASK
@ WINED3DSPR_TEXTURE
@ WINED3DSPR_MISCTYPE

Referenced by shader_get_registers_used().

◆ shader_record_sample()

static void shader_record_sample ( struct wined3d_shader_reg_maps *  reg_maps,
unsigned int  resource_idx,
unsigned int  sampler_idx,
unsigned int  bind_idx 
)
static

Definition at line 794 of file shader.c.

796{
797 struct wined3d_shader_sampler_map_entry *entries, *entry;
799 unsigned int i;
800
801 map = &reg_maps->sampler_map;
802 entries = map->entries;
803 for (i = 0; i < map->count; ++i)
804 {
805 if (entries[i].resource_idx == resource_idx && entries[i].sampler_idx == sampler_idx)
806 return;
807 }
808
809 if (!map->size)
810 {
811 if (!(entries = calloc(4, sizeof(*entries))))
812 {
813 ERR("Failed to allocate sampler map entries.\n");
814 return;
815 }
816 map->size = 4;
817 map->entries = entries;
818 }
819 else if (map->count == map->size)
820 {
821 size_t new_size = map->size * 2;
822
823 if (sizeof(*entries) * new_size <= sizeof(*entries) * map->size
824 || !(entries = realloc(entries, sizeof(*entries) * new_size)))
825 {
826 ERR("Failed to resize sampler map entries.\n");
827 return;
828 }
829 map->size = new_size;
830 map->entries = entries;
831 }
832
833 entry = &entries[map->count++];
834 entry->resource_idx = resource_idx;
835 entry->sampler_idx = sampler_idx;
836 entry->bind_idx = bind_idx;
837}
_STLP_TEMPLATE_FOR_CONT_EXT size_type count(const _KT &__x) const
Definition: _map.h:214
size_type size() const
Definition: _map.h:172
#define realloc
Definition: debug_ros.c:6
size_t const new_size
Definition: expand.cpp:66
struct wined3d_shader_sampler_map_entry * entries

Referenced by shader_get_registers_used().

◆ shader_record_shader_phase()

static HRESULT shader_record_shader_phase ( struct wined3d_shader *  shader,
struct wined3d_shader_phase **  current_phase,
const struct wined3d_shader_instruction *  ins,
const DWORD *  current_instruction_ptr,
const DWORD *  previous_instruction_ptr 
)
static

Definition at line 886 of file shader.c.

889{
890 struct wined3d_shader_phase *phase;
891
892 if ((phase = *current_phase))
893 {
894 phase->end = previous_instruction_ptr;
895 *current_phase = NULL;
896 }
897
898 if (shader->reg_maps.shader_version.type != WINED3D_SHADER_TYPE_HULL)
899 {
900 ERR("Unexpected shader type %s.\n", debug_shader_type(shader->reg_maps.shader_version.type));
901 return E_FAIL;
902 }
903
904 switch (ins->handler_idx)
905 {
907 if (shader->u.hs.phases.control_point)
908 {
909 FIXME("Multiple control point phases.\n");
910 free(shader->u.hs.phases.control_point);
911 }
912 if (!(shader->u.hs.phases.control_point = calloc(1, sizeof(*shader->u.hs.phases.control_point))))
913 return E_OUTOFMEMORY;
914 phase = shader->u.hs.phases.control_point;
915 break;
917 if (!wined3d_array_reserve((void **)&shader->u.hs.phases.fork,
918 &shader->u.hs.phases.fork_size, shader->u.hs.phases.fork_count + 1,
919 sizeof(*shader->u.hs.phases.fork)))
920 return E_OUTOFMEMORY;
921 phase = &shader->u.hs.phases.fork[shader->u.hs.phases.fork_count++];
922 break;
924 if (!wined3d_array_reserve((void **)&shader->u.hs.phases.join,
925 &shader->u.hs.phases.join_size, shader->u.hs.phases.join_count + 1,
926 sizeof(*shader->u.hs.phases.join)))
927 return E_OUTOFMEMORY;
928 phase = &shader->u.hs.phases.join[shader->u.hs.phases.join_count++];
929 break;
930 default:
931 ERR("Unexpected opcode %s.\n", debug_d3dshaderinstructionhandler(ins->handler_idx));
932 return E_FAIL;
933 }
934
935 phase->start = current_instruction_ptr;
936 *current_phase = phase;
937
938 return WINED3D_OK;
939}
BOOL wined3d_array_reserve(void **elements, SIZE_T *capacity, SIZE_T count, SIZE_T size)
Definition: utils.c:6740
enum WINED3D_SHADER_INSTRUCTION_HANDLER handler_idx

Referenced by shader_get_registers_used().

◆ shader_reg_maps_add_tgsm()

static HRESULT shader_reg_maps_add_tgsm ( struct wined3d_shader_reg_maps *  reg_maps,
unsigned int  register_idx,
unsigned int  size,
unsigned int  stride 
)
static

Definition at line 859 of file shader.c.

861{
862 struct wined3d_shader_tgsm *tgsm;
863
864 if (register_idx >= MAX_TGSM_REGISTERS)
865 {
866 ERR("Invalid TGSM register index %u.\n", register_idx);
867 return S_OK;
868 }
869 if (reg_maps->shader_version.type != WINED3D_SHADER_TYPE_COMPUTE)
870 {
871 FIXME("TGSM declarations are allowed only in compute shaders.\n");
872 return S_OK;
873 }
874
875 if (!wined3d_array_reserve((void **)&reg_maps->tgsm, &reg_maps->tgsm_capacity,
876 register_idx + 1, sizeof(*reg_maps->tgsm)))
877 return E_OUTOFMEMORY;
878
879 reg_maps->tgsm_count = max(register_idx + 1, reg_maps->tgsm_count);
880 tgsm = &reg_maps->tgsm[register_idx];
881 tgsm->size = size;
882 tgsm->stride = stride;
883 return S_OK;
884}
#define S_OK
Definition: intsafe.h:52
#define MAX_TGSM_REGISTERS

Referenced by shader_get_registers_used().

◆ shader_scan_output_signature()

static HRESULT shader_scan_output_signature ( struct wined3d_shader *  shader)
static

Definition at line 968 of file shader.c.

969{
970 const struct wined3d_shader_signature *output_signature = &shader->output_signature;
971 struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps;
972 unsigned int i;
973 HRESULT hr;
974
975 for (i = 0; i < output_signature->element_count; ++i)
976 {
977 const struct wined3d_shader_signature_element *e = &output_signature->elements[i];
978 unsigned int mask;
979
980 reg_maps->output_registers |= 1u << e->register_idx;
981 if (e->sysval_semantic == WINED3D_SV_CLIP_DISTANCE)
982 {
984 return hr;
985 reg_maps->clip_distance_mask |= mask;
986 }
987 else if (e->sysval_semantic == WINED3D_SV_CULL_DISTANCE)
988 {
990 return hr;
991 reg_maps->cull_distance_mask |= mask;
992 }
993 else if (e->sysval_semantic == WINED3D_SV_VIEWPORT_ARRAY_INDEX)
994 {
995 reg_maps->viewport_array = 1;
996 }
997 }
998
999 return WINED3D_OK;
1000}
static HRESULT shader_calculate_clip_or_cull_distance_mask(const struct wined3d_shader_signature_element *e, unsigned int *mask)
Definition: shader.c:941
@ WINED3D_SV_CULL_DISTANCE
@ WINED3D_SV_CLIP_DISTANCE
@ WINED3D_SV_VIEWPORT_ARRAY_INDEX

Referenced by geometry_shader_init_stream_output(), and shader_get_registers_used().

◆ shader_select_frontend()

static const struct wined3d_shader_frontend * shader_select_frontend ( enum vkd3d_shader_source_type  source_type)
static

Definition at line 395 of file shader.c.

396{
397 switch (source_type)
398 {
400 return &sm1_shader_frontend;
401
403 return &sm4_shader_frontend;
404
405 default:
406 WARN("Invalid source type %#x specified.\n", source_type);
407 return NULL;
408 }
409}
const struct wined3d_shader_frontend sm1_shader_frontend
Definition: shader_sm1.c:804
const struct wined3d_shader_frontend sm4_shader_frontend
Definition: shader_sm4.c:1831
@ VKD3D_SHADER_SOURCE_D3D_BYTECODE
@ VKD3D_SHADER_SOURCE_DXBC_TPF

Referenced by shader_set_function().

◆ shader_semantic_name_from_usage()

static const char * shader_semantic_name_from_usage ( enum wined3d_decl_usage  usage)
static

Definition at line 331 of file shader.c.

332{
334 {
335 FIXME("Unrecognized usage %#x.\n", usage);
336 return "UNRECOGNIZED";
337 }
338
339 return semantic_names[usage];
340}
static const char *const semantic_names[]
Definition: shader.c:283

Referenced by shader_match_semantic(), shader_signature_from_semantic(), and shader_signature_from_usage().

◆ shader_set_function()

static HRESULT shader_set_function ( struct wined3d_shader *  shader,
const struct wined3d_shader_desc *  desc,
enum wined3d_shader_type  type,
const struct wined3d_stream_output_desc *  so_desc,
unsigned int  float_const_count 
)
static

Definition at line 2319 of file shader.c.

2321{
2322 const struct wined3d_d3d_info *d3d_info = &shader->device->adapter->d3d_info;
2323 struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps;
2324 const struct wined3d_shader_version *version = &reg_maps->shader_version;
2325 unsigned int highest_reg_used = 0, num_regs_used = 0;
2326 const struct wined3d_shader_frontend *fe;
2327 unsigned int backend_version;
2328 HRESULT hr;
2329
2330 TRACE("shader %p, byte_code %p, size %#Ix, type %s, float_const_count %u.\n",
2331 shader, desc->byte_code, desc->byte_code_size, debug_shader_type(type), float_const_count);
2332
2333 if (!desc->byte_code)
2335
2336 if (desc->byte_code_size == ~(size_t)0)
2337 {
2338 struct wined3d_shader_version shader_version;
2339 const struct wined3d_shader_frontend *fe;
2340 struct wined3d_shader_instruction ins;
2341 const DWORD *ptr;
2342 void *fe_data;
2343
2345 if (!(shader->frontend = shader_select_frontend(shader->source_type)))
2346 {
2347 FIXME("Unable to find frontend for shader.\n");
2350 }
2351
2352 fe = shader->frontend;
2353 if (!(fe_data = fe->shader_init(desc->byte_code, desc->byte_code_size, &shader->output_signature)))
2354 {
2355 WARN("Failed to initialise frontend data.\n");
2358 }
2359
2360 fe->shader_read_header(fe_data, &ptr, &shader_version);
2361 while (!fe->shader_is_end(fe_data, &ptr))
2362 fe->shader_read_instruction(fe_data, &ptr, &ins);
2363
2364 fe->shader_free(fe_data);
2365
2366 shader->byte_code_size = (ptr - desc->byte_code) * sizeof(*ptr);
2367
2368 if (!(shader->byte_code = malloc(shader->byte_code_size)))
2369 {
2371 return E_OUTOFMEMORY;
2372 }
2373 memcpy(shader->byte_code, desc->byte_code, shader->byte_code_size);
2374
2375 shader->function = shader->byte_code;
2376 shader->functionLength = shader->byte_code_size;
2377 }
2378 else
2379 {
2380 unsigned int max_version;
2381
2382 if (!(shader->byte_code = malloc(desc->byte_code_size)))
2383 {
2385 return E_OUTOFMEMORY;
2386 }
2387 memcpy(shader->byte_code, desc->byte_code, desc->byte_code_size);
2388 shader->byte_code_size = desc->byte_code_size;
2389
2390 max_version = shader_max_version_from_feature_level(shader->device->cs->c.state->feature_level);
2391 if (FAILED(hr = wined3d_shader_extract_from_dxbc(shader, max_version, &shader->source_type)))
2392 {
2394 return hr;
2395 }
2396
2397 if (!(shader->frontend = shader_select_frontend(shader->source_type)))
2398 {
2399 FIXME("Unable to find frontend for shader.\n");
2402 }
2403 }
2404
2405 if (TRACE_ON(d3d_shader))
2406 {
2407 if (shader->source_type == VKD3D_SHADER_SOURCE_D3D_BYTECODE)
2408 shader_trace(shader->function, shader->functionLength, shader->source_type);
2409 else
2410 shader_trace(shader->byte_code, shader->byte_code_size, shader->source_type);
2411 }
2412
2414 {
2416 return hr;
2417 if (!shader->function)
2418 return S_OK;
2419 }
2420
2421 fe = shader->frontend;
2422 if (!(shader->frontend_data = fe->shader_init(shader->function,
2423 shader->functionLength, &shader->output_signature)))
2424 {
2425 FIXME("Failed to initialize frontend.\n");
2427 }
2428
2429 if (FAILED(hr = shader_get_registers_used(shader, float_const_count)))
2430 return hr;
2431
2432 shader->load_local_constsF = shader->lconst_inf_or_nan;
2433
2434 if (version->type != type)
2435 {
2436 WARN("Wrong shader type %s.\n", debug_shader_type(reg_maps->shader_version.type));
2438 }
2439 if (!shader->is_ffp_vs && !shader->is_ffp_ps
2440 && version->major > shader_max_version_from_feature_level(shader->device->cs->c.state->feature_level))
2441 {
2442 WARN("Shader version %u not supported by this device.\n", version->major);
2444 }
2445 switch (type)
2446 {
2448 for (unsigned int i = 0; i < shader->input_signature.element_count; ++i)
2449 {
2450 const struct wined3d_shader_signature_element *input = &shader->input_signature.elements[i];
2451
2452 if (!(reg_maps->input_registers & (1u << input->register_idx)) || !input->semantic_name)
2453 continue;
2454
2455 shader->u.vs.attributes[input->register_idx].usage =
2456 shader_usage_from_semantic_name(input->semantic_name);
2457 shader->u.vs.attributes[input->register_idx].usage_idx = input->semantic_idx;
2458 }
2459
2460 if (reg_maps->usesrelconstF && !list_empty(&shader->constantsF))
2461 shader->load_local_constsF = TRUE;
2462
2463 backend_version = d3d_info->limits.vs_version;
2464 break;
2465
2467 backend_version = d3d_info->limits.hs_version;
2468 break;
2470 backend_version = d3d_info->limits.ds_version;
2471 break;
2473 backend_version = d3d_info->limits.gs_version;
2474 break;
2476 for (unsigned int i = 0; i < MAX_REG_INPUT; ++i)
2477 {
2478 if (shader->u.ps.input_reg_used & (1u << i))
2479 {
2480 ++num_regs_used;
2481 highest_reg_used = i;
2482 }
2483 }
2484
2485 /* Don't do any register mapping magic if it is not needed,
2486 * or if we can't achieve anything anyway. */
2487 if (highest_reg_used < (d3d_info->limits.varying_count / 4)
2488 || num_regs_used > (d3d_info->limits.varying_count / 4)
2489 || shader->reg_maps.shader_version.major >= 4)
2490 {
2491 if (num_regs_used > (d3d_info->limits.varying_count / 4))
2492 {
2493 /* This happens with relative addressing. The input mapper
2494 * function warns about this if the higher registers are
2495 * declared too, so don't write a FIXME here. */
2496 WARN("More varying registers used than supported.\n");
2497 }
2498
2499 for (unsigned int i = 0; i < MAX_REG_INPUT; ++i)
2500 shader->u.ps.input_reg_map[i] = i;
2501
2502 shader->u.ps.declared_in_count = highest_reg_used + 1;
2503 }
2504 else
2505 {
2506 shader->u.ps.declared_in_count = 0;
2507 for (unsigned int i = 0; i < MAX_REG_INPUT; ++i)
2508 {
2509 if (shader->u.ps.input_reg_used & (1u << i))
2510 shader->u.ps.input_reg_map[i] = shader->u.ps.declared_in_count++;
2511 else
2512 shader->u.ps.input_reg_map[i] = ~0u;
2513 }
2514 }
2515
2516 backend_version = d3d_info->limits.ps_version;
2517 break;
2519 backend_version = d3d_info->limits.cs_version;
2520 break;
2521 default:
2522 FIXME("No backend version-checking for this shader type.\n");
2523 backend_version = 0;
2524 }
2525 if (version->major > backend_version)
2526 {
2527 WARN("Shader version %u.%u not supported by the current shader backend.\n",
2528 version->major, version->minor);
2530 }
2531
2532 return WINED3D_OK;
2533}
static int list_empty(struct list_entry *head)
Definition: list.h:58
static const struct wined3d_shader_frontend * shader_select_frontend(enum vkd3d_shader_source_type source_type)
Definition: shader.c:395
static HRESULT geometry_shader_init_stream_output(struct wined3d_shader *shader, const struct wined3d_stream_output_desc *so_desc)
Definition: shader.c:2194
static HRESULT shader_get_registers_used(struct wined3d_shader *shader, DWORD constf_size)
Definition: shader.c:1003
static unsigned int shader_max_version_from_feature_level(enum wined3d_feature_level level)
Definition: shader.c:2080
static enum wined3d_decl_usage shader_usage_from_semantic_name(const char *name)
Definition: shader.c:342
static void shader_trace(const void *code, size_t size, enum vkd3d_shader_source_type source_type)
Definition: shader.c:2271
#define TRACE_ON(x)
Definition: compat.h:75
static const WCHAR version[]
Definition: asmname.c:66
GLenum GLenum GLenum input
Definition: glext.h:9031
HRESULT wined3d_shader_extract_from_dxbc(struct wined3d_shader *shader, unsigned int max_shader_version, enum vkd3d_shader_source_type *source_type)
Definition: shader_sm4.c:2085

Referenced by geometry_shader_init(), pixel_shader_init(), vertex_shader_init(), wined3d_shader_create_cs(), wined3d_shader_create_ds(), wined3d_shader_create_hs(), and wined3d_shader_init_object().

◆ shader_set_limits()

static void shader_set_limits ( struct wined3d_shader *  shader)
static

Definition at line 565 of file shader.c.

566{
567 static const struct limits_entry
568 {
569 unsigned int min_version;
570 unsigned int max_version;
571 struct wined3d_shader_limits limits;
572 }
573 vs_limits[] =
574 {
575 /* min_version, max_version, sampler, constant_int, constant_float, constant_bool, packed_output, packed_input */
576 {WINED3D_SHADER_VERSION(1, 0), WINED3D_SHADER_VERSION(1, 1), { 0, 0, 256, 0, 12, 0}},
577 {WINED3D_SHADER_VERSION(2, 0), WINED3D_SHADER_VERSION(2, 1), { 0, 16, 256, 16, 12, 0}},
578 /* DX10 cards on Windows advertise a D3D9 constant limit of 256
579 * even though they are capable of supporting much more (GL
580 * drivers advertise 1024). d3d9.dll and d3d8.dll clamp the
581 * wined3d-advertised maximum. Clamp the constant limit for <= 3.0
582 * shaders to 256. */
583 {WINED3D_SHADER_VERSION(3, 0), WINED3D_SHADER_VERSION(3, 0), { 4, 16, 256, 16, 12, 0}},
584 {WINED3D_SHADER_VERSION(4, 0), WINED3D_SHADER_VERSION(4, 0), {16, 0, 0, 0, 16, 0}},
585 {WINED3D_SHADER_VERSION(4, 1), WINED3D_SHADER_VERSION(5, 0), {16, 0, 0, 0, 32, 0}},
586 {0}
587 },
588 hs_limits[] =
589 {
590 /* min_version, max_version, sampler, constant_int, constant_float, constant_bool, packed_output, packet_input */
591 {WINED3D_SHADER_VERSION(5, 0), WINED3D_SHADER_VERSION(5, 0), {16, 0, 0, 0, 32, 32}},
592 },
593 ds_limits[] =
594 {
595 /* min_version, max_version, sampler, constant_int, constant_float, constant_bool, packed_output, packet_input */
596 {WINED3D_SHADER_VERSION(5, 0), WINED3D_SHADER_VERSION(5, 0), {16, 0, 0, 0, 32, 32}},
597 },
598 gs_limits[] =
599 {
600 /* min_version, max_version, sampler, constant_int, constant_float, constant_bool, packed_output, packed_input */
601 {WINED3D_SHADER_VERSION(4, 0), WINED3D_SHADER_VERSION(4, 0), {16, 0, 0, 0, 32, 16}},
602 {WINED3D_SHADER_VERSION(4, 1), WINED3D_SHADER_VERSION(5, 0), {16, 0, 0, 0, 32, 32}},
603 {0}
604 },
605 ps_limits[] =
606 {
607 /* min_version, max_version, sampler, constant_int, constant_float, constant_bool, packed_output, packed_input */
608 {WINED3D_SHADER_VERSION(1, 0), WINED3D_SHADER_VERSION(1, 3), { 4, 0, 8, 0, 0, 0}},
609 {WINED3D_SHADER_VERSION(1, 4), WINED3D_SHADER_VERSION(1, 4), { 6, 0, 8, 0, 0, 0}},
610 {WINED3D_SHADER_VERSION(2, 0), WINED3D_SHADER_VERSION(2, 0), {16, 0, 32, 0, 0, 0}},
611 {WINED3D_SHADER_VERSION(2, 1), WINED3D_SHADER_VERSION(2, 1), {16, 16, 32, 16, 0, 0}},
612 {WINED3D_SHADER_VERSION(3, 0), WINED3D_SHADER_VERSION(3, 0), {16, 16, 224, 16, 0, 10}},
613 {WINED3D_SHADER_VERSION(4, 0), WINED3D_SHADER_VERSION(5, 0), {16, 0, 0, 0, 0, 32}},
614 {0}
615 },
616 cs_limits[] =
617 {
618 /* min_version, max_version, sampler, constant_int, constant_float, constant_bool, packed_output, packed_input */
619 {WINED3D_SHADER_VERSION(5, 0), WINED3D_SHADER_VERSION(5, 0), {16, 0, 0, 0, 0, 0}},
620 };
621 const struct limits_entry *limits_array;
622 DWORD shader_version = WINED3D_SHADER_VERSION(shader->reg_maps.shader_version.major,
623 shader->reg_maps.shader_version.minor);
624 int i = 0;
625
626 switch (shader->reg_maps.shader_version.type)
627 {
628 default:
629 FIXME("Unexpected shader type %u found.\n", shader->reg_maps.shader_version.type);
630 /* Fall-through. */
632 limits_array = vs_limits;
633 break;
635 limits_array = hs_limits;
636 break;
638 limits_array = ds_limits;
639 break;
641 limits_array = gs_limits;
642 break;
644 limits_array = ps_limits;
645 break;
647 limits_array = cs_limits;
648 break;
649 }
650
651 while (limits_array[i].min_version && limits_array[i].min_version <= shader_version)
652 {
653 if (shader_version <= limits_array[i].max_version)
654 {
655 shader->limits = &limits_array[i].limits;
656 break;
657 }
658 ++i;
659 }
660 if (!shader->limits)
661 {
662 FIXME("Unexpected shader version \"%u.%u\" (shader type %u).\n",
663 shader->reg_maps.shader_version.major,
664 shader->reg_maps.shader_version.minor,
665 shader->reg_maps.shader_version.type);
666 shader->limits = &limits_array[max(0, i - 1)].limits;
667 }
668}
unsigned min_version
Definition: lex.c:39
#define WINED3D_SHADER_VERSION(major, minor)

Referenced by geometry_shader_init_stream_output(), and shader_get_registers_used().

◆ shader_signature_from_semantic()

static void shader_signature_from_semantic ( struct wined3d_shader_signature_element *  e,
const struct wined3d_shader_semantic *  s 
)
static

Definition at line 371 of file shader.c.

373{
374 e->semantic_name = shader_semantic_name_from_usage(s->usage);
375 e->semantic_idx = s->usage_idx;
376 e->stream_idx = 0;
377 e->sysval_semantic = shader_sysval_semantic_from_usage(s->usage);
378 e->component_type = WINED3D_TYPE_FLOAT;
379 e->register_idx = s->reg.reg.idx[0].offset;
380 e->mask = s->reg.write_mask;
381}
static enum wined3d_sysval_semantic shader_sysval_semantic_from_usage(enum wined3d_decl_usage usage)
Definition: shader.c:355
@ WINED3D_TYPE_FLOAT

Referenced by shader_get_registers_used().

◆ shader_signature_from_usage()

static void shader_signature_from_usage ( struct wined3d_shader_signature_element *  e,
enum wined3d_decl_usage  usage,
UINT  usage_idx,
UINT  reg_idx,
DWORD  write_mask 
)
static

Definition at line 383 of file shader.c.

385{
386 e->semantic_name = shader_semantic_name_from_usage(usage);
387 e->semantic_idx = usage_idx;
388 e->stream_idx = 0;
389 e->sysval_semantic = shader_sysval_semantic_from_usage(usage);
390 e->component_type = WINED3D_TYPE_FLOAT;
391 e->register_idx = reg_idx;
392 e->mask = write_mask;
393}
BYTE usage_idx

Referenced by shader_get_registers_used().

◆ shader_sysval_semantic_from_usage()

static enum wined3d_sysval_semantic shader_sysval_semantic_from_usage ( enum wined3d_decl_usage  usage)
static

Definition at line 355 of file shader.c.

356{
357 switch (usage)
358 {
360 return WINED3D_SV_POSITION;
361 default:
362 return 0;
363 }
364}

Referenced by shader_signature_from_semantic(), and shader_signature_from_usage().

◆ shader_trace()

static void shader_trace ( const void *  code,
size_t  size,
enum vkd3d_shader_source_type  source_type 
)
static

Definition at line 2271 of file shader.c.

2272{
2274 struct vkd3d_shader_code d3d_asm;
2275 const char *ptr, *end, *line;
2276 char *messages;
2277 int ret;
2278
2279 static const struct vkd3d_shader_compile_option compile_options[] =
2280 {
2282 };
2283
2284 info.source.code = code;
2285 info.source.size = size;
2286 info.source_type = source_type;
2287 info.target_type = VKD3D_SHADER_TARGET_D3D_ASM;
2288 info.options = compile_options;
2289 info.option_count = ARRAY_SIZE(compile_options);
2290 info.log_level = VKD3D_SHADER_LOG_WARNING;
2291
2292 ret = vkd3d_shader_compile(&info, &d3d_asm, &messages);
2293 if (messages && *messages && FIXME_ON(d3d_shader))
2294 {
2295 FIXME("Shader log:\n");
2296 ptr = messages;
2297 end = ptr + strlen(ptr);
2298 while ((line = wined3d_get_line(&ptr, end)))
2299 FIXME(" %.*s", (int)(ptr - line), line);
2300 FIXME("\n");
2301 }
2303
2304 if (ret < 0)
2305 {
2306 ERR("Failed to disassemble, ret %d.\n", ret);
2307 return;
2308 }
2309
2310 ptr = d3d_asm.code;
2311 end = ptr + d3d_asm.size;
2312 while ((line = wined3d_get_line(&ptr, end)))
2313 TRACE(" %.*s", (int)(ptr - line), line);
2314 TRACE("\n");
2315
2317}
#define FIXME_ON(ch)
Definition: debug.h:418
Definition: inflate.c:139
Definition: parser.c:49
@ VKD3D_SHADER_COMPILE_OPTION_API_VERSION
Definition: vkd3d_shader.h:279
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_VERSION_1_6
Definition: vkd3d_shader.h:51
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_D3D_ASM
VKD3D_SHADER_API void vkd3d_shader_free_messages(char *messages)
static const char * wined3d_get_line(const char **ptr, const char *end)

Referenced by shader_set_function().

◆ shader_usage_from_semantic_name()

static enum wined3d_decl_usage shader_usage_from_semantic_name ( const char *  name)
static

Definition at line 342 of file shader.c.

343{
344 unsigned int i;
345
346 for (i = 0; i < ARRAY_SIZE(semantic_names); ++i)
347 {
348 if (!strcmp(name, semantic_names[i]))
349 return i;
350 }
351
352 return ~0U;
353}

Referenced by shader_set_function().

◆ shader_vaddline()

int shader_vaddline ( struct wined3d_string_buffer *  buffer,
const char *  format,
va_list  args 
)

Definition at line 453 of file shader.c.

454{
455 unsigned int rem;
456 int rc;
457
458 rem = buffer->buffer_size - buffer->content_size;
459 rc = vsnprintf(&buffer->buffer[buffer->content_size], rem, format, args);
460 if (rc < 0 /* C89 */ || (unsigned int)rc >= rem /* C99 */)
461 return rc;
462
463 buffer->content_size += rc;
464 return 0;
465}
#define vsnprintf
Definition: acwin.h:108

Referenced by PRINTF_ATTR(), shader_addline(), and string_buffer_vsprintf().

◆ string_buffer_clear()

◆ string_buffer_free()

◆ string_buffer_get()

Definition at line 484 of file shader.c.

485{
487
488 if (list_empty(&list->list))
489 {
490 buffer = malloc(sizeof(*buffer));
492 {
493 ERR("Couldn't allocate buffer for temporary string.\n");
494 free(buffer);
495 return NULL;
496 }
497 }
498 else
499 {
501 list_remove(&buffer->entry);
502 }
504 return buffer;
505}
Definition: list.h:39
list(size_type __n, const_reference __val=_STLP_DEFAULT_CONSTRUCTED(value_type), const allocator_type &__a=allocator_type())
Definition: _list.h:306
void string_buffer_clear(struct wined3d_string_buffer *buffer)
Definition: shader.c:411
BOOL string_buffer_init(struct wined3d_string_buffer *buffer)
Definition: shader.c:417
Definition: list.h:15
#define LIST_ENTRY(type)
Definition: queue.h:175

Referenced by glsl_blitter_generate_program(), set_glsl_shader_program(), shader_glsl_add_dst_param(), shader_glsl_add_src_param_ext(), shader_glsl_atomic(), shader_glsl_color_correction(), shader_glsl_generate_color_output(), shader_glsl_generate_ffp_fragment_shader(), shader_glsl_generate_ffp_vertex_shader(), shader_glsl_get_sample_function(), shader_glsl_init_ps_uniform_locations(), shader_glsl_init_transform_feedback(), shader_glsl_init_uniform_block_bindings(), shader_glsl_init_vs_uniform_locations(), shader_glsl_ld_raw_structured(), shader_glsl_load_icb(), shader_glsl_load_images(), shader_glsl_load_samplers_range(), shader_glsl_loop(), shader_glsl_setup_vs3_output(), shader_glsl_store_raw_structured(), shader_glsl_texreg2ar(), and shader_glsl_texreg2gb().

◆ string_buffer_init()

BOOL string_buffer_init ( struct wined3d_string_buffer *  buffer)

Definition at line 417 of file shader.c.

418{
419 buffer->buffer_size = 32;
420 if (!(buffer->buffer = malloc(buffer->buffer_size)))
421 {
422 ERR("Failed to allocate shader buffer memory.\n");
423 return FALSE;
424 }
425
427 return TRUE;
428}

Referenced by ffp_hlsl_compile_ps(), ffp_hlsl_compile_vs(), ffp_hlsl_generate_vertex_shader(), shader_glsl_alloc(), and string_buffer_get().

◆ string_buffer_list_cleanup()

void string_buffer_list_cleanup ( struct wined3d_string_buffer_list *  list)

Definition at line 544 of file shader.c.

545{
546 struct wined3d_string_buffer *buffer, *buffer_next;
547
549 {
551 free(buffer);
552 }
554}
void string_buffer_free(struct wined3d_string_buffer *buffer)
Definition: shader.c:430

Referenced by glsl_blitter_destroy(), and shader_glsl_free().

◆ string_buffer_list_init()

void string_buffer_list_init ( struct wined3d_string_buffer_list *  list)

Definition at line 539 of file shader.c.

540{
542}

Referenced by shader_glsl_alloc(), and wined3d_glsl_blitter_create().

◆ string_buffer_release()

◆ string_buffer_resize()

BOOL string_buffer_resize ( struct wined3d_string_buffer *  buffer,
int  rc 
)

Definition at line 435 of file shader.c.

436{
437 char *new_buffer;
438 unsigned int new_buffer_size = buffer->buffer_size * 2;
439
440 while (rc > 0 && (unsigned int)rc >= new_buffer_size - buffer->content_size)
441 new_buffer_size *= 2;
442 if (!(new_buffer = realloc(buffer->buffer, new_buffer_size)))
443 {
444 ERR("Failed to grow buffer.\n");
445 buffer->buffer[buffer->content_size] = '\0';
446 return FALSE;
447 }
448 buffer->buffer = new_buffer;
449 buffer->buffer_size = new_buffer_size;
450 return TRUE;
451}

Referenced by PRINTF_ATTR(), shader_addline(), and string_buffer_sprintf().

◆ string_buffer_sprintf()

◆ string_buffer_vsprintf()

static int string_buffer_vsprintf ( struct wined3d_string_buffer *  buffer,
const char *  format,
va_list  args 
)
static

Definition at line 507 of file shader.c.

508{
509 if (!buffer)
510 return 0;
513}

Referenced by string_buffer_sprintf().

◆ vertex_shader_init()

static HRESULT vertex_shader_init ( struct wined3d_shader *  shader,
struct wined3d_device *  device,
const struct wined3d_shader_desc *  desc,
void *  parent,
const struct wined3d_parent_ops *  parent_ops 
)
static

Definition at line 2803 of file shader.c.

2805{
2806 HRESULT hr;
2807
2808 shader_init(shader, device, parent, parent_ops);
2809
2811 WINED3D_SHADER_TYPE_VERTEX, NULL, device->adapter->d3d_info.limits.vs_uniform_count)))
2812 {
2814 return hr;
2815 }
2816
2817 return WINED3D_OK;
2818}

Referenced by wined3d_shader_create_vs().

◆ vkd3d_shader_visibility_from_wined3d()

enum vkd3d_shader_visibility vkd3d_shader_visibility_from_wined3d ( enum wined3d_shader_type  shader_type)

Definition at line 309 of file shader.c.

310{
311 switch (shader_type)
312 {
325 default:
326 ERR("Invalid shader type %s.\n", debug_shader_type(shader_type));
328 }
329}
@ 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

Referenced by create_combined_resource_sampler_bindings(), create_resource_bindings(), and shader_spirv_resource_bindings_init().

◆ vshader_get_input()

bool vshader_get_input ( const struct wined3d_shader *  shader,
uint8_t  usage_req,
uint8_t  usage_idx_req,
unsigned int *  regnum 
)

Definition at line 2766 of file shader.c.

2768{
2769 uint32_t map = shader->reg_maps.input_registers & 0xffff;
2770 unsigned int i;
2771
2772 while (map)
2773 {
2775 if (match_usage(shader->u.vs.attributes[i].usage,
2776 shader->u.vs.attributes[i].usage_idx, usage_req, usage_idx_req))
2777 {
2778 *regnum = i;
2779 return true;
2780 }
2781 }
2782
2783 return false;
2784}
static BOOL match_usage(BYTE usage1, BYTE usage_idx1, BYTE usage2, BYTE usage_idx2)
Definition: shader.c:2752
static int wined3d_bit_scan(unsigned int *x)
Definition: wined3d.h:2982

Referenced by wined3d_stream_info_from_declaration().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( d3d_shader  )

◆ wined3d_insert_interpolation_mode()

static void wined3d_insert_interpolation_mode ( uint32_t *  packed_interpolation_mode,
unsigned int  register_idx,
enum wined3d_shader_interpolation_mode  mode 
)
static

Definition at line 958 of file shader.c.

960{
962 FIXME("Unexpected interpolation mode %#x.\n", mode);
963
964 wined3d_insert_bits(packed_interpolation_mode,
966}
GLenum mode
Definition: glext.h:6217
@ WINED3DSIM_LINEAR_NOPERSPECTIVE_SAMPLE
#define WINED3D_PACKED_INTERPOLATION_BIT_COUNT

Referenced by shader_get_registers_used().

◆ wined3d_shader_create_cs()

HRESULT CDECL wined3d_shader_create_cs ( struct wined3d_device *  device,
const struct wined3d_shader_desc *  desc,
void *  parent,
const struct wined3d_parent_ops *  parent_ops,
struct wined3d_shader **  shader 
)

Definition at line 3176 of file shader.c.

3178{
3179 struct wined3d_shader *object;
3180 HRESULT hr;
3181
3182 TRACE("device %p, desc %p, parent %p, parent_ops %p, shader %p.\n",
3184
3185 if (!(object = calloc(1, sizeof(*object))))
3186 return E_OUTOFMEMORY;
3187
3189
3191 {
3192 shader_cleanup(object);
3193 free(object);
3194 return hr;
3195 }
3196
3198
3199 TRACE("Created compute shader %p.\n", object);
3200 *shader = object;
3201
3202 return WINED3D_OK;
3203}
void wined3d_cs_init_object(struct wined3d_cs *cs, void(*callback)(void *object), void *object)
Definition: cs.c:2304
static void wined3d_shader_init_object(void *object)
Definition: shader.c:2544
const struct wined3d_parent_ops * parent_ops

Referenced by d3d11_compute_shader_init().

◆ wined3d_shader_create_ds()

HRESULT CDECL wined3d_shader_create_ds ( struct wined3d_device *  device,
const struct wined3d_shader_desc *  desc,
void *  parent,
const struct wined3d_parent_ops *  parent_ops,
struct wined3d_shader **  shader 
)

Definition at line 3205 of file shader.c.

3207{
3208 struct wined3d_shader *object;
3209 HRESULT hr;
3210
3211 TRACE("device %p, desc %p, parent %p, parent_ops %p, shader %p.\n",
3213
3214 if (!(object = calloc(1, sizeof(*object))))
3215 return E_OUTOFMEMORY;
3216
3218
3220 {
3221 shader_cleanup(object);
3222 free(object);
3223 return hr;
3224 }
3225
3227
3228 TRACE("Created domain shader %p.\n", object);
3229 *shader = object;
3230
3231 return WINED3D_OK;
3232}

Referenced by d3d11_domain_shader_init().

◆ wined3d_shader_create_ffp_ps()

HRESULT wined3d_shader_create_ffp_ps ( struct wined3d_device *  device,
const struct ffp_frag_settings *  settings,
struct wined3d_shader **  shader 
)

Definition at line 3370 of file shader.c.

3372{
3373 struct wined3d_shader *object;
3374
3375 if (!(object = calloc(1, sizeof(*object))))
3376 return E_OUTOFMEMORY;
3377
3379 object->is_ffp_ps = true;
3380 if (!(object->byte_code = malloc(sizeof(*settings))))
3381 {
3382 free(object);
3383 return E_OUTOFMEMORY;
3384 }
3385 memcpy(object->byte_code, settings, sizeof(*settings));
3386
3388
3389 TRACE("Created FFP pixel shader %p.\n", object);
3390 *shader = object;
3391
3392 return WINED3D_OK;
3393}
struct mke2fs_defaults settings[]
const struct wined3d_parent_ops wined3d_null_parent_ops
Definition: directx.c:3472

Referenced by get_ffp_pixel_shader().

◆ wined3d_shader_create_ffp_vs()

HRESULT wined3d_shader_create_ffp_vs ( struct wined3d_device *  device,
const struct wined3d_ffp_vs_settings *  settings,
struct wined3d_shader **  shader 
)

Definition at line 3345 of file shader.c.

3347{
3348 struct wined3d_shader *object;
3349
3350 if (!(object = calloc(1, sizeof(*object))))
3351 return E_OUTOFMEMORY;
3352
3354 object->is_ffp_vs = true;
3355 if (!(object->byte_code = malloc(sizeof(*settings))))
3356 {
3357 free(object);
3358 return E_OUTOFMEMORY;
3359 }
3360 memcpy(object->byte_code, settings, sizeof(*settings));
3361
3363
3364 TRACE("Created FFP vertex shader %p.\n", object);
3365 *shader = object;
3366
3367 return WINED3D_OK;
3368}

Referenced by get_ffp_vertex_shader().

◆ wined3d_shader_create_gs()

HRESULT CDECL wined3d_shader_create_gs ( struct wined3d_device *  device,
const struct wined3d_shader_desc *  desc,
const struct wined3d_stream_output_desc *  so_desc,
void *  parent,
const struct wined3d_parent_ops *  parent_ops,
struct wined3d_shader **  shader 
)

Definition at line 3234 of file shader.c.

3237{
3238 struct wined3d_shader *object;
3239 HRESULT hr;
3240
3241 TRACE("device %p, desc %p, so_desc %p, parent %p, parent_ops %p, shader %p.\n",
3242 device, desc, so_desc, parent, parent_ops, shader);
3243
3244 if (!(object = calloc(1, sizeof(*object))))
3245 return E_OUTOFMEMORY;
3246
3247 if (FAILED(hr = geometry_shader_init(object, device, desc, so_desc, parent, parent_ops)))
3248 {
3249 WARN("Failed to initialize geometry shader, hr %#lx.\n", hr);
3250 free(object);
3251 return hr;
3252 }
3253
3255
3256 TRACE("Created geometry shader %p.\n", object);
3257 *shader = object;
3258
3259 return WINED3D_OK;
3260}
static HRESULT geometry_shader_init(struct wined3d_shader *shader, struct wined3d_device *device, const struct wined3d_shader_desc *desc, const struct wined3d_stream_output_desc *so_desc, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: shader.c:2820

Referenced by d3d_geometry_shader_init().

◆ wined3d_shader_create_hs()

HRESULT CDECL wined3d_shader_create_hs ( struct wined3d_device *  device,
const struct wined3d_shader_desc *  desc,
void *  parent,
const struct wined3d_parent_ops *  parent_ops,
struct wined3d_shader **  shader 
)

Definition at line 3262 of file shader.c.

3264{
3265 struct wined3d_shader *object;
3266 HRESULT hr;
3267
3268 TRACE("device %p, desc %p, parent %p, parent_ops %p, shader %p.\n",
3270
3271 if (!(object = calloc(1, sizeof(*object))))
3272 return E_OUTOFMEMORY;
3273
3275
3277 {
3278 shader_cleanup(object);
3279 free(object);
3280 return hr;
3281 }
3282
3284
3285 TRACE("Created hull shader %p.\n", object);
3286 *shader = object;
3287
3288 return WINED3D_OK;
3289}

Referenced by d3d11_hull_shader_init().

◆ wined3d_shader_create_ps()

HRESULT CDECL wined3d_shader_create_ps ( struct wined3d_device *  device,
const struct wined3d_shader_desc *  desc,
void *  parent,
const struct wined3d_parent_ops *  parent_ops,
struct wined3d_shader **  shader 
)

Definition at line 3291 of file shader.c.

3293{
3294 struct wined3d_shader *object;
3295 HRESULT hr;
3296
3297 TRACE("device %p, desc %p, parent %p, parent_ops %p, shader %p.\n",
3299
3300 if (!(object = calloc(1, sizeof(*object))))
3301 return E_OUTOFMEMORY;
3302
3304 {
3305 WARN("Failed to initialize pixel shader, hr %#lx.\n", hr);
3306 free(object);
3307 return hr;
3308 }
3309
3311
3312 TRACE("Created pixel shader %p.\n", object);
3313 *shader = object;
3314
3315 return WINED3D_OK;
3316}
static HRESULT pixel_shader_init(struct wined3d_shader *shader, struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: shader.c:3135

Referenced by d3d8_pixel_shader_init(), d3d_pixel_shader_init(), and pixelshader_init().

◆ wined3d_shader_create_vs()

HRESULT CDECL wined3d_shader_create_vs ( struct wined3d_device *  device,
const struct wined3d_shader_desc *  desc,
void *  parent,
const struct wined3d_parent_ops *  parent_ops,
struct wined3d_shader **  shader 
)

Definition at line 3318 of file shader.c.

3320{
3321 struct wined3d_shader *object;
3322 HRESULT hr;
3323
3324 TRACE("device %p, desc %p, parent %p, parent_ops %p, shader %p.\n",
3326
3327 if (!(object = calloc(1, sizeof(*object))))
3328 return E_OUTOFMEMORY;
3329
3331 {
3332 WARN("Failed to initialize vertex shader, hr %#lx.\n", hr);
3333 free(object);
3334 return hr;
3335 }
3336
3338
3339 TRACE("Created vertex shader %p.\n", object);
3340 *shader = object;
3341
3342 return WINED3D_OK;
3343}
static HRESULT vertex_shader_init(struct wined3d_shader *shader, struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: shader.c:2803

Referenced by d3d8_vertex_shader_init(), d3d_vertex_shader_init(), and vertexshader_init().

◆ wined3d_shader_decref()

ULONG CDECL wined3d_shader_decref ( struct wined3d_shader *  shader)

Definition at line 2588 of file shader.c.

2589{
2590 unsigned int refcount = InterlockedDecrement(&shader->ref);
2591
2592 TRACE("%p decreasing refcount to %u.\n", shader, refcount);
2593
2594 if (!refcount)
2595 {
2597 shader->parent_ops->wined3d_object_destroyed(shader->parent);
2600 }
2601
2602 return refcount;
2603}
#define InterlockedDecrement
Definition: armddk.h:52
void wined3d_cs_destroy_object(struct wined3d_cs *cs, void(*callback)(void *object), void *object)
Definition: cs.c:2299
static void wined3d_shader_destroy_object(void *object)
Definition: shader.c:2580
void WINAPI wined3d_mutex_unlock(void)
Definition: wined3d_main.c:544
void WINAPI wined3d_mutex_lock(void)
Definition: wined3d_main.c:539

Referenced by d3d11_compute_shader_Release(), d3d11_domain_shader_Release(), d3d11_geometry_shader_Release(), d3d11_hull_shader_Release(), d3d11_pixel_shader_Release(), d3d11_vertex_shader_Release(), d3d8_pixel_shader_destroy(), d3d8_vertex_shader_destroy(), d3d9_pixelshader_Release(), d3d9_vertexshader_Release(), device_free_ffp_pixel_shader(), device_free_ffp_vertex_shader(), state_unbind_resources(), wined3d_cs_packet_decref_objects(), wined3d_device_context_set_shader(), wined3d_stateblock_capture(), wined3d_stateblock_set_pixel_shader(), wined3d_stateblock_set_vertex_shader(), and wined3d_stateblock_state_cleanup().

◆ wined3d_shader_destroy_object()

static void wined3d_shader_destroy_object ( void *  object)
static

Definition at line 2580 of file shader.c.

2581{
2582 TRACE("object %p.\n", object);
2583
2584 shader_cleanup(object);
2585 free(object);
2586}

Referenced by wined3d_shader_decref().

◆ wined3d_shader_get_byte_code()

HRESULT CDECL wined3d_shader_get_byte_code ( const struct wined3d_shader *  shader,
void *  byte_code,
UINT *  byte_code_size 
)

Definition at line 2612 of file shader.c.

2614{
2615 TRACE("shader %p, byte_code %p, byte_code_size %p.\n", shader, byte_code, byte_code_size);
2616
2617 if (!byte_code)
2618 {
2619 *byte_code_size = shader->byte_code_size;
2620 return WINED3D_OK;
2621 }
2622
2623 if (*byte_code_size < shader->byte_code_size)
2624 {
2625 /* MSDN claims (for d3d8 at least) that if *byte_code_size is smaller
2626 * than the required size we should write the required size and
2627 * return D3DERR_MOREDATA. That's not actually true. */
2629 }
2630
2631 memcpy(byte_code, shader->byte_code, shader->byte_code_size);
2632
2633 return WINED3D_OK;
2634}

Referenced by d3d8_device_GetPixelShaderFunction(), d3d8_device_GetVertexShaderFunction(), d3d9_pixelshader_GetFunction(), and d3d9_vertexshader_GetFunction().

◆ wined3d_shader_get_parent()

◆ wined3d_shader_incref()

◆ wined3d_shader_init_object()

static void wined3d_shader_init_object ( void *  object)
static

Definition at line 2544 of file shader.c.

2545{
2546 struct wined3d_shader *shader = object;
2547 struct wined3d_device *device = shader->device;
2548
2549 TRACE("shader %p.\n", shader);
2550
2551 list_add_head(&device->shaders, &shader->shader_list_entry);
2552
2553 if (shader->is_ffp_vs)
2554 {
2555 struct wined3d_ffp_vs_settings *settings = shader->byte_code;
2557
2559 return;
2560 free(settings);
2562 device->adapter->d3d_info.limits.vs_uniform_count);
2563 }
2564
2565 if (shader->is_ffp_ps)
2566 {
2567 struct ffp_frag_settings *settings = shader->byte_code;
2569
2571 return;
2572 free(settings);
2574 device->adapter->d3d_info.limits.ps_uniform_count);
2575 }
2576
2577 device->shader_backend->shader_precompile(device->shader_priv, shader);
2578}
bool ffp_hlsl_compile_ps(const struct ffp_frag_settings *settings, struct wined3d_shader_desc *shader_desc)
Definition: ffp_hlsl.c:971
bool ffp_hlsl_compile_vs(const struct wined3d_ffp_vs_settings *settings, struct wined3d_shader_desc *shader_desc, struct wined3d_device *device)
Definition: ffp_hlsl.c:944

Referenced by wined3d_shader_create_cs(), wined3d_shader_create_ds(), wined3d_shader_create_ffp_ps(), wined3d_shader_create_ffp_vs(), wined3d_shader_create_gs(), wined3d_shader_create_hs(), wined3d_shader_create_ps(), and wined3d_shader_create_vs().

◆ wined3d_shader_set_local_constants_float()

HRESULT CDECL wined3d_shader_set_local_constants_float ( struct wined3d_shader *  shader,
UINT  start_idx,
const float *  src_data,
UINT  count 
)

Definition at line 2637 of file shader.c.

2639{
2640 UINT end_idx = start_idx + count;
2641 UINT i;
2642
2643 TRACE("shader %p, start_idx %u, src_data %p, count %u.\n", shader, start_idx, src_data, count);
2644
2645 if (end_idx > shader->limits->constant_float)
2646 {
2647 WARN("end_idx %u > float constants limit %u.\n",
2648 end_idx, shader->limits->constant_float);
2649 end_idx = shader->limits->constant_float;
2650 }
2651
2652 for (i = start_idx; i < end_idx; ++i)
2653 {
2654 struct wined3d_shader_lconst *lconst;
2655 float *value;
2656
2657 if (!(lconst = malloc(sizeof(*lconst))))
2658 return E_OUTOFMEMORY;
2659
2660 lconst->idx = i;
2661 value = (float *)lconst->value;
2662 memcpy(value, src_data + (i - start_idx) * 4 /* 4 components */, 4 * sizeof(float));
2663 list_add_head(&shader->constantsF, &lconst->entry);
2664
2665 if (isinf(value[0]) || isnan(value[0]) || isinf(value[1]) || isnan(value[1])
2666 || isinf(value[2]) || isnan(value[2]) || isinf(value[3]) || isnan(value[3]))
2667 {
2668 shader->lconst_inf_or_nan = TRUE;
2669 }
2670 }
2671
2672 return WINED3D_OK;
2673}
static float(__cdecl *square_half_float)(float x

Referenced by load_local_constants().

Variable Documentation

◆ none_shader_backend

Initial value:
=
{
}
static void shader_none_get_caps(const struct wined3d_adapter *adapter, struct shader_caps *caps)
Definition: shader.c:2041
static void shader_none_apply_compute_state(void *shader_priv, struct wined3d_context *context, const struct wined3d_state *state)
Definition: shader.c:1959
static void shader_none_free_context_data(struct wined3d_context *context)
Definition: shader.c:1964
static uint64_t shader_none_shader_compile(struct wined3d_context *context, const struct wined3d_shader_desc *shader_desc, enum wined3d_shader_type shader_type)
Definition: shader.c:2054
static void shader_none_precompile(void *shader_priv, struct wined3d_shader *shader)
Definition: shader.c:1958
static void shader_none_free(struct wined3d_device *device, struct wined3d_context *context)
Definition: shader.c:2027
static void shader_none_destroy(struct wined3d_shader *shader)
Definition: shader.c:1963
static void shader_none_handle_instruction(const struct wined3d_shader_instruction *ins)
Definition: shader.c:1957
static void shader_none_apply_draw_state(void *shader_priv, struct wined3d_context *context, const struct wined3d_state *state)
Definition: shader.c:1968
static BOOL shader_none_color_fixup_supported(struct color_fixup_desc fixup)
Definition: shader.c:2047
static void shader_none_update_float_vertex_constants(struct wined3d_device *device, UINT start, UINT count)
Definition: shader.c:1961
static HRESULT shader_none_alloc(struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe, const struct wined3d_fragment_pipe_ops *fragment_pipe)
Definition: shader.c:1993
static BOOL shader_none_allocate_context_data(struct wined3d_context *context)
Definition: shader.c:2036
static void shader_none_update_float_pixel_constants(struct wined3d_device *device, UINT start, UINT count)
Definition: shader.c:1962
static void shader_none_disable(void *shader_priv, struct wined3d_context *context)
Definition: shader.c:1978
static void shader_none_init_context_state(struct wined3d_context *context)
Definition: shader.c:1965

Definition at line 2060 of file shader.c.

Referenced by shader_none_alloc(), and wined3d_adapter_no3d_create().

◆ semantic_names

const char* const semantic_names[]
static
Initial value:
=
{
"SV_POSITION",
"BLENDWEIGHT",
"BLENDINDICES",
"NORMAL",
"PSIZE",
"TEXCOORD",
"TANGENT",
"BINORMAL",
"TESSFACTOR",
"POSITIONT",
"COLOR",
"FOG",
"DEPTH",
"SAMPLE",
}

Definition at line 283 of file shader.c.

Referenced by shader_semantic_name_from_usage(), and shader_usage_from_semantic_name().

◆ shader_opcode_names

const char* const shader_opcode_names[]
static

Definition at line 40 of file shader.c.

Referenced by debug_d3dshaderinstructionhandler().

◆ wined3d_srgb_const

const struct wined3d_vec4 wined3d_srgb_const[]
Initial value:
=
{
{0.41666f, 1.055f, 0.055f, 12.92f},
{0.0031308f, 0.0f, 0.0f, 0.0f},
}

Definition at line 32 of file shader.c.

Referenced by shader_glsl_generate_ffp_fragment_shader(), shader_glsl_generate_fragment_shader(), and wined3d_srgb_from_linear().