ReactOS 0.4.17-dev-934-g091855f
d3dbc.c File Reference
#include "hlsl.h"
Include dependency graph for d3dbc.c:

Go to the source code of this file.

Classes

struct  vkd3d_sm1_opcode_info
 
struct  vkd3d_shader_sm1_parser
 
struct  d3dbc_compiler
 
struct  sm1_instruction
 
struct  sm1_instruction::sm1_dst_register
 
struct  sm1_instruction::sm1_src_register
 

Macros

#define VKD3D_SM1_VS   0xfffeu
 
#define VKD3D_SM1_PS   0xffffu
 
#define VKD3D_SM1_DCL_USAGE_SHIFT   0u
 
#define VKD3D_SM1_DCL_USAGE_MASK   (0xfu << VKD3D_SM1_DCL_USAGE_SHIFT)
 
#define VKD3D_SM1_DCL_USAGE_INDEX_SHIFT   16u
 
#define VKD3D_SM1_DCL_USAGE_INDEX_MASK   (0xfu << VKD3D_SM1_DCL_USAGE_INDEX_SHIFT)
 
#define VKD3D_SM1_RESOURCE_TYPE_SHIFT   27u
 
#define VKD3D_SM1_RESOURCE_TYPE_MASK   (0xfu << VKD3D_SM1_RESOURCE_TYPE_SHIFT)
 
#define VKD3D_SM1_OPCODE_MASK   0x0000ffffu
 
#define VKD3D_SM1_INSTRUCTION_FLAGS_SHIFT   16u
 
#define VKD3D_SM1_INSTRUCTION_FLAGS_MASK   (0xffu << VKD3D_SM1_INSTRUCTION_FLAGS_SHIFT)
 
#define VKD3D_SM1_INSTRUCTION_LENGTH_SHIFT   24u
 
#define VKD3D_SM1_INSTRUCTION_LENGTH_MASK   (0xfu << VKD3D_SM1_INSTRUCTION_LENGTH_SHIFT)
 
#define VKD3D_SM1_COISSUE   (0x1u << 30u)
 
#define VKD3D_SM1_COMMENT_SIZE_SHIFT   16u
 
#define VKD3D_SM1_COMMENT_SIZE_MASK   (0x7fffu << VKD3D_SM1_COMMENT_SIZE_SHIFT)
 
#define VKD3D_SM1_INSTRUCTION_PREDICATED   (0x1u << 28u)
 
#define VKD3D_SM1_INSTRUCTION_PARAMETER   (0x1u << 31u)
 
#define VKD3D_SM1_REGISTER_NUMBER_MASK   0x000007ffu
 
#define VKD3D_SM1_REGISTER_TYPE_SHIFT   28u
 
#define VKD3D_SM1_REGISTER_TYPE_MASK   (0x7u << VKD3D_SM1_REGISTER_TYPE_SHIFT)
 
#define VKD3D_SM1_REGISTER_TYPE_SHIFT2   8u
 
#define VKD3D_SM1_REGISTER_TYPE_MASK2   (0x18u << VKD3D_SM1_REGISTER_TYPE_SHIFT2)
 
#define VKD3D_SM1_ADDRESS_MODE_SHIFT   13u
 
#define VKD3D_SM1_ADDRESS_MODE_MASK   (0x1u << VKD3D_SM1_ADDRESS_MODE_SHIFT)
 
#define VKD3D_SM1_DST_MODIFIER_SHIFT   20u
 
#define VKD3D_SM1_DST_MODIFIER_MASK   (0xfu << VKD3D_SM1_DST_MODIFIER_SHIFT)
 
#define VKD3D_SM1_DSTSHIFT_SHIFT   24u
 
#define VKD3D_SM1_DSTSHIFT_MASK   (0xfu << VKD3D_SM1_DSTSHIFT_SHIFT)
 
#define VKD3D_SM1_WRITEMASK_SHIFT   16u
 
#define VKD3D_SM1_WRITEMASK_MASK   (0xfu << VKD3D_SM1_WRITEMASK_SHIFT)
 
#define VKD3D_SM1_SWIZZLE_SHIFT   16u
 
#define VKD3D_SM1_SWIZZLE_MASK   (0xffu << VKD3D_SM1_SWIZZLE_SHIFT)
 
#define VKD3D_SM1_SWIZZLE_DEFAULT   (0u | (1u << 2) | (2u << 4) | (3u << 6))
 
#define VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT(idx)   (2u * (idx))
 
#define VKD3D_SM1_SWIZZLE_COMPONENT_MASK(idx)   (0x3u << VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT(idx))
 
#define VKD3D_SM1_SRC_MODIFIER_SHIFT   24u
 
#define VKD3D_SM1_SRC_MODIFIER_MASK   (0xfu << VKD3D_SM1_SRC_MODIFIER_SHIFT)
 
#define VKD3D_SM1_END   0x0000ffffu
 
#define VKD3D_SM1_VERSION_MAJOR(version)   (((version) >> 8u) & 0xffu)
 
#define VKD3D_SM1_VERSION_MINOR(version)   (((version) >> 0u) & 0xffu)
 
#define MAX_CONSTANT_COUNT   8192
 

Enumerations

enum  vkd3d_sm1_address_mode_type { VKD3D_SM1_ADDRESS_MODE_ABSOLUTE = 0x0 , VKD3D_SM1_ADDRESS_MODE_RELATIVE = 0x1 }
 
enum  vkd3d_sm1_resource_type {
  VKD3D_SM1_RESOURCE_UNKNOWN = 0x0 , VKD3D_SM1_RESOURCE_TEXTURE_1D = 0x1 , VKD3D_SM1_RESOURCE_TEXTURE_2D = 0x2 , VKD3D_SM1_RESOURCE_TEXTURE_CUBE = 0x3 ,
  VKD3D_SM1_RESOURCE_TEXTURE_3D = 0x4
}
 
enum  vkd3d_sm1_misc_register { VKD3D_SM1_MISC_POSITION = 0x0 , VKD3D_SM1_MISC_FACE = 0x1 }
 
enum  vkd3d_sm1_opcode {
  VKD3D_SM1_OP_NOP = 0x00 , VKD3D_SM1_OP_MOV = 0x01 , VKD3D_SM1_OP_ADD = 0x02 , VKD3D_SM1_OP_SUB = 0x03 ,
  VKD3D_SM1_OP_MAD = 0x04 , VKD3D_SM1_OP_MUL = 0x05 , VKD3D_SM1_OP_RCP = 0x06 , VKD3D_SM1_OP_RSQ = 0x07 ,
  VKD3D_SM1_OP_DP3 = 0x08 , VKD3D_SM1_OP_DP4 = 0x09 , VKD3D_SM1_OP_MIN = 0x0a , VKD3D_SM1_OP_MAX = 0x0b ,
  VKD3D_SM1_OP_SLT = 0x0c , VKD3D_SM1_OP_SGE = 0x0d , VKD3D_SM1_OP_EXP = 0x0e , VKD3D_SM1_OP_LOG = 0x0f ,
  VKD3D_SM1_OP_LIT = 0x10 , VKD3D_SM1_OP_DST = 0x11 , VKD3D_SM1_OP_LRP = 0x12 , VKD3D_SM1_OP_FRC = 0x13 ,
  VKD3D_SM1_OP_M4x4 = 0x14 , VKD3D_SM1_OP_M4x3 = 0x15 , VKD3D_SM1_OP_M3x4 = 0x16 , VKD3D_SM1_OP_M3x3 = 0x17 ,
  VKD3D_SM1_OP_M3x2 = 0x18 , VKD3D_SM1_OP_CALL = 0x19 , VKD3D_SM1_OP_CALLNZ = 0x1a , VKD3D_SM1_OP_LOOP = 0x1b ,
  VKD3D_SM1_OP_RET = 0x1c , VKD3D_SM1_OP_ENDLOOP = 0x1d , VKD3D_SM1_OP_LABEL = 0x1e , VKD3D_SM1_OP_DCL = 0x1f ,
  VKD3D_SM1_OP_POW = 0x20 , VKD3D_SM1_OP_CRS = 0x21 , VKD3D_SM1_OP_SGN = 0x22 , VKD3D_SM1_OP_ABS = 0x23 ,
  VKD3D_SM1_OP_NRM = 0x24 , VKD3D_SM1_OP_SINCOS = 0x25 , VKD3D_SM1_OP_REP = 0x26 , VKD3D_SM1_OP_ENDREP = 0x27 ,
  VKD3D_SM1_OP_IF = 0x28 , VKD3D_SM1_OP_IFC = 0x29 , VKD3D_SM1_OP_ELSE = 0x2a , VKD3D_SM1_OP_ENDIF = 0x2b ,
  VKD3D_SM1_OP_BREAK = 0x2c , VKD3D_SM1_OP_BREAKC = 0x2d , VKD3D_SM1_OP_MOVA = 0x2e , VKD3D_SM1_OP_DEFB = 0x2f ,
  VKD3D_SM1_OP_DEFI = 0x30 , VKD3D_SM1_OP_TEXCOORD = 0x40 , VKD3D_SM1_OP_TEXKILL = 0x41 , VKD3D_SM1_OP_TEX = 0x42 ,
  VKD3D_SM1_OP_TEXBEM = 0x43 , VKD3D_SM1_OP_TEXBEML = 0x44 , VKD3D_SM1_OP_TEXREG2AR = 0x45 , VKD3D_SM1_OP_TEXREG2GB = 0x46 ,
  VKD3D_SM1_OP_TEXM3x2PAD = 0x47 , VKD3D_SM1_OP_TEXM3x2TEX = 0x48 , VKD3D_SM1_OP_TEXM3x3PAD = 0x49 , VKD3D_SM1_OP_TEXM3x3TEX = 0x4a ,
  VKD3D_SM1_OP_TEXM3x3DIFF = 0x4b , VKD3D_SM1_OP_TEXM3x3SPEC = 0x4c , VKD3D_SM1_OP_TEXM3x3VSPEC = 0x4d , VKD3D_SM1_OP_EXPP = 0x4e ,
  VKD3D_SM1_OP_LOGP = 0x4f , VKD3D_SM1_OP_CND = 0x50 , VKD3D_SM1_OP_DEF = 0x51 , VKD3D_SM1_OP_TEXREG2RGB = 0x52 ,
  VKD3D_SM1_OP_TEXDP3TEX = 0x53 , VKD3D_SM1_OP_TEXM3x2DEPTH = 0x54 , VKD3D_SM1_OP_TEXDP3 = 0x55 , VKD3D_SM1_OP_TEXM3x3 = 0x56 ,
  VKD3D_SM1_OP_TEXDEPTH = 0x57 , VKD3D_SM1_OP_CMP = 0x58 , VKD3D_SM1_OP_BEM = 0x59 , VKD3D_SM1_OP_DP2ADD = 0x5a ,
  VKD3D_SM1_OP_DSX = 0x5b , VKD3D_SM1_OP_DSY = 0x5c , VKD3D_SM1_OP_TEXLDD = 0x5d , VKD3D_SM1_OP_SETP = 0x5e ,
  VKD3D_SM1_OP_TEXLDL = 0x5f , VKD3D_SM1_OP_BREAKP = 0x60 , VKD3D_SM1_OP_PHASE = 0xfffd , VKD3D_SM1_OP_COMMENT = 0xfffe ,
  VKD3D_SM1_OP_END = 0Xffff
}
 

Functions

static uint32_t read_u32 (const uint32_t **ptr)
 
static bool has_relative_address (uint32_t param)
 
static const struct vkd3d_sm1_opcode_info * shader_sm1_get_opcode_info (const struct vkd3d_shader_sm1_parser *sm1, enum vkd3d_sm1_opcode opcode)
 
static unsigned int shader_sm1_get_swizzle_component (uint32_t swizzle, unsigned int idx)
 
static uint32_t swizzle_from_sm1 (uint32_t swizzle)
 
static unsigned int idx_count_from_reg_type (enum vkd3d_shader_register_type reg_type)
 
static void shader_sm1_parse_src_param (uint32_t param, struct vkd3d_shader_src_param *rel_addr, struct vkd3d_shader_src_param *src)
 
static void shader_sm1_parse_dst_param (uint32_t param, struct vkd3d_shader_src_param *rel_addr, struct vkd3d_shader_dst_param *dst)
 
static struct signature_element * find_signature_element (const struct shader_signature *signature, const char *semantic_name, unsigned int semantic_index)
 
static struct signature_element * find_signature_element_by_register_index (const struct shader_signature *signature, unsigned int register_index)
 
static unsigned int make_mask_contiguous (unsigned int mask)
 
static bool add_signature_element (struct vkd3d_shader_sm1_parser *sm1, bool output, const char *name, unsigned int index, enum vkd3d_shader_sysval_semantic sysval, unsigned int register_index, bool is_dcl, unsigned int mask)
 
static void add_signature_mask (struct vkd3d_shader_sm1_parser *sm1, bool output, unsigned int register_index, unsigned int mask)
 
static bool add_signature_element_from_register (struct vkd3d_shader_sm1_parser *sm1, const struct vkd3d_shader_register *reg, bool is_dcl, unsigned int mask)
 
static bool add_signature_element_from_semantic (struct vkd3d_shader_sm1_parser *sm1, const struct vkd3d_shader_semantic *semantic)
 
static void record_constant_register (struct vkd3d_shader_sm1_parser *sm1, enum vkd3d_shader_d3dbc_constant_register set, uint32_t index, bool from_def)
 
static void shader_sm1_scan_register (struct vkd3d_shader_sm1_parser *sm1, const struct vkd3d_shader_register *reg, unsigned int mask, bool from_def)
 
static void shader_sm1_read_param (struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, uint32_t *token, uint32_t *addr_token)
 
static void shader_sm1_skip_opcode (const struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, const struct vkd3d_sm1_opcode_info *opcode_info, uint32_t opcode_token)
 
static void shader_sm1_read_src_param (struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, struct vkd3d_shader_src_param *src_param)
 
static void shader_sm1_read_dst_param (struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, struct vkd3d_shader_dst_param *dst_param)
 
static void shader_sm1_read_semantic (struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, struct vkd3d_shader_semantic *semantic)
 
static void shader_sm1_read_immconst (struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, struct vkd3d_shader_src_param *src_param, enum vsir_dimension dimension, enum vkd3d_data_type data_type)
 
static void shader_sm1_read_comment (struct vkd3d_shader_sm1_parser *sm1)
 
static void shader_sm1_validate_instruction (struct vkd3d_shader_sm1_parser *sm1, struct vkd3d_shader_instruction *ins)
 
static unsigned int mask_from_swizzle (uint32_t swizzle)
 
static void shader_sm1_read_instruction (struct vkd3d_shader_sm1_parser *sm1, struct vkd3d_shader_instruction *ins)
 
static bool shader_sm1_is_end (struct vkd3d_shader_sm1_parser *sm1)
 
static enum vkd3d_result shader_sm1_init (struct vkd3d_shader_sm1_parser *sm1, struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_message_context *message_context)
 
static uint32_t get_external_constant_count (struct vkd3d_shader_sm1_parser *sm1, enum vkd3d_shader_d3dbc_constant_register set)
 
int d3dbc_parse (const struct vkd3d_shader_compile_info *compile_info, uint64_t config_flags, struct vkd3d_shader_message_context *message_context, struct vsir_program *program)
 
bool sm1_register_from_semantic_name (const struct vkd3d_shader_version *version, const char *semantic_name, unsigned int semantic_index, bool output, enum vkd3d_shader_register_type *type, unsigned int *reg)
 
bool sm1_usage_from_semantic_name (const char *semantic_name, uint32_t semantic_index, enum vkd3d_decl_usage *usage, uint32_t *usage_idx)
 
static uint32_t sm1_version (enum vkd3d_shader_type type, unsigned int major, unsigned int minor)
 
D3DXPARAMETER_CLASS hlsl_sm1_class (const struct hlsl_type *type)
 
D3DXPARAMETER_TYPE hlsl_sm1_base_type (const struct hlsl_type *type)
 
static void write_sm1_type (struct vkd3d_bytecode_buffer *buffer, struct hlsl_type *type, unsigned int ctab_start)
 
static void sm1_sort_extern (struct list *sorted, struct hlsl_ir_var *to_sort)
 
static void sm1_sort_externs (struct hlsl_ctx *ctx)
 
void write_sm1_uniforms (struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *buffer)
 
static uint32_t sm1_encode_register_type (enum vkd3d_shader_register_type type)
 
static bool is_inconsequential_instr (const struct sm1_instruction *instr)
 
static void write_sm1_dst_register (struct vkd3d_bytecode_buffer *buffer, const struct sm1_dst_register *reg)
 
static void write_sm1_src_register (struct vkd3d_bytecode_buffer *buffer, const struct sm1_src_register *reg)
 
static void d3dbc_write_instruction (struct d3dbc_compiler *d3dbc, const struct sm1_instruction *instr)
 
static const struct vkd3d_sm1_opcode_info * shader_sm1_get_opcode_info_from_vsir (struct d3dbc_compiler *d3dbc, enum vkd3d_shader_opcode vkd3d_opcode)
 
static uint32_t swizzle_from_vsir (uint32_t swizzle)
 
static void sm1_src_reg_from_vsir (struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_src_param *param, struct sm1_src_register *src, const struct vkd3d_shader_location *loc)
 
static void sm1_dst_reg_from_vsir (struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_dst_param *param, struct sm1_dst_register *dst, const struct vkd3d_shader_location *loc)
 
static void d3dbc_write_vsir_def (struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
 
static void d3dbc_write_vsir_sampler_dcl (struct d3dbc_compiler *d3dbc, unsigned int reg_id, enum vkd3d_sm1_resource_type res_type)
 
static void d3dbc_write_vsir_dcl (struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
 
static const struct vkd3d_sm1_opcode_info * shader_sm1_get_opcode_info_from_vsir_instruction (struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
 
static void d3dbc_write_vsir_simple_instruction (struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
 
static void d3dbc_write_vsir_instruction (struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
 
static void d3dbc_write_semantic_dcl (struct d3dbc_compiler *d3dbc, const struct signature_element *element, bool output)
 
static void d3dbc_write_semantic_dcls (struct d3dbc_compiler *d3dbc)
 
static void d3dbc_write_program_instructions (struct d3dbc_compiler *d3dbc)
 
int d3dbc_compile (struct vsir_program *program, uint64_t config_flags, const struct vkd3d_shader_compile_info *compile_info, const struct vkd3d_shader_code *ctab, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
 

Variables

static const struct vkd3d_sm1_opcode_info vs_opcode_table []
 
static const struct vkd3d_sm1_opcode_info ps_opcode_table []
 
static enum vkd3d_shader_resource_type resource_type_table []
 

Macro Definition Documentation

◆ MAX_CONSTANT_COUNT

#define MAX_CONSTANT_COUNT   8192

Definition at line 226 of file d3dbc.c.

◆ VKD3D_SM1_ADDRESS_MODE_MASK

#define VKD3D_SM1_ADDRESS_MODE_MASK   (0x1u << VKD3D_SM1_ADDRESS_MODE_SHIFT)

Definition at line 66 of file d3dbc.c.

◆ VKD3D_SM1_ADDRESS_MODE_SHIFT

#define VKD3D_SM1_ADDRESS_MODE_SHIFT   13u

Definition at line 65 of file d3dbc.c.

◆ VKD3D_SM1_COISSUE

#define VKD3D_SM1_COISSUE   (0x1u << 30u)

Definition at line 49 of file d3dbc.c.

◆ VKD3D_SM1_COMMENT_SIZE_MASK

#define VKD3D_SM1_COMMENT_SIZE_MASK   (0x7fffu << VKD3D_SM1_COMMENT_SIZE_SHIFT)

Definition at line 52 of file d3dbc.c.

◆ VKD3D_SM1_COMMENT_SIZE_SHIFT

#define VKD3D_SM1_COMMENT_SIZE_SHIFT   16u

Definition at line 51 of file d3dbc.c.

◆ VKD3D_SM1_DCL_USAGE_INDEX_MASK

#define VKD3D_SM1_DCL_USAGE_INDEX_MASK   (0xfu << VKD3D_SM1_DCL_USAGE_INDEX_SHIFT)

Definition at line 36 of file d3dbc.c.

◆ VKD3D_SM1_DCL_USAGE_INDEX_SHIFT

#define VKD3D_SM1_DCL_USAGE_INDEX_SHIFT   16u

Definition at line 35 of file d3dbc.c.

◆ VKD3D_SM1_DCL_USAGE_MASK

#define VKD3D_SM1_DCL_USAGE_MASK   (0xfu << VKD3D_SM1_DCL_USAGE_SHIFT)

Definition at line 34 of file d3dbc.c.

◆ VKD3D_SM1_DCL_USAGE_SHIFT

#define VKD3D_SM1_DCL_USAGE_SHIFT   0u

Definition at line 33 of file d3dbc.c.

◆ VKD3D_SM1_DST_MODIFIER_MASK

#define VKD3D_SM1_DST_MODIFIER_MASK   (0xfu << VKD3D_SM1_DST_MODIFIER_SHIFT)

Definition at line 69 of file d3dbc.c.

◆ VKD3D_SM1_DST_MODIFIER_SHIFT

#define VKD3D_SM1_DST_MODIFIER_SHIFT   20u

Definition at line 68 of file d3dbc.c.

◆ VKD3D_SM1_DSTSHIFT_MASK

#define VKD3D_SM1_DSTSHIFT_MASK   (0xfu << VKD3D_SM1_DSTSHIFT_SHIFT)

Definition at line 72 of file d3dbc.c.

◆ VKD3D_SM1_DSTSHIFT_SHIFT

#define VKD3D_SM1_DSTSHIFT_SHIFT   24u

Definition at line 71 of file d3dbc.c.

◆ VKD3D_SM1_END

#define VKD3D_SM1_END   0x0000ffffu

Definition at line 87 of file d3dbc.c.

◆ VKD3D_SM1_INSTRUCTION_FLAGS_MASK

#define VKD3D_SM1_INSTRUCTION_FLAGS_MASK   (0xffu << VKD3D_SM1_INSTRUCTION_FLAGS_SHIFT)

Definition at line 44 of file d3dbc.c.

◆ VKD3D_SM1_INSTRUCTION_FLAGS_SHIFT

#define VKD3D_SM1_INSTRUCTION_FLAGS_SHIFT   16u

Definition at line 43 of file d3dbc.c.

◆ VKD3D_SM1_INSTRUCTION_LENGTH_MASK

#define VKD3D_SM1_INSTRUCTION_LENGTH_MASK   (0xfu << VKD3D_SM1_INSTRUCTION_LENGTH_SHIFT)

Definition at line 47 of file d3dbc.c.

◆ VKD3D_SM1_INSTRUCTION_LENGTH_SHIFT

#define VKD3D_SM1_INSTRUCTION_LENGTH_SHIFT   24u

Definition at line 46 of file d3dbc.c.

◆ VKD3D_SM1_INSTRUCTION_PARAMETER

#define VKD3D_SM1_INSTRUCTION_PARAMETER   (0x1u << 31u)

Definition at line 56 of file d3dbc.c.

◆ VKD3D_SM1_INSTRUCTION_PREDICATED

#define VKD3D_SM1_INSTRUCTION_PREDICATED   (0x1u << 28u)

Definition at line 54 of file d3dbc.c.

◆ VKD3D_SM1_OPCODE_MASK

#define VKD3D_SM1_OPCODE_MASK   0x0000ffffu

Definition at line 41 of file d3dbc.c.

◆ VKD3D_SM1_PS

#define VKD3D_SM1_PS   0xffffu

Definition at line 31 of file d3dbc.c.

◆ VKD3D_SM1_REGISTER_NUMBER_MASK

#define VKD3D_SM1_REGISTER_NUMBER_MASK   0x000007ffu

Definition at line 58 of file d3dbc.c.

◆ VKD3D_SM1_REGISTER_TYPE_MASK

#define VKD3D_SM1_REGISTER_TYPE_MASK   (0x7u << VKD3D_SM1_REGISTER_TYPE_SHIFT)

Definition at line 61 of file d3dbc.c.

◆ VKD3D_SM1_REGISTER_TYPE_MASK2

#define VKD3D_SM1_REGISTER_TYPE_MASK2   (0x18u << VKD3D_SM1_REGISTER_TYPE_SHIFT2)

Definition at line 63 of file d3dbc.c.

◆ VKD3D_SM1_REGISTER_TYPE_SHIFT

#define VKD3D_SM1_REGISTER_TYPE_SHIFT   28u

Definition at line 60 of file d3dbc.c.

◆ VKD3D_SM1_REGISTER_TYPE_SHIFT2

#define VKD3D_SM1_REGISTER_TYPE_SHIFT2   8u

Definition at line 62 of file d3dbc.c.

◆ VKD3D_SM1_RESOURCE_TYPE_MASK

#define VKD3D_SM1_RESOURCE_TYPE_MASK   (0xfu << VKD3D_SM1_RESOURCE_TYPE_SHIFT)

Definition at line 39 of file d3dbc.c.

◆ VKD3D_SM1_RESOURCE_TYPE_SHIFT

#define VKD3D_SM1_RESOURCE_TYPE_SHIFT   27u

Definition at line 38 of file d3dbc.c.

◆ VKD3D_SM1_SRC_MODIFIER_MASK

#define VKD3D_SM1_SRC_MODIFIER_MASK   (0xfu << VKD3D_SM1_SRC_MODIFIER_SHIFT)

Definition at line 85 of file d3dbc.c.

◆ VKD3D_SM1_SRC_MODIFIER_SHIFT

#define VKD3D_SM1_SRC_MODIFIER_SHIFT   24u

Definition at line 84 of file d3dbc.c.

◆ VKD3D_SM1_SWIZZLE_COMPONENT_MASK

#define VKD3D_SM1_SWIZZLE_COMPONENT_MASK (   idx)    (0x3u << VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT(idx))

Definition at line 82 of file d3dbc.c.

◆ VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT

#define VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT (   idx)    (2u * (idx))

Definition at line 81 of file d3dbc.c.

◆ VKD3D_SM1_SWIZZLE_DEFAULT

#define VKD3D_SM1_SWIZZLE_DEFAULT   (0u | (1u << 2) | (2u << 4) | (3u << 6))

Definition at line 79 of file d3dbc.c.

◆ VKD3D_SM1_SWIZZLE_MASK

#define VKD3D_SM1_SWIZZLE_MASK   (0xffu << VKD3D_SM1_SWIZZLE_SHIFT)

Definition at line 78 of file d3dbc.c.

◆ VKD3D_SM1_SWIZZLE_SHIFT

#define VKD3D_SM1_SWIZZLE_SHIFT   16u

Definition at line 77 of file d3dbc.c.

◆ VKD3D_SM1_VERSION_MAJOR

#define VKD3D_SM1_VERSION_MAJOR (   version)    (((version) >> 8u) & 0xffu)

Definition at line 89 of file d3dbc.c.

◆ VKD3D_SM1_VERSION_MINOR

#define VKD3D_SM1_VERSION_MINOR (   version)    (((version) >> 0u) & 0xffu)

Definition at line 90 of file d3dbc.c.

◆ VKD3D_SM1_VS

#define VKD3D_SM1_VS   0xfffeu

Definition at line 30 of file d3dbc.c.

◆ VKD3D_SM1_WRITEMASK_MASK

#define VKD3D_SM1_WRITEMASK_MASK   (0xfu << VKD3D_SM1_WRITEMASK_SHIFT)

Definition at line 75 of file d3dbc.c.

◆ VKD3D_SM1_WRITEMASK_SHIFT

#define VKD3D_SM1_WRITEMASK_SHIFT   16u

Definition at line 74 of file d3dbc.c.

Enumeration Type Documentation

◆ vkd3d_sm1_address_mode_type

Enumerator
VKD3D_SM1_ADDRESS_MODE_ABSOLUTE 
VKD3D_SM1_ADDRESS_MODE_RELATIVE 

Definition at line 92 of file d3dbc.c.

93{
96};
@ VKD3D_SM1_ADDRESS_MODE_ABSOLUTE
Definition: d3dbc.c:94
@ VKD3D_SM1_ADDRESS_MODE_RELATIVE
Definition: d3dbc.c:95

◆ vkd3d_sm1_misc_register

Enumerator
VKD3D_SM1_MISC_POSITION 
VKD3D_SM1_MISC_FACE 

Definition at line 107 of file d3dbc.c.

108{
111};
@ VKD3D_SM1_MISC_FACE
Definition: d3dbc.c:110
@ VKD3D_SM1_MISC_POSITION
Definition: d3dbc.c:109

◆ vkd3d_sm1_opcode

Enumerator
VKD3D_SM1_OP_NOP 
VKD3D_SM1_OP_MOV 
VKD3D_SM1_OP_ADD 
VKD3D_SM1_OP_SUB 
VKD3D_SM1_OP_MAD 
VKD3D_SM1_OP_MUL 
VKD3D_SM1_OP_RCP 
VKD3D_SM1_OP_RSQ 
VKD3D_SM1_OP_DP3 
VKD3D_SM1_OP_DP4 
VKD3D_SM1_OP_MIN 
VKD3D_SM1_OP_MAX 
VKD3D_SM1_OP_SLT 
VKD3D_SM1_OP_SGE 
VKD3D_SM1_OP_EXP 
VKD3D_SM1_OP_LOG 
VKD3D_SM1_OP_LIT 
VKD3D_SM1_OP_DST 
VKD3D_SM1_OP_LRP 
VKD3D_SM1_OP_FRC 
VKD3D_SM1_OP_M4x4 
VKD3D_SM1_OP_M4x3 
VKD3D_SM1_OP_M3x4 
VKD3D_SM1_OP_M3x3 
VKD3D_SM1_OP_M3x2 
VKD3D_SM1_OP_CALL 
VKD3D_SM1_OP_CALLNZ 
VKD3D_SM1_OP_LOOP 
VKD3D_SM1_OP_RET 
VKD3D_SM1_OP_ENDLOOP 
VKD3D_SM1_OP_LABEL 
VKD3D_SM1_OP_DCL 
VKD3D_SM1_OP_POW 
VKD3D_SM1_OP_CRS 
VKD3D_SM1_OP_SGN 
VKD3D_SM1_OP_ABS 
VKD3D_SM1_OP_NRM 
VKD3D_SM1_OP_SINCOS 
VKD3D_SM1_OP_REP 
VKD3D_SM1_OP_ENDREP 
VKD3D_SM1_OP_IF 
VKD3D_SM1_OP_IFC 
VKD3D_SM1_OP_ELSE 
VKD3D_SM1_OP_ENDIF 
VKD3D_SM1_OP_BREAK 
VKD3D_SM1_OP_BREAKC 
VKD3D_SM1_OP_MOVA 
VKD3D_SM1_OP_DEFB 
VKD3D_SM1_OP_DEFI 
VKD3D_SM1_OP_TEXCOORD 
VKD3D_SM1_OP_TEXKILL 
VKD3D_SM1_OP_TEX 
VKD3D_SM1_OP_TEXBEM 
VKD3D_SM1_OP_TEXBEML 
VKD3D_SM1_OP_TEXREG2AR 
VKD3D_SM1_OP_TEXREG2GB 
VKD3D_SM1_OP_TEXM3x2PAD 
VKD3D_SM1_OP_TEXM3x2TEX 
VKD3D_SM1_OP_TEXM3x3PAD 
VKD3D_SM1_OP_TEXM3x3TEX 
VKD3D_SM1_OP_TEXM3x3DIFF 
VKD3D_SM1_OP_TEXM3x3SPEC 
VKD3D_SM1_OP_TEXM3x3VSPEC 
VKD3D_SM1_OP_EXPP 
VKD3D_SM1_OP_LOGP 
VKD3D_SM1_OP_CND 
VKD3D_SM1_OP_DEF 
VKD3D_SM1_OP_TEXREG2RGB 
VKD3D_SM1_OP_TEXDP3TEX 
VKD3D_SM1_OP_TEXM3x2DEPTH 
VKD3D_SM1_OP_TEXDP3 
VKD3D_SM1_OP_TEXM3x3 
VKD3D_SM1_OP_TEXDEPTH 
VKD3D_SM1_OP_CMP 
VKD3D_SM1_OP_BEM 
VKD3D_SM1_OP_DP2ADD 
VKD3D_SM1_OP_DSX 
VKD3D_SM1_OP_DSY 
VKD3D_SM1_OP_TEXLDD 
VKD3D_SM1_OP_SETP 
VKD3D_SM1_OP_TEXLDL 
VKD3D_SM1_OP_BREAKP 
VKD3D_SM1_OP_PHASE 
VKD3D_SM1_OP_COMMENT 
VKD3D_SM1_OP_END 

Definition at line 113 of file d3dbc.c.

114{
115 VKD3D_SM1_OP_NOP = 0x00,
116 VKD3D_SM1_OP_MOV = 0x01,
117 VKD3D_SM1_OP_ADD = 0x02,
118 VKD3D_SM1_OP_SUB = 0x03,
119 VKD3D_SM1_OP_MAD = 0x04,
120 VKD3D_SM1_OP_MUL = 0x05,
121 VKD3D_SM1_OP_RCP = 0x06,
122 VKD3D_SM1_OP_RSQ = 0x07,
123 VKD3D_SM1_OP_DP3 = 0x08,
124 VKD3D_SM1_OP_DP4 = 0x09,
125 VKD3D_SM1_OP_MIN = 0x0a,
126 VKD3D_SM1_OP_MAX = 0x0b,
127 VKD3D_SM1_OP_SLT = 0x0c,
128 VKD3D_SM1_OP_SGE = 0x0d,
129 VKD3D_SM1_OP_EXP = 0x0e,
130 VKD3D_SM1_OP_LOG = 0x0f,
131 VKD3D_SM1_OP_LIT = 0x10,
132 VKD3D_SM1_OP_DST = 0x11,
133 VKD3D_SM1_OP_LRP = 0x12,
134 VKD3D_SM1_OP_FRC = 0x13,
135 VKD3D_SM1_OP_M4x4 = 0x14,
136 VKD3D_SM1_OP_M4x3 = 0x15,
137 VKD3D_SM1_OP_M3x4 = 0x16,
138 VKD3D_SM1_OP_M3x3 = 0x17,
139 VKD3D_SM1_OP_M3x2 = 0x18,
140 VKD3D_SM1_OP_CALL = 0x19,
141 VKD3D_SM1_OP_CALLNZ = 0x1a,
142 VKD3D_SM1_OP_LOOP = 0x1b,
143 VKD3D_SM1_OP_RET = 0x1c,
145 VKD3D_SM1_OP_LABEL = 0x1e,
146 VKD3D_SM1_OP_DCL = 0x1f,
147 VKD3D_SM1_OP_POW = 0x20,
148 VKD3D_SM1_OP_CRS = 0x21,
149 VKD3D_SM1_OP_SGN = 0x22,
150 VKD3D_SM1_OP_ABS = 0x23,
151 VKD3D_SM1_OP_NRM = 0x24,
152 VKD3D_SM1_OP_SINCOS = 0x25,
153 VKD3D_SM1_OP_REP = 0x26,
154 VKD3D_SM1_OP_ENDREP = 0x27,
155 VKD3D_SM1_OP_IF = 0x28,
156 VKD3D_SM1_OP_IFC = 0x29,
157 VKD3D_SM1_OP_ELSE = 0x2a,
158 VKD3D_SM1_OP_ENDIF = 0x2b,
159 VKD3D_SM1_OP_BREAK = 0x2c,
160 VKD3D_SM1_OP_BREAKC = 0x2d,
161 VKD3D_SM1_OP_MOVA = 0x2e,
162 VKD3D_SM1_OP_DEFB = 0x2f,
163 VKD3D_SM1_OP_DEFI = 0x30,
164
167 VKD3D_SM1_OP_TEX = 0x42,
168 VKD3D_SM1_OP_TEXBEM = 0x43,
179 VKD3D_SM1_OP_EXPP = 0x4e,
180 VKD3D_SM1_OP_LOGP = 0x4f,
181 VKD3D_SM1_OP_CND = 0x50,
182 VKD3D_SM1_OP_DEF = 0x51,
186 VKD3D_SM1_OP_TEXDP3 = 0x55,
189 VKD3D_SM1_OP_CMP = 0x58,
190 VKD3D_SM1_OP_BEM = 0x59,
191 VKD3D_SM1_OP_DP2ADD = 0x5a,
192 VKD3D_SM1_OP_DSX = 0x5b,
193 VKD3D_SM1_OP_DSY = 0x5c,
194 VKD3D_SM1_OP_TEXLDD = 0x5d,
195 VKD3D_SM1_OP_SETP = 0x5e,
196 VKD3D_SM1_OP_TEXLDL = 0x5f,
197 VKD3D_SM1_OP_BREAKP = 0x60,
198
199 VKD3D_SM1_OP_PHASE = 0xfffd,
200 VKD3D_SM1_OP_COMMENT = 0xfffe,
201 VKD3D_SM1_OP_END = 0Xffff,
202};
@ VKD3D_SM1_OP_IF
Definition: d3dbc.c:155
@ VKD3D_SM1_OP_TEXKILL
Definition: d3dbc.c:166
@ VKD3D_SM1_OP_TEXM3x3PAD
Definition: d3dbc.c:174
@ VKD3D_SM1_OP_ENDIF
Definition: d3dbc.c:158
@ VKD3D_SM1_OP_DP4
Definition: d3dbc.c:124
@ VKD3D_SM1_OP_TEXDP3TEX
Definition: d3dbc.c:184
@ VKD3D_SM1_OP_PHASE
Definition: d3dbc.c:199
@ VKD3D_SM1_OP_RET
Definition: d3dbc.c:143
@ VKD3D_SM1_OP_LIT
Definition: d3dbc.c:131
@ VKD3D_SM1_OP_BREAK
Definition: d3dbc.c:159
@ VKD3D_SM1_OP_LOG
Definition: d3dbc.c:130
@ VKD3D_SM1_OP_TEXBEML
Definition: d3dbc.c:169
@ VKD3D_SM1_OP_TEXLDD
Definition: d3dbc.c:194
@ VKD3D_SM1_OP_SGN
Definition: d3dbc.c:149
@ VKD3D_SM1_OP_TEXM3x2TEX
Definition: d3dbc.c:173
@ VKD3D_SM1_OP_BREAKP
Definition: d3dbc.c:197
@ VKD3D_SM1_OP_LOOP
Definition: d3dbc.c:142
@ VKD3D_SM1_OP_DP3
Definition: d3dbc.c:123
@ VKD3D_SM1_OP_TEXM3x3VSPEC
Definition: d3dbc.c:178
@ VKD3D_SM1_OP_ABS
Definition: d3dbc.c:150
@ VKD3D_SM1_OP_LOGP
Definition: d3dbc.c:180
@ VKD3D_SM1_OP_LABEL
Definition: d3dbc.c:145
@ VKD3D_SM1_OP_M3x2
Definition: d3dbc.c:139
@ VKD3D_SM1_OP_COMMENT
Definition: d3dbc.c:200
@ VKD3D_SM1_OP_BEM
Definition: d3dbc.c:190
@ VKD3D_SM1_OP_M3x4
Definition: d3dbc.c:137
@ VKD3D_SM1_OP_CND
Definition: d3dbc.c:181
@ VKD3D_SM1_OP_MAX
Definition: d3dbc.c:126
@ VKD3D_SM1_OP_SUB
Definition: d3dbc.c:118
@ VKD3D_SM1_OP_CMP
Definition: d3dbc.c:189
@ VKD3D_SM1_OP_TEXREG2GB
Definition: d3dbc.c:171
@ VKD3D_SM1_OP_SETP
Definition: d3dbc.c:195
@ VKD3D_SM1_OP_EXP
Definition: d3dbc.c:129
@ VKD3D_SM1_OP_TEXM3x3SPEC
Definition: d3dbc.c:177
@ VKD3D_SM1_OP_MOV
Definition: d3dbc.c:116
@ VKD3D_SM1_OP_TEXDP3
Definition: d3dbc.c:186
@ VKD3D_SM1_OP_NOP
Definition: d3dbc.c:115
@ VKD3D_SM1_OP_M3x3
Definition: d3dbc.c:138
@ VKD3D_SM1_OP_TEXBEM
Definition: d3dbc.c:168
@ VKD3D_SM1_OP_DSX
Definition: d3dbc.c:192
@ VKD3D_SM1_OP_DP2ADD
Definition: d3dbc.c:191
@ VKD3D_SM1_OP_M4x4
Definition: d3dbc.c:135
@ VKD3D_SM1_OP_DSY
Definition: d3dbc.c:193
@ VKD3D_SM1_OP_MAD
Definition: d3dbc.c:119
@ VKD3D_SM1_OP_CALLNZ
Definition: d3dbc.c:141
@ VKD3D_SM1_OP_TEXM3x3TEX
Definition: d3dbc.c:175
@ VKD3D_SM1_OP_NRM
Definition: d3dbc.c:151
@ VKD3D_SM1_OP_RSQ
Definition: d3dbc.c:122
@ VKD3D_SM1_OP_TEX
Definition: d3dbc.c:167
@ VKD3D_SM1_OP_REP
Definition: d3dbc.c:153
@ VKD3D_SM1_OP_TEXLDL
Definition: d3dbc.c:196
@ VKD3D_SM1_OP_END
Definition: d3dbc.c:201
@ VKD3D_SM1_OP_TEXDEPTH
Definition: d3dbc.c:188
@ VKD3D_SM1_OP_DEFI
Definition: d3dbc.c:163
@ VKD3D_SM1_OP_SINCOS
Definition: d3dbc.c:152
@ VKD3D_SM1_OP_IFC
Definition: d3dbc.c:156
@ VKD3D_SM1_OP_TEXREG2AR
Definition: d3dbc.c:170
@ VKD3D_SM1_OP_ENDREP
Definition: d3dbc.c:154
@ VKD3D_SM1_OP_EXPP
Definition: d3dbc.c:179
@ VKD3D_SM1_OP_ELSE
Definition: d3dbc.c:157
@ VKD3D_SM1_OP_MUL
Definition: d3dbc.c:120
@ VKD3D_SM1_OP_LRP
Definition: d3dbc.c:133
@ VKD3D_SM1_OP_RCP
Definition: d3dbc.c:121
@ VKD3D_SM1_OP_M4x3
Definition: d3dbc.c:136
@ VKD3D_SM1_OP_DST
Definition: d3dbc.c:132
@ VKD3D_SM1_OP_MOVA
Definition: d3dbc.c:161
@ VKD3D_SM1_OP_TEXM3x2DEPTH
Definition: d3dbc.c:185
@ VKD3D_SM1_OP_MIN
Definition: d3dbc.c:125
@ VKD3D_SM1_OP_TEXM3x2PAD
Definition: d3dbc.c:172
@ VKD3D_SM1_OP_DEFB
Definition: d3dbc.c:162
@ VKD3D_SM1_OP_BREAKC
Definition: d3dbc.c:160
@ VKD3D_SM1_OP_DEF
Definition: d3dbc.c:182
@ VKD3D_SM1_OP_POW
Definition: d3dbc.c:147
@ VKD3D_SM1_OP_TEXM3x3
Definition: d3dbc.c:187
@ VKD3D_SM1_OP_ADD
Definition: d3dbc.c:117
@ VKD3D_SM1_OP_CALL
Definition: d3dbc.c:140
@ VKD3D_SM1_OP_TEXREG2RGB
Definition: d3dbc.c:183
@ VKD3D_SM1_OP_ENDLOOP
Definition: d3dbc.c:144
@ VKD3D_SM1_OP_FRC
Definition: d3dbc.c:134
@ VKD3D_SM1_OP_TEXM3x3DIFF
Definition: d3dbc.c:176
@ VKD3D_SM1_OP_TEXCOORD
Definition: d3dbc.c:165
@ VKD3D_SM1_OP_SLT
Definition: d3dbc.c:127
@ VKD3D_SM1_OP_DCL
Definition: d3dbc.c:146
@ VKD3D_SM1_OP_SGE
Definition: d3dbc.c:128
@ VKD3D_SM1_OP_CRS
Definition: d3dbc.c:148

◆ vkd3d_sm1_resource_type

Enumerator
VKD3D_SM1_RESOURCE_UNKNOWN 
VKD3D_SM1_RESOURCE_TEXTURE_1D 
VKD3D_SM1_RESOURCE_TEXTURE_2D 
VKD3D_SM1_RESOURCE_TEXTURE_CUBE 
VKD3D_SM1_RESOURCE_TEXTURE_3D 

Definition at line 98 of file d3dbc.c.

99{
105};
@ VKD3D_SM1_RESOURCE_TEXTURE_1D
Definition: d3dbc.c:101
@ VKD3D_SM1_RESOURCE_UNKNOWN
Definition: d3dbc.c:100
@ VKD3D_SM1_RESOURCE_TEXTURE_2D
Definition: d3dbc.c:102
@ VKD3D_SM1_RESOURCE_TEXTURE_3D
Definition: d3dbc.c:104
@ VKD3D_SM1_RESOURCE_TEXTURE_CUBE
Definition: d3dbc.c:103

Function Documentation

◆ add_signature_element()

static bool add_signature_element ( struct vkd3d_shader_sm1_parser *  sm1,
bool  output,
const char *  name,
unsigned int  index,
enum vkd3d_shader_sysval_semantic  sysval,
unsigned int  register_index,
bool  is_dcl,
unsigned int  mask 
)
static

Definition at line 579 of file d3dbc.c.

582{
583 struct vsir_program *program = sm1->p.program;
586
587 if (output)
588 signature = &program->output_signature;
589 else
590 signature = &program->input_signature;
591
593 {
594 element->mask = make_mask_contiguous(element->mask | mask);
595 if (!is_dcl)
596 element->used_mask |= mask;
597 return true;
598 }
599
600 if (!vkd3d_array_reserve((void **)&signature->elements, &signature->elements_capacity,
601 signature->element_count + 1, sizeof(*signature->elements)))
602 return false;
603 element = &signature->elements[signature->element_count++];
604
605 memset(element, 0, sizeof(*element));
606 if (!(element->semantic_name = vkd3d_strdup(name)))
607 return false;
608 element->semantic_index = index;
609 element->sysval_semantic = sysval;
610 element->component_type = VKD3D_SHADER_COMPONENT_FLOAT;
611 element->register_index = register_index;
612 element->target_location = register_index;
613 element->register_count = 1;
615 element->used_mask = is_dcl ? 0 : mask;
616 if (program->shader_version.type == VKD3D_SHADER_TYPE_PIXEL && !output)
617 element->interpolation_mode = VKD3DSIM_LINEAR;
618
619 return true;
620}
#define index(s, c)
Definition: various.h:29
static struct signature_element * find_signature_element(const struct shader_signature *signature, const char *semantic_name, unsigned int semantic_index)
Definition: d3dbc.c:533
static unsigned int make_mask_contiguous(unsigned int mask)
Definition: d3dbc.c:565
GLuint index
Definition: glext.h:6031
GLenum GLint GLuint mask
Definition: glext.h:6028
GLuint program
Definition: glext.h:6723
#define memset(x, y, z)
Definition: compat.h:39
enum vkd3d_shader_sysval_semantic sysval
Definition: spirv.c:4839
Definition: name.c:39
struct vkd3d_shader_parser p
Definition: d3dbc.c:222
static char * vkd3d_strdup(const char *string)
Definition: vkd3d_memory.h:57
bool vkd3d_array_reserve(void **elements, size_t *capacity, size_t element_count, size_t element_size)
Definition: memory.c:22
@ VKD3D_SHADER_COMPONENT_FLOAT
@ VKD3D_SHADER_TYPE_PIXEL
@ VKD3DSIM_LINEAR

Referenced by add_signature_element_from_register(), and add_signature_element_from_semantic().

◆ add_signature_element_from_register()

static bool add_signature_element_from_register ( struct vkd3d_shader_sm1_parser *  sm1,
const struct vkd3d_shader_register *  reg,
bool  is_dcl,
unsigned int  mask 
)
static

Definition at line 644 of file d3dbc.c.

646{
647 const struct vkd3d_shader_version *version = &sm1->p.program->shader_version;
648 unsigned int register_index = reg->idx_count > 0 ? reg->idx[0].offset : 0;
649
650 switch (reg->type)
651 {
652 case VKD3DSPR_TEMP:
653 if (version->type == VKD3D_SHADER_TYPE_PIXEL && version->major == 1 && !register_index)
654 return add_signature_element(sm1, true, "COLOR", 0, VKD3D_SHADER_SV_TARGET, 0, is_dcl, mask);
655 return true;
656
657 case VKD3DSPR_INPUT:
658 /* For vertex shaders or sm3 pixel shaders, we should have already
659 * had a DCL instruction. Otherwise, this is a colour input. */
660 if (version->type == VKD3D_SHADER_TYPE_VERTEX || version->major == 3)
661 {
662 add_signature_mask(sm1, false, register_index, mask);
663 return true;
664 }
665 return add_signature_element(sm1, false, "COLOR", register_index,
666 VKD3D_SHADER_SV_NONE, SM1_COLOR_REGISTER_OFFSET + register_index, is_dcl, mask);
667
668 case VKD3DSPR_TEXTURE:
669 /* For vertex shaders, this is ADDR. */
671 return true;
672 return add_signature_element(sm1, false, "TEXCOORD", register_index,
673 VKD3D_SHADER_SV_NONE, register_index, is_dcl, mask);
674
675 case VKD3DSPR_OUTPUT:
677 {
678 /* For sm < 2 vertex shaders, this is TEXCRDOUT.
679 *
680 * For sm3 vertex shaders, this is OUTPUT, but we already
681 * should have had a DCL instruction. */
682 if (version->major == 3)
683 {
684 add_signature_mask(sm1, true, register_index, mask);
685 return true;
686 }
687 return add_signature_element(sm1, true, "TEXCOORD", register_index,
688 VKD3D_SHADER_SV_NONE, register_index, is_dcl, mask);
689 }
690 /* fall through */
691
692 case VKD3DSPR_ATTROUT:
693 return add_signature_element(sm1, true, "COLOR", register_index,
694 VKD3D_SHADER_SV_NONE, SM1_COLOR_REGISTER_OFFSET + register_index, is_dcl, mask);
695
697 return add_signature_element(sm1, true, "COLOR", register_index,
698 VKD3D_SHADER_SV_TARGET, register_index, is_dcl, mask);
699
701 return add_signature_element(sm1, true, "DEPTH", 0,
702 VKD3D_SHADER_SV_DEPTH, register_index, is_dcl, 0x1);
703
704 case VKD3DSPR_RASTOUT:
705 switch (register_index)
706 {
707 case 0:
708 return add_signature_element(sm1, true, "POSITION", 0,
710
711 case 1:
712 return add_signature_element(sm1, true, "FOG", 0,
713 VKD3D_SHADER_SV_NONE, SM1_RASTOUT_REGISTER_OFFSET + register_index, is_dcl, 0x1);
714
715 case 2:
716 return add_signature_element(sm1, true, "PSIZE", 0,
717 VKD3D_SHADER_SV_NONE, SM1_RASTOUT_REGISTER_OFFSET + register_index, is_dcl, 0x1);
718
719 default:
721 "Invalid rasterizer output index %u.", register_index);
722 return true;
723 }
724
726 switch (register_index)
727 {
728 case 0:
729 return add_signature_element(sm1, false, "VPOS", 0,
730 VKD3D_SHADER_SV_POSITION, register_index, is_dcl, mask);
731
732 case 1:
733 return add_signature_element(sm1, false, "VFACE", 0,
734 VKD3D_SHADER_SV_IS_FRONT_FACE, register_index, is_dcl, 0x1);
735
736 default:
738 "Invalid miscellaneous fragment input index %u.", register_index);
739 return true;
740 }
741
742 default:
743 return true;
744 }
745}
static bool add_signature_element(struct vkd3d_shader_sm1_parser *sm1, bool output, const char *name, unsigned int index, enum vkd3d_shader_sysval_semantic sysval, unsigned int register_index, bool is_dcl, unsigned int mask)
Definition: d3dbc.c:579
static void add_signature_mask(struct vkd3d_shader_sm1_parser *sm1, bool output, unsigned int register_index, unsigned int mask)
Definition: d3dbc.c:622
static const WCHAR version[]
Definition: asmname.c:66
static int reg
Definition: i386-dis.c:1290
@ VKD3D_SHADER_SV_DEPTH
@ VKD3D_SHADER_SV_TARGET
@ VKD3D_SHADER_SV_NONE
@ VKD3D_SHADER_SV_IS_FRONT_FACE
@ VKD3D_SHADER_SV_POSITION
@ VKD3D_SHADER_TYPE_VERTEX
@ VKD3DSPR_RASTOUT
@ VKD3DSPR_COLOROUT
@ VKD3DSPR_MISCTYPE
@ VKD3DSPR_DEPTHOUT
@ VKD3DSPR_TEMP
@ VKD3DSPR_OUTPUT
@ VKD3DSPR_TEXTURE
@ VKD3DSPR_ATTROUT
@ VKD3DSPR_INPUT
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_REGISTER_INDEX
#define SM1_COLOR_REGISTER_OFFSET
void vkd3d_shader_parser_error(struct vkd3d_shader_parser *parser, enum vkd3d_shader_error error, const char *format,...) VKD3D_PRINTF_FUNC(3
#define SM1_RASTOUT_REGISTER_OFFSET

Referenced by add_signature_element_from_semantic(), and shader_sm1_scan_register().

◆ add_signature_element_from_semantic()

static bool add_signature_element_from_semantic ( struct vkd3d_shader_sm1_parser *  sm1,
const struct vkd3d_shader_semantic *  semantic 
)
static

Definition at line 747 of file d3dbc.c.

749{
750 const struct vkd3d_shader_version *version = &sm1->p.program->shader_version;
751 const struct vkd3d_shader_register *reg = &semantic->resource.reg.reg;
753 unsigned int mask = semantic->resource.reg.write_mask;
754 bool output;
755
756 static const char sm1_semantic_names[][13] =
757 {
758 [VKD3D_DECL_USAGE_POSITION ] = "POSITION",
759 [VKD3D_DECL_USAGE_BLEND_WEIGHT ] = "BLENDWEIGHT",
760 [VKD3D_DECL_USAGE_BLEND_INDICES] = "BLENDINDICES",
761 [VKD3D_DECL_USAGE_NORMAL ] = "NORMAL",
762 [VKD3D_DECL_USAGE_PSIZE ] = "PSIZE",
763 [VKD3D_DECL_USAGE_TEXCOORD ] = "TEXCOORD",
764 [VKD3D_DECL_USAGE_TANGENT ] = "TANGENT",
765 [VKD3D_DECL_USAGE_BINORMAL ] = "BINORMAL",
766 [VKD3D_DECL_USAGE_TESS_FACTOR ] = "TESSFACTOR",
767 [VKD3D_DECL_USAGE_POSITIONT ] = "POSITIONT",
768 [VKD3D_DECL_USAGE_COLOR ] = "COLOR",
769 [VKD3D_DECL_USAGE_FOG ] = "FOG",
770 [VKD3D_DECL_USAGE_DEPTH ] = "DEPTH",
771 [VKD3D_DECL_USAGE_SAMPLE ] = "SAMPLE",
772 };
773
774 if (reg->type == VKD3DSPR_OUTPUT)
775 output = true;
776 else if (reg->type == VKD3DSPR_INPUT || reg->type == VKD3DSPR_TEXTURE)
777 output = false;
778 else /* vpos and vface don't have a semantic. */
779 return add_signature_element_from_register(sm1, reg, true, mask);
780
781 /* sm2 pixel shaders use DCL but don't provide a semantic. */
782 if (version->type == VKD3D_SHADER_TYPE_PIXEL && version->major == 2)
783 return add_signature_element_from_register(sm1, reg, true, mask);
784
785 /* With the exception of vertex POSITION output, none of these are system
786 * values. Pixel POSITION input is not equivalent to SV_Position; the closer
787 * equivalent is VPOS, which is not declared as a semantic. */
789 && output && semantic->usage == VKD3D_DECL_USAGE_POSITION)
791
792 return add_signature_element(sm1, output, sm1_semantic_names[semantic->usage],
793 semantic->usage_idx, sysval, reg->idx[0].offset, true, mask);
794}
static bool add_signature_element_from_register(struct vkd3d_shader_sm1_parser *sm1, const struct vkd3d_shader_register *reg, bool is_dcl, unsigned int mask)
Definition: d3dbc.c:644
struct vkd3d_shader_resource resource
enum vkd3d_decl_usage usage
vkd3d_shader_sysval_semantic
@ VKD3D_DECL_USAGE_SAMPLE
@ VKD3D_DECL_USAGE_BLEND_WEIGHT
@ VKD3D_DECL_USAGE_BINORMAL
@ VKD3D_DECL_USAGE_TEXCOORD
@ VKD3D_DECL_USAGE_BLEND_INDICES
@ VKD3D_DECL_USAGE_TANGENT
@ VKD3D_DECL_USAGE_COLOR
@ VKD3D_DECL_USAGE_POSITION
@ VKD3D_DECL_USAGE_PSIZE
@ VKD3D_DECL_USAGE_TESS_FACTOR
@ VKD3D_DECL_USAGE_NORMAL
@ VKD3D_DECL_USAGE_DEPTH
@ VKD3D_DECL_USAGE_FOG
@ VKD3D_DECL_USAGE_POSITIONT

Referenced by shader_sm1_read_semantic().

◆ add_signature_mask()

static void add_signature_mask ( struct vkd3d_shader_sm1_parser *  sm1,
bool  output,
unsigned int  register_index,
unsigned int  mask 
)
static

Definition at line 622 of file d3dbc.c.

624{
625 struct vsir_program *program = sm1->p.program;
628
629 if (output)
630 signature = &program->output_signature;
631 else
632 signature = &program->input_signature;
633
635 {
637 "%s register %u was used without being declared.", output ? "Output" : "Input", register_index);
638 return;
639 }
640
641 element->used_mask |= mask;
642}
static struct signature_element * find_signature_element_by_register_index(const struct shader_signature *signature, unsigned int register_index)
Definition: d3dbc.c:549
@ VKD3D_SHADER_ERROR_D3DBC_UNDECLARED_SEMANTIC
void vkd3d_shader_parser_warning(struct vkd3d_shader_parser *parser, enum vkd3d_shader_error error, const char *format,...) VKD3D_PRINTF_FUNC(3

Referenced by add_signature_element_from_register().

◆ d3dbc_compile()

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

Definition at line 2359 of file d3dbc.c.

2362{
2363 const struct vkd3d_shader_version *version = &program->shader_version;
2364 struct d3dbc_compiler d3dbc = {0};
2365 struct vkd3d_bytecode_buffer *buffer = &d3dbc.buffer;
2366 int result;
2367
2368 d3dbc.program = program;
2369 d3dbc.message_context = message_context;
2370 switch (version->type)
2371 {
2374 break;
2375
2378 break;
2379
2380 default:
2382 "Invalid shader type %u.", version->type);
2384 }
2385
2386 put_u32(buffer, sm1_version(version->type, version->major, version->minor));
2387
2388 bytecode_put_bytes(buffer, ctab->code, ctab->size);
2389
2392
2394
2395 result = VKD3D_OK;
2396 if (buffer->status)
2397 result = buffer->status;
2398 if (d3dbc.failed)
2400
2401 if (!result)
2402 {
2403 out->code = buffer->data;
2404 out->size = buffer->size;
2405 }
2406 else
2407 {
2408 vkd3d_free(buffer->data);
2409 }
2410 return result;
2411}
static void put_u32(struct bytecode_buffer *buffer, uint32_t value)
static const struct vkd3d_sm1_opcode_info ps_opcode_table[]
Definition: d3dbc.c:301
static const struct vkd3d_sm1_opcode_info vs_opcode_table[]
Definition: d3dbc.c:233
static void d3dbc_write_semantic_dcls(struct d3dbc_compiler *d3dbc)
Definition: d3dbc.c:2323
static void d3dbc_write_program_instructions(struct d3dbc_compiler *d3dbc)
Definition: d3dbc.c:2350
static uint32_t sm1_version(enum vkd3d_shader_type type, unsigned int major, unsigned int minor)
Definition: d3dbc.c:1522
#define NULL
Definition: types.h:112
GLuint buffer
Definition: glext.h:5915
GLuint64EXT * result
Definition: glext.h:11304
struct vkd3d_bytecode_buffer buffer
Definition: d3dbc.c:1517
struct vkd3d_shader_message_context * message_context
Definition: d3dbc.c:1518
struct vsir_program * program
Definition: d3dbc.c:1516
const struct vkd3d_sm1_opcode_info * opcode_table
Definition: d3dbc.c:1515
bool failed
Definition: d3dbc.c:1519
const void * code
Definition: vkd3d_shader.h:413
static void vkd3d_free(void *ptr)
Definition: vkd3d_memory.h:52
size_t bytecode_put_bytes(struct vkd3d_bytecode_buffer *buffer, const void *bytes, size_t size)
vkd3d_shader_error
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_PROFILE
@ VKD3D_ERROR_INVALID_SHADER
Definition: vkd3d_types.h:53
@ VKD3D_OK
Definition: vkd3d_types.h:43
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

Referenced by hlsl_emit_bytecode().

◆ d3dbc_parse()

int d3dbc_parse ( const struct vkd3d_shader_compile_info *  compile_info,
uint64_t  config_flags,
struct vkd3d_shader_message_context *  message_context,
struct vsir_program *  program 
)

Definition at line 1349 of file d3dbc.c.

1351{
1352 struct vkd3d_shader_instruction_array *instructions;
1353 struct vkd3d_shader_sm1_parser sm1 = {0};
1354 struct vkd3d_shader_instruction *ins;
1355 unsigned int i;
1356 int ret;
1357
1358 if ((ret = shader_sm1_init(&sm1, program, compile_info, message_context)) < 0)
1359 {
1360 WARN("Failed to initialise shader parser, ret %d.\n", ret);
1361 return ret;
1362 }
1363
1364 instructions = &program->instructions;
1365 while (!shader_sm1_is_end(&sm1))
1366 {
1367 if (!shader_instruction_array_reserve(instructions, instructions->count + 1))
1368 {
1369 ERR("Failed to allocate instructions.\n");
1373 }
1374 ins = &instructions->elements[instructions->count];
1375 shader_sm1_read_instruction(&sm1, ins);
1376
1377 if (ins->opcode == VKD3DSIH_INVALID)
1378 {
1379 WARN("Encountered unrecognized or invalid instruction.\n");
1382 }
1383 ++instructions->count;
1384 }
1385
1386 for (i = 0; i < ARRAY_SIZE(program->flat_constant_count); ++i)
1387 program->flat_constant_count[i] = get_external_constant_count(&sm1, i);
1388
1389 if (sm1.p.failed && ret >= 0)
1391
1392 if (ret < 0)
1393 {
1395 return ret;
1396 }
1397
1398 return VKD3D_OK;
1399}
#define ARRAY_SIZE(A)
Definition: main.h:20
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
static bool shader_sm1_is_end(struct vkd3d_shader_sm1_parser *sm1)
Definition: d3dbc.c:1249
static enum vkd3d_result shader_sm1_init(struct vkd3d_shader_sm1_parser *sm1, struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_message_context *message_context)
Definition: d3dbc.c:1267
static uint32_t get_external_constant_count(struct vkd3d_shader_sm1_parser *sm1, enum vkd3d_shader_d3dbc_constant_register set)
Definition: d3dbc.c:1332
static void shader_sm1_read_instruction(struct vkd3d_shader_sm1_parser *sm1, struct vkd3d_shader_instruction *ins)
Definition: d3dbc.c:1126
return ret
Definition: mutex.c:147
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
void vsir_program_cleanup(struct vsir_program *program)
Definition: ir.c:105
struct vkd3d_shader_instruction * elements
enum vkd3d_shader_opcode opcode
bool shader_instruction_array_reserve(struct vkd3d_shader_instruction_array *instructions, unsigned int reserve)
@ VKD3D_SHADER_ERROR_D3DBC_OUT_OF_MEMORY
@ VKD3DSIH_INVALID
@ VKD3D_ERROR_OUT_OF_MEMORY
Definition: vkd3d_types.h:49

Referenced by hlsl_compile_shader(), and vsir_parse().

◆ d3dbc_write_instruction()

static void d3dbc_write_instruction ( struct d3dbc_compiler *  d3dbc,
const struct sm1_instruction *  instr 
)
static

Definition at line 1986 of file d3dbc.c.

1987{
1988 const struct vkd3d_shader_version *version = &d3dbc->program->shader_version;
1989 struct vkd3d_bytecode_buffer *buffer = &d3dbc->buffer;
1990 uint32_t token = instr->opcode;
1991 unsigned int i;
1992
1993 if (is_inconsequential_instr(instr))
1994 return;
1995
1997
1998 if (version->major > 1)
2001
2002 if (instr->has_dst)
2004
2005 for (i = 0; i < instr->src_count; ++i)
2007};
#define VKD3D_SM1_INSTRUCTION_LENGTH_SHIFT
Definition: d3dbc.c:46
static void write_sm1_dst_register(struct vkd3d_bytecode_buffer *buffer, const struct sm1_dst_register *reg)
Definition: d3dbc.c:1968
static void write_sm1_src_register(struct vkd3d_bytecode_buffer *buffer, const struct sm1_src_register *reg)
Definition: d3dbc.c:1977
#define VKD3D_SM1_INSTRUCTION_FLAGS_MASK
Definition: d3dbc.c:44
#define VKD3D_SM1_INSTRUCTION_FLAGS_SHIFT
Definition: d3dbc.c:43
static bool is_inconsequential_instr(const struct sm1_instruction *instr)
Definition: d3dbc.c:1942
UINT32 uint32_t
Definition: types.h:75
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 token
Definition: glfuncs.h:210
unsigned int flags
Definition: d3dbc.c:1920
struct sm1_instruction::sm1_src_register srcs[4]
enum vkd3d_sm1_opcode opcode
Definition: d3dbc.c:1919
unsigned int src_count
Definition: d3dbc.c:1937
struct sm1_instruction::sm1_dst_register dst
unsigned int has_dst
Definition: d3dbc.c:1939

Referenced by d3dbc_write_vsir_simple_instruction().

◆ d3dbc_write_program_instructions()

static void d3dbc_write_program_instructions ( struct d3dbc_compiler *  d3dbc)
static

Definition at line 2350 of file d3dbc.c.

2351{
2352 struct vsir_program *program = d3dbc->program;
2353 unsigned int i;
2354
2355 for (i = 0; i < program->instructions.count; ++i)
2356 d3dbc_write_vsir_instruction(d3dbc, &program->instructions.elements[i]);
2357}
static void d3dbc_write_vsir_instruction(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
Definition: d3dbc.c:2221

Referenced by d3dbc_compile().

◆ d3dbc_write_semantic_dcl()

static void d3dbc_write_semantic_dcl ( struct d3dbc_compiler *  d3dbc,
const struct signature_element *  element,
bool  output 
)
static

Definition at line 2285 of file d3dbc.c.

2287{
2288 const struct vkd3d_shader_version *version = &d3dbc->program->shader_version;
2289 struct vkd3d_bytecode_buffer *buffer = &d3dbc->buffer;
2290 struct sm1_dst_register reg = {0};
2293 bool ret;
2294
2296 element->semantic_index, output, &reg.type, &reg.reg))
2297 {
2298 usage = 0;
2299 usage_idx = 0;
2300 }
2301 else
2302 {
2303 ret = sm1_usage_from_semantic_name(element->semantic_name, element->semantic_index, &usage, &usage_idx);
2305 reg.type = output ? VKD3DSPR_OUTPUT : VKD3DSPR_INPUT;
2306 reg.reg = element->register_index;
2307 }
2308
2310 if (version->major > 1)
2313
2314 token = (1u << 31);
2318
2319 reg.writemask = element->mask;
2321}
BYTE usage_idx
bool sm1_register_from_semantic_name(const struct vkd3d_shader_version *version, const char *semantic_name, unsigned int semantic_index, bool output, enum vkd3d_shader_register_type *type, unsigned int *reg)
Definition: d3dbc.c:1401
#define VKD3D_SM1_DCL_USAGE_INDEX_SHIFT
Definition: d3dbc.c:35
bool sm1_usage_from_semantic_name(const char *semantic_name, uint32_t semantic_index, enum vkd3d_decl_usage *usage, uint32_t *usage_idx)
Definition: d3dbc.c:1469
#define VKD3D_SM1_DCL_USAGE_SHIFT
Definition: d3dbc.c:33
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
#define VKD3D_ASSERT(cond)
Definition: vkd3d_common.h:49

Referenced by d3dbc_write_semantic_dcls().

◆ d3dbc_write_semantic_dcls()

static void d3dbc_write_semantic_dcls ( struct d3dbc_compiler *  d3dbc)
static

Definition at line 2323 of file d3dbc.c.

2324{
2325 struct vsir_program *program = d3dbc->program;
2326 const struct vkd3d_shader_version *version;
2327 bool write_in = false, write_out = false;
2328
2329 version = &program->shader_version;
2330 if (version->type == VKD3D_SHADER_TYPE_PIXEL && version->major >= 2)
2331 write_in = true;
2332 else if (version->type == VKD3D_SHADER_TYPE_VERTEX && version->major == 3)
2333 write_in = write_out = true;
2334 else if (version->type == VKD3D_SHADER_TYPE_VERTEX && version->major < 3)
2335 write_in = true;
2336
2337 if (write_in)
2338 {
2339 for (unsigned int i = 0; i < program->input_signature.element_count; ++i)
2340 d3dbc_write_semantic_dcl(d3dbc, &program->input_signature.elements[i], false);
2341 }
2342
2343 if (write_out)
2344 {
2345 for (unsigned int i = 0; i < program->output_signature.element_count; ++i)
2346 d3dbc_write_semantic_dcl(d3dbc, &program->output_signature.elements[i], true);
2347 }
2348}
static void d3dbc_write_semantic_dcl(struct d3dbc_compiler *d3dbc, const struct signature_element *element, bool output)
Definition: d3dbc.c:2285

Referenced by d3dbc_compile().

◆ d3dbc_write_vsir_dcl()

static void d3dbc_write_vsir_dcl ( struct d3dbc_compiler *  d3dbc,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 2125 of file d3dbc.c.

2126{
2127 const struct vkd3d_shader_version *version = &d3dbc->program->shader_version;
2128 const struct vkd3d_shader_semantic *semantic = &ins->declaration.semantic;
2129 unsigned int reg_id;
2130
2131 if (version->major < 2)
2132 return;
2133
2134 reg_id = semantic->resource.reg.reg.idx[0].offset;
2135
2136 if (semantic->resource.reg.reg.type != VKD3DSPR_SAMPLER)
2137 {
2139 "dcl instruction with register type %u.", semantic->resource.reg.reg.type);
2140 d3dbc->failed = true;
2141 return;
2142 }
2143
2144 switch (semantic->resource_type)
2145 {
2148 break;
2149
2152 break;
2153
2156 break;
2157
2158 default:
2160 "dcl instruction with resource_type %u.", semantic->resource_type);
2161 d3dbc->failed = true;
2162 return;
2163 }
2164}
static void d3dbc_write_vsir_sampler_dcl(struct d3dbc_compiler *d3dbc, unsigned int reg_id, enum vkd3d_sm1_resource_type res_type)
Definition: d3dbc.c:2101
struct vkd3d_shader_location location
union vkd3d_shader_instruction::@6020 declaration
struct vkd3d_shader_semantic semantic
enum vkd3d_shader_resource_type resource_type
@ VKD3D_SHADER_RESOURCE_TEXTURE_3D
@ VKD3D_SHADER_RESOURCE_TEXTURE_CUBE
@ VKD3D_SHADER_RESOURCE_TEXTURE_2D
@ VKD3DSPR_SAMPLER
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_REGISTER_TYPE
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_RESOURCE_TYPE

Referenced by d3dbc_write_vsir_instruction().

◆ d3dbc_write_vsir_def()

static void d3dbc_write_vsir_def ( struct d3dbc_compiler *  d3dbc,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 2078 of file d3dbc.c.

2079{
2080 const struct vkd3d_shader_version *version = &d3dbc->program->shader_version;
2081 struct vkd3d_bytecode_buffer *buffer = &d3dbc->buffer;
2083
2084 const struct sm1_dst_register reg =
2085 {
2086 .type = VKD3DSPR_CONST,
2087 .writemask = VKD3DSP_WRITEMASK_ALL,
2088 .reg = ins->dst[0].reg.idx[0].offset,
2089 };
2090
2092 if (version->major > 1)
2095
2097 for (unsigned int x = 0; x < 4; ++x)
2098 put_f32(buffer, ins->src[0].reg.u.immconst_f32[x]);
2099}
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
struct vkd3d_shader_src_param * src
struct vkd3d_shader_dst_param * dst
@ VKD3DSPR_CONST
#define VKD3DSP_WRITEMASK_ALL
static size_t put_f32(struct vkd3d_bytecode_buffer *buffer, float value)

Referenced by d3dbc_write_vsir_instruction().

◆ d3dbc_write_vsir_instruction()

static void d3dbc_write_vsir_instruction ( struct d3dbc_compiler *  d3dbc,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 2221 of file d3dbc.c.

2222{
2223 uint32_t writemask;
2224
2225 switch (ins->opcode)
2226 {
2227 case VKD3DSIH_DEF:
2228 d3dbc_write_vsir_def(d3dbc, ins);
2229 break;
2230
2231 case VKD3DSIH_DCL:
2232 d3dbc_write_vsir_dcl(d3dbc, ins);
2233 break;
2234
2235 case VKD3DSIH_ABS:
2236 case VKD3DSIH_ADD:
2237 case VKD3DSIH_CMP:
2238 case VKD3DSIH_DP2ADD:
2239 case VKD3DSIH_DP3:
2240 case VKD3DSIH_DP4:
2241 case VKD3DSIH_DSX:
2242 case VKD3DSIH_DSY:
2243 case VKD3DSIH_ELSE:
2244 case VKD3DSIH_ENDIF:
2245 case VKD3DSIH_FRC:
2246 case VKD3DSIH_IFC:
2247 case VKD3DSIH_MAD:
2248 case VKD3DSIH_MAX:
2249 case VKD3DSIH_MIN:
2250 case VKD3DSIH_MOV:
2251 case VKD3DSIH_MUL:
2252 case VKD3DSIH_SINCOS:
2253 case VKD3DSIH_SLT:
2254 case VKD3DSIH_TEX:
2255 case VKD3DSIH_TEXKILL:
2256 case VKD3DSIH_TEXLDD:
2258 break;
2259
2260 case VKD3DSIH_EXP:
2261 case VKD3DSIH_LOG:
2262 case VKD3DSIH_RCP:
2263 case VKD3DSIH_RSQ:
2264 writemask = ins->dst->write_mask;
2265 if (writemask != VKD3DSP_WRITEMASK_0 && writemask != VKD3DSP_WRITEMASK_1
2266 && writemask != VKD3DSP_WRITEMASK_2 && writemask != VKD3DSP_WRITEMASK_3)
2267 {
2270 "writemask %#x for vsir instruction with opcode %#x is not single component.",
2271 writemask, ins->opcode);
2272 d3dbc->failed = true;
2273 }
2275 break;
2276
2277 default:
2279 "vsir instruction with opcode %#x.", ins->opcode);
2280 d3dbc->failed = true;
2281 break;
2282 }
2283}
static void d3dbc_write_vsir_dcl(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
Definition: d3dbc.c:2125
static void d3dbc_write_vsir_simple_instruction(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
Definition: d3dbc.c:2199
static void d3dbc_write_vsir_def(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
Definition: d3dbc.c:2078
#define VKD3DSP_WRITEMASK_3
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_OPCODE
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_WRITEMASK
@ VKD3DSIH_TEX
@ VKD3DSIH_DP4
@ VKD3DSIH_TEXKILL
@ VKD3DSIH_MUL
@ VKD3DSIH_EXP
@ VKD3DSIH_IFC
@ VKD3DSIH_MIN
@ VKD3DSIH_RCP
@ VKD3DSIH_RSQ
@ VKD3DSIH_ENDIF
@ VKD3DSIH_SLT
@ VKD3DSIH_LOG
@ VKD3DSIH_TEXLDD
@ VKD3DSIH_MAD
@ VKD3DSIH_ADD
@ VKD3DSIH_DEF
@ VKD3DSIH_DSY
@ VKD3DSIH_MOV
@ VKD3DSIH_MAX
@ VKD3DSIH_CMP
@ VKD3DSIH_DCL
@ VKD3DSIH_FRC
@ VKD3DSIH_ELSE
@ VKD3DSIH_DP2ADD
@ VKD3DSIH_SINCOS
@ VKD3DSIH_DP3
@ VKD3DSIH_DSX
@ VKD3DSIH_ABS
#define VKD3DSP_WRITEMASK_0
#define VKD3DSP_WRITEMASK_1
#define VKD3DSP_WRITEMASK_2

Referenced by d3dbc_write_program_instructions().

◆ d3dbc_write_vsir_sampler_dcl()

static void d3dbc_write_vsir_sampler_dcl ( struct d3dbc_compiler *  d3dbc,
unsigned int  reg_id,
enum vkd3d_sm1_resource_type  res_type 
)
static

Definition at line 2101 of file d3dbc.c.

2103{
2104 const struct vkd3d_shader_version *version = &d3dbc->program->shader_version;
2105 struct vkd3d_bytecode_buffer *buffer = &d3dbc->buffer;
2106 struct sm1_dst_register reg = {0};
2108
2110 if (version->major > 1)
2113
2115 token |= res_type << VKD3D_SM1_RESOURCE_TYPE_SHIFT;
2117
2119 reg.writemask = VKD3DSP_WRITEMASK_ALL;
2120 reg.reg = reg_id;
2121
2123}
#define VKD3D_SM1_RESOURCE_TYPE_SHIFT
Definition: d3dbc.c:38
#define VKD3D_SM1_INSTRUCTION_PARAMETER
Definition: d3dbc.c:56
@ VKD3DSPR_COMBINED_SAMPLER

Referenced by d3dbc_write_vsir_dcl().

◆ d3dbc_write_vsir_simple_instruction()

static void d3dbc_write_vsir_simple_instruction ( struct d3dbc_compiler *  d3dbc,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 2199 of file d3dbc.c.

2201{
2202 struct sm1_instruction instr = {0};
2203 const struct vkd3d_sm1_opcode_info *info;
2204
2206 return;
2207
2208 instr.opcode = info->sm1_opcode;
2209 instr.flags = ins->flags;
2210 instr.has_dst = info->dst_count;
2211 instr.src_count = info->src_count;
2212
2213 if (instr.has_dst)
2214 sm1_dst_reg_from_vsir(d3dbc, &ins->dst[0], &instr.dst, &ins->location);
2215 for (unsigned int i = 0; i < instr.src_count; ++i)
2216 sm1_src_reg_from_vsir(d3dbc, &ins->src[i], &instr.srcs[i], &ins->location);
2217
2218 d3dbc_write_instruction(d3dbc, &instr);
2219}
static const struct vkd3d_sm1_opcode_info * shader_sm1_get_opcode_info_from_vsir_instruction(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
Definition: d3dbc.c:2166
static void sm1_dst_reg_from_vsir(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_dst_param *param, struct sm1_dst_register *dst, const struct vkd3d_shader_location *loc)
Definition: d3dbc.c:2062
static void d3dbc_write_instruction(struct d3dbc_compiler *d3dbc, const struct sm1_instruction *instr)
Definition: d3dbc.c:1986
static void sm1_src_reg_from_vsir(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_src_param *param, struct sm1_src_register *src, const struct vkd3d_shader_location *loc)
Definition: d3dbc.c:2046

Referenced by d3dbc_write_vsir_instruction().

◆ find_signature_element()

static struct signature_element * find_signature_element ( const struct shader_signature *  signature,
const char *  semantic_name,
unsigned int  semantic_index 
)
static

Definition at line 533 of file d3dbc.c.

535{
536 struct signature_element *e = signature->elements;
537 unsigned int i;
538
539 for (i = 0; i < signature->element_count; ++i)
540 {
543 return &e[i];
544 }
545
546 return NULL;
547}
#define e
Definition: ke_i.h:82
static int ascii_strcasecmp(const char *a, const char *b)
Definition: vkd3d_common.h:437

Referenced by add_signature_element().

◆ find_signature_element_by_register_index()

static struct signature_element * find_signature_element_by_register_index ( const struct shader_signature *  signature,
unsigned int  register_index 
)
static

Definition at line 549 of file d3dbc.c.

551{
552 struct signature_element *e = signature->elements;
553 unsigned int i;
554
555 for (i = 0; i < signature->element_count; ++i)
556 {
558 return &e[i];
559 }
560
561 return NULL;
562}

Referenced by add_signature_mask().

◆ get_external_constant_count()

static uint32_t get_external_constant_count ( struct vkd3d_shader_sm1_parser *  sm1,
enum vkd3d_shader_d3dbc_constant_register  set 
)
static

Definition at line 1332 of file d3dbc.c.

1334{
1335 unsigned int j;
1336
1337 /* Find the highest constant index which is not written by a DEF
1338 * instruction. We can't (easily) use an FFZ function for this since it
1339 * needs to be limited by the highest used register index. */
1340 for (j = sm1->constants[set].count; j > 0; --j)
1341 {
1342 if (!bitmap_is_set(sm1->constants[set].def_mask, j - 1))
1343 return j;
1344 }
1345
1346 return 0;
1347}
Definition: _set.h:50
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
struct vkd3d_shader_sm1_parser::@5991 constants[3]
static bool bitmap_is_set(const uint32_t *map, unsigned int idx)
Definition: vkd3d_common.h:408

Referenced by d3dbc_parse().

◆ has_relative_address()

static bool has_relative_address ( uint32_t  param)
static

Definition at line 410 of file d3dbc.c.

411{
412 enum vkd3d_sm1_address_mode_type address_mode;
413
415
416 return address_mode == VKD3D_SM1_ADDRESS_MODE_RELATIVE;
417}
vkd3d_sm1_address_mode_type
Definition: d3dbc.c:93
#define VKD3D_SM1_ADDRESS_MODE_SHIFT
Definition: d3dbc.c:65
#define VKD3D_SM1_ADDRESS_MODE_MASK
Definition: d3dbc.c:66
GLfloat param
Definition: glext.h:5796

Referenced by shader_sm1_read_dst_param(), shader_sm1_read_param(), and shader_sm1_read_src_param().

◆ hlsl_sm1_base_type()

D3DXPARAMETER_TYPE hlsl_sm1_base_type ( const struct hlsl_type *  type)

Definition at line 1575 of file d3dbc.c.

1576{
1577 switch (type->class)
1578 {
1579 case HLSL_CLASS_SCALAR:
1580 case HLSL_CLASS_VECTOR:
1581 case HLSL_CLASS_MATRIX:
1582 switch (type->e.numeric.type)
1583 {
1584 case HLSL_TYPE_BOOL:
1585 return D3DXPT_BOOL;
1586 /* Actually double behaves differently depending on DLL version:
1587 * For <= 36, it maps to D3DXPT_FLOAT.
1588 * For 37-40, it maps to zero (D3DXPT_VOID).
1589 * For >= 41, it maps to 39, which is D3D_SVT_DOUBLE (note D3D_SVT_*
1590 * values are mostly compatible with D3DXPT_*).
1591 * However, the latter two cases look like bugs, and a reasonable
1592 * application certainly wouldn't know what to do with them.
1593 * For fx_2_0 it's always D3DXPT_FLOAT regardless of DLL version. */
1594 case HLSL_TYPE_DOUBLE:
1595 case HLSL_TYPE_FLOAT:
1596 case HLSL_TYPE_HALF:
1597 return D3DXPT_FLOAT;
1598 case HLSL_TYPE_INT:
1599 case HLSL_TYPE_UINT:
1600 return D3DXPT_INT;
1601 default:
1603 }
1604
1605 case HLSL_CLASS_SAMPLER:
1606 switch (type->sampler_dim)
1607 {
1609 return D3DXPT_SAMPLER1D;
1611 return D3DXPT_SAMPLER2D;
1613 return D3DXPT_SAMPLER3D;
1615 return D3DXPT_SAMPLERCUBE;
1617 return D3DXPT_SAMPLER;
1618 default:
1619 ERR("Invalid dimension %#x.\n", type->sampler_dim);
1621 }
1622 break;
1623
1624 case HLSL_CLASS_TEXTURE:
1625 switch (type->sampler_dim)
1626 {
1628 return D3DXPT_TEXTURE1D;
1630 return D3DXPT_TEXTURE2D;
1632 return D3DXPT_TEXTURE3D;
1634 return D3DXPT_TEXTURECUBE;
1636 return D3DXPT_TEXTURE;
1637 default:
1638 ERR("Invalid dimension %#x.\n", type->sampler_dim);
1640 }
1641 break;
1642
1643 case HLSL_CLASS_ARRAY:
1644 return hlsl_sm1_base_type(type->e.array.type);
1645
1646 case HLSL_CLASS_STRUCT:
1647 return D3DXPT_VOID;
1648
1649 case HLSL_CLASS_STRING:
1650 return D3DXPT_STRING;
1651
1653 return D3DXPT_PIXELSHADER;
1654
1656 return D3DXPT_VERTEXSHADER;
1657
1661 case HLSL_CLASS_ERROR:
1662 case HLSL_CLASS_PASS:
1666 case HLSL_CLASS_UAV:
1667 case HLSL_CLASS_VOID:
1674 case HLSL_CLASS_NULL:
1675 break;
1676 }
1677
1679}
D3DXPARAMETER_TYPE hlsl_sm1_base_type(const struct hlsl_type *type)
Definition: d3dbc.c:1575
@ D3DXPT_STRING
Definition: d3dx9shader.h:77
@ D3DXPT_TEXTURE
Definition: d3dx9shader.h:78
@ D3DXPT_SAMPLER3D
Definition: d3dx9shader.h:86
@ D3DXPT_VERTEXSHADER
Definition: d3dx9shader.h:89
@ D3DXPT_TEXTURE1D
Definition: d3dx9shader.h:79
@ D3DXPT_SAMPLERCUBE
Definition: d3dx9shader.h:87
@ D3DXPT_FLOAT
Definition: d3dx9shader.h:76
@ D3DXPT_TEXTURECUBE
Definition: d3dx9shader.h:82
@ D3DXPT_PIXELSHADER
Definition: d3dx9shader.h:88
@ D3DXPT_BOOL
Definition: d3dx9shader.h:74
@ D3DXPT_INT
Definition: d3dx9shader.h:75
@ D3DXPT_VOID
Definition: d3dx9shader.h:73
@ D3DXPT_SAMPLER
Definition: d3dx9shader.h:83
@ D3DXPT_SAMPLER1D
Definition: d3dx9shader.h:84
@ D3DXPT_SAMPLER2D
Definition: d3dx9shader.h:85
@ D3DXPT_TEXTURE3D
Definition: d3dx9shader.h:81
@ D3DXPT_TEXTURE2D
Definition: d3dx9shader.h:80
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
@ HLSL_CLASS_COMPUTE_SHADER
Definition: hlsl.h:102
@ HLSL_CLASS_RASTERIZER_STATE
Definition: hlsl.h:94
@ HLSL_CLASS_RENDER_TARGET_VIEW
Definition: hlsl.h:95
@ HLSL_CLASS_VERTEX_SHADER
Definition: hlsl.h:101
@ HLSL_CLASS_MATRIX
Definition: hlsl.h:85
@ HLSL_CLASS_GEOMETRY_SHADER
Definition: hlsl.h:105
@ HLSL_CLASS_TECHNIQUE
Definition: hlsl.h:98
@ HLSL_CLASS_SAMPLER
Definition: hlsl.h:96
@ HLSL_CLASS_UAV
Definition: hlsl.h:100
@ HLSL_CLASS_VECTOR
Definition: hlsl.h:84
@ HLSL_CLASS_TEXTURE
Definition: hlsl.h:99
@ HLSL_CLASS_DEPTH_STENCIL_VIEW
Definition: hlsl.h:90
@ HLSL_CLASS_STRUCT
Definition: hlsl.h:87
@ HLSL_CLASS_CONSTANT_BUFFER
Definition: hlsl.h:106
@ HLSL_CLASS_VOID
Definition: hlsl.h:108
@ HLSL_CLASS_SCALAR
Definition: hlsl.h:83
@ HLSL_CLASS_EFFECT_GROUP
Definition: hlsl.h:91
@ HLSL_CLASS_PIXEL_SHADER
Definition: hlsl.h:93
@ HLSL_CLASS_BLEND_STATE
Definition: hlsl.h:107
@ HLSL_CLASS_STRING
Definition: hlsl.h:97
@ HLSL_CLASS_HULL_SHADER
Definition: hlsl.h:104
@ HLSL_CLASS_DOMAIN_SHADER
Definition: hlsl.h:103
@ HLSL_CLASS_NULL
Definition: hlsl.h:109
@ HLSL_CLASS_ARRAY
Definition: hlsl.h:88
@ HLSL_CLASS_DEPTH_STENCIL_STATE
Definition: hlsl.h:89
@ HLSL_CLASS_PASS
Definition: hlsl.h:92
@ HLSL_CLASS_ERROR
Definition: hlsl.h:110
@ HLSL_TYPE_HALF
Definition: hlsl.h:116
@ HLSL_TYPE_BOOL
Definition: hlsl.h:120
@ HLSL_TYPE_UINT
Definition: hlsl.h:119
@ HLSL_TYPE_INT
Definition: hlsl.h:118
@ HLSL_TYPE_FLOAT
Definition: hlsl.h:115
@ HLSL_TYPE_DOUBLE
Definition: hlsl.h:117
@ HLSL_SAMPLER_DIM_GENERIC
Definition: hlsl.h:126
@ HLSL_SAMPLER_DIM_CUBE
Definition: hlsl.h:131
@ HLSL_SAMPLER_DIM_3D
Definition: hlsl.h:130
@ HLSL_SAMPLER_DIM_2D
Definition: hlsl.h:129
@ HLSL_SAMPLER_DIM_1D
Definition: hlsl.h:128
#define vkd3d_unreachable()
Definition: vkd3d_common.h:119

Referenced by hlsl_sm1_base_type(), write_fx_2_parameter(), and write_sm1_type().

◆ hlsl_sm1_class()

D3DXPARAMETER_CLASS hlsl_sm1_class ( const struct hlsl_type *  type)

Definition at line 1528 of file d3dbc.c.

1529{
1530 switch (type->class)
1531 {
1532 case HLSL_CLASS_ARRAY:
1533 return hlsl_sm1_class(type->e.array.type);
1534 case HLSL_CLASS_MATRIX:
1536 if (type->modifiers & HLSL_MODIFIER_COLUMN_MAJOR)
1537 return D3DXPC_MATRIX_COLUMNS;
1538 else
1539 return D3DXPC_MATRIX_ROWS;
1540 case HLSL_CLASS_SCALAR:
1541 return D3DXPC_SCALAR;
1542 case HLSL_CLASS_STRUCT:
1543 return D3DXPC_STRUCT;
1544 case HLSL_CLASS_VECTOR:
1545 return D3DXPC_VECTOR;
1547 case HLSL_CLASS_SAMPLER:
1548 case HLSL_CLASS_STRING:
1549 case HLSL_CLASS_TEXTURE:
1551 return D3DXPC_OBJECT;
1555 case HLSL_CLASS_ERROR:
1556 case HLSL_CLASS_PASS:
1560 case HLSL_CLASS_UAV:
1561 case HLSL_CLASS_VOID:
1568 case HLSL_CLASS_NULL:
1569 break;
1570 }
1571
1573}
D3DXPARAMETER_CLASS hlsl_sm1_class(const struct hlsl_type *type)
Definition: d3dbc.c:1528
@ D3DXPC_SCALAR
Definition: d3dx9shader.h:62
@ D3DXPC_MATRIX_COLUMNS
Definition: d3dx9shader.h:65
@ D3DXPC_STRUCT
Definition: d3dx9shader.h:67
@ D3DXPC_MATRIX_ROWS
Definition: d3dx9shader.h:64
@ D3DXPC_VECTOR
Definition: d3dx9shader.h:63
@ D3DXPC_OBJECT
Definition: d3dx9shader.h:66
#define HLSL_MODIFIERS_MAJORITY_MASK
Definition: hlsl.h:427
#define HLSL_MODIFIER_COLUMN_MAJOR
Definition: hlsl.h:407

Referenced by get_fx_2_type_class(), hlsl_sm1_class(), and write_sm1_type().

◆ idx_count_from_reg_type()

static unsigned int idx_count_from_reg_type ( enum vkd3d_shader_register_type  reg_type)
static

Definition at line 456 of file d3dbc.c.

457{
458 switch (reg_type)
459 {
461 return 0;
462
463 default:
464 return 1;
465 }
466}
enum vkd3d_shader_register_type reg_type
Definition: spirv.c:4885

Referenced by shader_sm1_parse_dst_param(), and shader_sm1_parse_src_param().

◆ is_inconsequential_instr()

static bool is_inconsequential_instr ( const struct sm1_instruction *  instr)
static

Definition at line 1942 of file d3dbc.c.

1943{
1944 const struct sm1_src_register *src = &instr->srcs[0];
1945 const struct sm1_dst_register *dst = &instr->dst;
1946 unsigned int i;
1947
1948 if (instr->opcode != VKD3D_SM1_OP_MOV)
1949 return false;
1950 if (dst->mod != VKD3DSPDM_NONE)
1951 return false;
1952 if (src->mod != VKD3DSPSM_NONE)
1953 return false;
1954 if (src->type != dst->type)
1955 return false;
1956 if (src->reg != dst->reg)
1957 return false;
1958
1959 for (i = 0; i < 4; ++i)
1960 {
1961 if ((dst->writemask & (1 << i)) && (vsir_swizzle_get_component(src->swizzle, i) != i))
1962 return false;
1963 }
1964
1965 return true;
1966}
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340
@ VKD3DSPSM_NONE
static unsigned int vsir_swizzle_get_component(uint32_t swizzle, unsigned int idx)
@ VKD3DSPDM_NONE

Referenced by d3dbc_write_instruction().

◆ make_mask_contiguous()

static unsigned int make_mask_contiguous ( unsigned int  mask)
static

Definition at line 565 of file d3dbc.c.

566{
567 static const unsigned int table[] =
568 {
569 0x0, 0x1, 0x2, 0x3,
570 0x4, 0x7, 0x6, 0x7,
571 0x8, 0xf, 0xe, 0xf,
572 0xc, 0xf, 0xe, 0xf,
573 };
574
576 return table[mask];
577}

Referenced by add_signature_element().

◆ mask_from_swizzle()

static unsigned int mask_from_swizzle ( uint32_t  swizzle)
static

Definition at line 1118 of file d3dbc.c.

1119{
1120 return (1u << vsir_swizzle_get_component(swizzle, 0))
1123 | (1u << vsir_swizzle_get_component(swizzle, 3));
1124}
GLuint GLenum swizzle
Definition: glext.h:9511

Referenced by shader_sm1_read_instruction().

◆ read_u32()

static uint32_t read_u32 ( const uint32_t **  ptr)
static

Definition at line 405 of file d3dbc.c.

406{
407 return *(*ptr)++;
408}

Referenced by shader_sm1_read_instruction(), shader_sm1_read_param(), and shader_sm1_read_semantic().

◆ record_constant_register()

static void record_constant_register ( struct vkd3d_shader_sm1_parser *  sm1,
enum vkd3d_shader_d3dbc_constant_register  set,
uint32_t  index,
bool  from_def 
)
static

Definition at line 796 of file d3dbc.c.

798{
799 sm1->constants[set].count = max(sm1->constants[set].count, index + 1);
800 if (from_def)
801 {
802 /* d3d shaders have a maximum of 8192 constants; we should not overrun
803 * this array. */
804 VKD3D_ASSERT((index / 32) <= ARRAY_SIZE(sm1->constants[set].def_mask));
805 bitmap_set(sm1->constants[set].def_mask, index);
806 }
807}
static __inline void bitmap_set(IN bitmap4 *mask, IN uint32_t word, IN uint32_t flag)
Definition: util.h:62
#define max(a, b)
Definition: svc.c:63

Referenced by shader_sm1_scan_register().

◆ shader_sm1_get_opcode_info()

static const struct vkd3d_sm1_opcode_info * shader_sm1_get_opcode_info ( const struct vkd3d_shader_sm1_parser *  sm1,
enum vkd3d_sm1_opcode  opcode 
)
static

Definition at line 419 of file d3dbc.c.

421{
422 const struct vkd3d_shader_version *version = &sm1->p.program->shader_version;
423 const struct vkd3d_sm1_opcode_info *info;
424 unsigned int i = 0;
425
426 for (;;)
427 {
428 info = &sm1->opcode_table[i++];
429 if (info->vkd3d_opcode == VKD3DSIH_INVALID)
430 return NULL;
431
432 if (opcode == info->sm1_opcode
433 && vkd3d_shader_ver_ge(version, info->min_version.major, info->min_version.minor)
434 && (vkd3d_shader_ver_le(version, info->max_version.major, info->max_version.minor)
435 || !info->max_version.major))
436 return info;
437 }
438}
const struct vkd3d_sm1_opcode_info * opcode_table
Definition: d3dbc.c:218
static bool vkd3d_shader_ver_ge(const struct vkd3d_shader_version *v, unsigned int major, unsigned int minor)
static bool vkd3d_shader_ver_le(const struct vkd3d_shader_version *v, unsigned int major, unsigned int minor)

Referenced by shader_sm1_read_instruction().

◆ shader_sm1_get_opcode_info_from_vsir()

static const struct vkd3d_sm1_opcode_info * shader_sm1_get_opcode_info_from_vsir ( struct d3dbc_compiler *  d3dbc,
enum vkd3d_shader_opcode  vkd3d_opcode 
)
static

Definition at line 2009 of file d3dbc.c.

2011{
2012 const struct vkd3d_shader_version *version = &d3dbc->program->shader_version;
2013 const struct vkd3d_sm1_opcode_info *info;
2014 unsigned int i = 0;
2015
2016 for (;;)
2017 {
2018 info = &d3dbc->opcode_table[i++];
2019 if (info->vkd3d_opcode == VKD3DSIH_INVALID)
2020 return NULL;
2021
2022 if (vkd3d_opcode == info->vkd3d_opcode
2023 && vkd3d_shader_ver_ge(version, info->min_version.major, info->min_version.minor)
2024 && (vkd3d_shader_ver_le(version, info->max_version.major, info->max_version.minor)
2025 || !info->max_version.major))
2026 return info;
2027 }
2028}
enum vkd3d_shader_opcode vkd3d_opcode
Definition: d3dbc.c:209

Referenced by shader_sm1_get_opcode_info_from_vsir_instruction().

◆ shader_sm1_get_opcode_info_from_vsir_instruction()

static const struct vkd3d_sm1_opcode_info * shader_sm1_get_opcode_info_from_vsir_instruction ( struct d3dbc_compiler *  d3dbc,
const struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 2166 of file d3dbc.c.

2168{
2169 const struct vkd3d_sm1_opcode_info *info;
2170
2171 if (!(info = shader_sm1_get_opcode_info_from_vsir(d3dbc, ins->opcode)))
2172 {
2174 "Opcode %#x not supported for shader profile.", ins->opcode);
2175 d3dbc->failed = true;
2176 return NULL;
2177 }
2178
2179 if (ins->dst_count != info->dst_count)
2180 {
2182 "Invalid destination count %u for vsir instruction %#x (expected %u).",
2183 ins->dst_count, ins->opcode, info->dst_count);
2184 d3dbc->failed = true;
2185 return NULL;
2186 }
2187 if (ins->src_count != info->src_count)
2188 {
2190 "Invalid source count %u for vsir instruction %#x (expected %u).",
2191 ins->src_count, ins->opcode, info->src_count);
2192 d3dbc->failed = true;
2193 return NULL;
2194 }
2195
2196 return info;
2197}
static const struct vkd3d_sm1_opcode_info * shader_sm1_get_opcode_info_from_vsir(struct d3dbc_compiler *d3dbc, enum vkd3d_shader_opcode vkd3d_opcode)
Definition: d3dbc.c:2009
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_REGISTER_COUNT

Referenced by d3dbc_write_vsir_simple_instruction().

◆ shader_sm1_get_swizzle_component()

static unsigned int shader_sm1_get_swizzle_component ( uint32_t  swizzle,
unsigned int  idx 
)
static

Definition at line 440 of file d3dbc.c.

441{
443}
#define VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT(idx)
Definition: d3dbc.c:81
#define VKD3D_SM1_SWIZZLE_COMPONENT_MASK(idx)
Definition: d3dbc.c:82
unsigned int idx
Definition: utils.c:40

Referenced by swizzle_from_sm1().

◆ shader_sm1_init()

static enum vkd3d_result shader_sm1_init ( struct vkd3d_shader_sm1_parser *  sm1,
struct vsir_program *  program,
const struct vkd3d_shader_compile_info *  compile_info,
struct vkd3d_shader_message_context *  message_context 
)
static

Definition at line 1267 of file d3dbc.c.

1269{
1270 const struct vkd3d_shader_location location = {.source_name = compile_info->source_name};
1271 const uint32_t *code = compile_info->source.code;
1272 size_t code_size = compile_info->source.size;
1275 size_t token_count;
1276
1277 token_count = code_size / sizeof(*sm1->start);
1278
1279 if (token_count < 2)
1280 {
1282 "Invalid shader size %zu (token count %zu). At least 2 tokens are required.",
1283 code_size, token_count);
1285 }
1286
1287 TRACE("Version: 0x%08x.\n", code[0]);
1288
1289 shader_type = code[0] >> 16;
1292
1293 switch (shader_type)
1294 {
1295 case VKD3D_SM1_VS:
1298 break;
1299
1300 case VKD3D_SM1_PS:
1303 break;
1304
1305 default:
1307 "Invalid shader type %#x (token 0x%08x).", shader_type, code[0]);
1309 }
1310
1311 if (!vkd3d_shader_ver_le(&version, 3, 0))
1312 {
1314 "Invalid shader version %u.%u (token 0x%08x).", version.major, version.minor, code[0]);
1316 }
1317
1318 sm1->start = &code[1];
1319 sm1->end = &code[token_count];
1320
1321 /* Estimate instruction count to avoid reallocation in most shaders. */
1322 if (!vsir_program_init(program, compile_info, &version,
1323 code_size != ~(size_t)0 ? token_count / 4u + 4 : 16, VSIR_CF_STRUCTURED, VSIR_NOT_NORMALISED))
1325
1326 vkd3d_shader_parser_init(&sm1->p, program, message_context, compile_info->source_name);
1327 sm1->ptr = sm1->start;
1328
1329 return VKD3D_OK;
1330}
#define VKD3D_SM1_VS
Definition: d3dbc.c:30
#define VKD3D_SM1_VERSION_MINOR(version)
Definition: d3dbc.c:90
#define VKD3D_SM1_PS
Definition: d3dbc.c:31
#define VKD3D_SM1_VERSION_MAJOR(version)
Definition: d3dbc.c:89
unsigned short uint16_t
Definition: stdint.h:35
bool vsir_program_init(struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, const struct vkd3d_shader_version *version, unsigned int reserve, enum vsir_control_flow_type cf_type, enum vsir_normalisation_level normalisation_level)
Definition: ir.c:76
#define TRACE(s)
Definition: solgame.cpp:4
Definition: inflate.c:139
struct vkd3d_shader_code source
const uint32_t * start
Definition: d3dbc.c:219
const uint32_t * end
Definition: d3dbc.c:219
const uint32_t * ptr
Definition: d3dbc.c:219
void vkd3d_shader_parser_init(struct vkd3d_shader_parser *parser, struct vsir_program *program, struct vkd3d_shader_message_context *message_context, const char *source_name)
@ VKD3D_SHADER_ERROR_D3DBC_UNEXPECTED_EOF
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_VERSION_TOKEN
@ VSIR_NOT_NORMALISED
@ VSIR_CF_STRUCTURED

Referenced by d3dbc_parse().

◆ shader_sm1_is_end()

static bool shader_sm1_is_end ( struct vkd3d_shader_sm1_parser *  sm1)
static

Definition at line 1249 of file d3dbc.c.

1250{
1251 const uint32_t **ptr = &sm1->ptr;
1252
1254
1255 if (*ptr >= sm1->end)
1256 return true;
1257
1258 if (**ptr == VKD3D_SM1_END)
1259 {
1260 ++(*ptr);
1261 return true;
1262 }
1263
1264 return false;
1265}
#define VKD3D_SM1_END
Definition: d3dbc.c:87
static void shader_sm1_read_comment(struct vkd3d_shader_sm1_parser *sm1)
Definition: d3dbc.c:1049
static PVOID ptr
Definition: dispmode.c:27

Referenced by d3dbc_parse().

◆ shader_sm1_parse_dst_param()

static void shader_sm1_parse_dst_param ( uint32_t  param,
struct vkd3d_shader_src_param *  rel_addr,
struct vkd3d_shader_dst_param *  dst 
)
static

Definition at line 493 of file d3dbc.c.

495{
498 unsigned int idx_count = idx_count_from_reg_type(reg_type);
499
502 dst->reg.non_uniform = false;
503 if (idx_count == 1)
504 {
505 dst->reg.idx[0].offset = param & VKD3D_SM1_REGISTER_NUMBER_MASK;
506 dst->reg.idx[0].rel_addr = rel_addr;
507 }
508 if (dst->reg.type == VKD3DSPR_SAMPLER)
509 dst->reg.dimension = VSIR_DIMENSION_NONE;
510 else if (dst->reg.type == VKD3DSPR_DEPTHOUT)
511 dst->reg.dimension = VSIR_DIMENSION_SCALAR;
512 else
513 dst->reg.dimension = VSIR_DIMENSION_VEC4;
516
517 switch (dst->reg.dimension)
518 {
520 dst->write_mask = VKD3DSP_WRITEMASK_0;
521 break;
522
525 break;
526
527 default:
528 dst->write_mask = 0;
529 break;
530 }
531}
#define VKD3D_SM1_DST_MODIFIER_SHIFT
Definition: d3dbc.c:68
#define VKD3D_SM1_DSTSHIFT_SHIFT
Definition: d3dbc.c:71
#define VKD3D_SM1_WRITEMASK_SHIFT
Definition: d3dbc.c:74
#define VKD3D_SM1_REGISTER_TYPE_MASK2
Definition: d3dbc.c:63
#define VKD3D_SM1_REGISTER_NUMBER_MASK
Definition: d3dbc.c:58
static unsigned int idx_count_from_reg_type(enum vkd3d_shader_register_type reg_type)
Definition: d3dbc.c:456
#define VKD3D_SM1_REGISTER_TYPE_SHIFT
Definition: d3dbc.c:60
#define VKD3D_SM1_DSTSHIFT_MASK
Definition: d3dbc.c:72
#define VKD3D_SM1_REGISTER_TYPE_MASK
Definition: d3dbc.c:61
#define VKD3D_SM1_REGISTER_TYPE_SHIFT2
Definition: d3dbc.c:62
#define VKD3D_SM1_DST_MODIFIER_MASK
Definition: d3dbc.c:69
#define VKD3D_SM1_WRITEMASK_MASK
Definition: d3dbc.c:75
void vsir_register_init(struct vkd3d_shader_register *reg, enum vkd3d_shader_register_type reg_type, enum vkd3d_data_type data_type, unsigned int idx_count)
Definition: ir.c:164
struct vkd3d_shader_register reg
vkd3d_shader_register_type
@ VSIR_DIMENSION_SCALAR
@ VSIR_DIMENSION_VEC4
@ VSIR_DIMENSION_NONE
@ VKD3D_DATA_FLOAT
@ VKD3D_SHADER_REGISTER_PRECISION_DEFAULT

Referenced by shader_sm1_read_dst_param(), and shader_sm1_read_semantic().

◆ shader_sm1_parse_src_param()

static void shader_sm1_parse_src_param ( uint32_t  param,
struct vkd3d_shader_src_param *  rel_addr,
struct vkd3d_shader_src_param *  src 
)
static

Definition at line 468 of file d3dbc.c.

470{
473 unsigned int idx_count = idx_count_from_reg_type(reg_type);
474
477 src->reg.non_uniform = false;
478 if (idx_count == 1)
479 {
480 src->reg.idx[0].offset = param & VKD3D_SM1_REGISTER_NUMBER_MASK;
481 src->reg.idx[0].rel_addr = rel_addr;
482 }
483 if (src->reg.type == VKD3DSPR_SAMPLER)
484 src->reg.dimension = VSIR_DIMENSION_NONE;
485 else if (src->reg.type == VKD3DSPR_DEPTHOUT)
486 src->reg.dimension = VSIR_DIMENSION_SCALAR;
487 else
488 src->reg.dimension = VSIR_DIMENSION_VEC4;
491}
static uint32_t swizzle_from_sm1(uint32_t swizzle)
Definition: d3dbc.c:445
#define VKD3D_SM1_SWIZZLE_SHIFT
Definition: d3dbc.c:77
#define VKD3D_SM1_SWIZZLE_MASK
Definition: d3dbc.c:78
#define VKD3D_SM1_SRC_MODIFIER_MASK
Definition: d3dbc.c:85
#define VKD3D_SM1_SRC_MODIFIER_SHIFT
Definition: d3dbc.c:84

Referenced by shader_sm1_read_dst_param(), and shader_sm1_read_src_param().

◆ shader_sm1_read_comment()

static void shader_sm1_read_comment ( struct vkd3d_shader_sm1_parser *  sm1)
static

Definition at line 1049 of file d3dbc.c.

1050{
1051 const uint32_t **ptr = &sm1->ptr;
1052 const char *comment;
1053 unsigned int size;
1054 size_t remaining;
1056
1057 if (*ptr >= sm1->end)
1058 return;
1059
1060 remaining = sm1->end - *ptr;
1061
1062 token = **ptr;
1064 {
1066
1067 if (size > --remaining)
1068 {
1070 "Encountered a %u token comment, but only %zu token(s) is/are remaining.",
1071 size, remaining);
1072 return;
1073 }
1074
1075 comment = (const char *)++(*ptr);
1076 remaining -= size;
1077 *ptr += size;
1078
1079 if (size > 1 && *(const uint32_t *)comment == TAG_TEXT)
1080 {
1081 const char *end = comment + size * sizeof(token);
1082 const char *p = comment + sizeof(token);
1083 const char *line;
1084
1085 TRACE("// TEXT\n");
1086 for (line = p; line < end; line = p)
1087 {
1088 if (!(p = memchr(line, '\n', end - line)))
1089 p = end;
1090 else
1091 ++p;
1092 TRACE("// %s\n", debugstr_an(line, p - line));
1093 }
1094 }
1095 else if (size)
1096 {
1097 TRACE("// %s\n", debugstr_an(comment, size * sizeof(token)));
1098 }
1099 else
1100 break;
1101
1102 if (!remaining)
1103 break;
1104 token = **ptr;
1105 }
1106}
#define VKD3D_SM1_OPCODE_MASK
Definition: d3dbc.c:41
#define VKD3D_SM1_COMMENT_SIZE_MASK
Definition: d3dbc.c:52
#define VKD3D_SM1_COMMENT_SIZE_SHIFT
Definition: d3dbc.c:51
static __inline const char * debugstr_an(const char *s, int n)
Definition: compat.h:55
GLuint GLuint end
Definition: gl.h:1545
GLsizeiptr size
Definition: glext.h:5919
GLfloat GLfloat p
Definition: glext.h:8902
#define memchr(s, c, n)
Definition: mkisofs.h:875
#define comment(fmt, arg1)
Definition: rebar.c:847
Definition: parser.c:49
#define TAG_TEXT
Definition: vkd3d_common.h:86

Referenced by shader_sm1_is_end(), and shader_sm1_read_instruction().

◆ shader_sm1_read_dst_param()

static void shader_sm1_read_dst_param ( struct vkd3d_shader_sm1_parser *  sm1,
const uint32_t **  ptr,
struct vkd3d_shader_dst_param *  dst_param 
)
static

Definition at line 949 of file d3dbc.c.

951{
952 struct vkd3d_shader_src_param *dst_rel_addr = NULL;
953 uint32_t token, addr_token;
954
955 shader_sm1_read_param(sm1, ptr, &token, &addr_token);
957 {
958 if (!(dst_rel_addr = vsir_program_get_src_params(sm1->p.program, 1)))
959 {
961 "Out of memory.");
962 sm1->abort = true;
963 return;
964 }
965 shader_sm1_parse_src_param(addr_token, NULL, dst_rel_addr);
966 }
967 shader_sm1_parse_dst_param(token, dst_rel_addr, dst_param);
968
969 if (dst_param->reg.type == VKD3DSPR_RASTOUT && dst_param->reg.idx[0].offset == VSIR_RASTOUT_POINT_SIZE)
970 sm1->p.program->has_point_size = true;
971}
static bool has_relative_address(uint32_t param)
Definition: d3dbc.c:410
static void shader_sm1_parse_src_param(uint32_t param, struct vkd3d_shader_src_param *rel_addr, struct vkd3d_shader_src_param *src)
Definition: d3dbc.c:468
static void shader_sm1_parse_dst_param(uint32_t param, struct vkd3d_shader_src_param *rel_addr, struct vkd3d_shader_dst_param *dst)
Definition: d3dbc.c:493
static void shader_sm1_read_param(struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, uint32_t *token, uint32_t *addr_token)
Definition: d3dbc.c:854
struct vkd3d_shader_register reg
static struct vkd3d_shader_src_param * vsir_program_get_src_params(struct vsir_program *program, unsigned int count)
@ VSIR_RASTOUT_POINT_SIZE

Referenced by shader_sm1_read_instruction().

◆ shader_sm1_read_immconst()

static void shader_sm1_read_immconst ( struct vkd3d_shader_sm1_parser *  sm1,
const uint32_t **  ptr,
struct vkd3d_shader_src_param *  src_param,
enum vsir_dimension  dimension,
enum vkd3d_data_type  data_type 
)
static

Definition at line 1016 of file d3dbc.c.

1018{
1019 unsigned int count = dimension == VSIR_DIMENSION_VEC4 ? 4 : 1;
1020
1021 if (*ptr >= sm1->end || sm1->end - *ptr < count)
1022 {
1024 "Attempted to read a constant definition, but not enough tokens are remaining. "
1025 "%zu token(s) available, %u required.", sm1->end - *ptr, count);
1026 sm1->abort = true;
1027 return;
1028 }
1029
1030 src_param->reg.type = VKD3DSPR_IMMCONST;
1031 src_param->reg.precision = VKD3D_SHADER_REGISTER_PRECISION_DEFAULT;
1032 src_param->reg.non_uniform = false;
1033 src_param->reg.data_type = data_type;
1034 src_param->reg.idx[0].offset = ~0u;
1035 src_param->reg.idx[0].rel_addr = NULL;
1036 src_param->reg.idx[1].offset = ~0u;
1037 src_param->reg.idx[1].rel_addr = NULL;
1038 src_param->reg.idx[2].offset = ~0u;
1039 src_param->reg.idx[2].rel_addr = NULL;
1040 src_param->reg.idx_count = 0;
1041 src_param->reg.dimension = dimension;
1042 memcpy(src_param->reg.u.immconst_u32, *ptr, count * sizeof(uint32_t));
1043 src_param->swizzle = VKD3D_SHADER_NO_SWIZZLE;
1044 src_param->modifiers = 0;
1045
1046 *ptr += count;
1047}
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
enum wined3d_data_type data_type
Definition: glsl_shader.c:71
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
enum vkd3d_shader_src_modifier modifiers
#define VKD3D_SHADER_NO_SWIZZLE
@ VKD3DSPR_IMMCONST

Referenced by shader_sm1_read_instruction().

◆ shader_sm1_read_instruction()

static void shader_sm1_read_instruction ( struct vkd3d_shader_sm1_parser *  sm1,
struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 1126 of file d3dbc.c.

1127{
1128 struct vkd3d_shader_src_param *src_params, *predicate;
1129 const struct vkd3d_sm1_opcode_info *opcode_info;
1130 struct vsir_program *program = sm1->p.program;
1131 struct vkd3d_shader_dst_param *dst_param;
1132 const uint32_t **ptr = &sm1->ptr;
1133 uint32_t opcode_token;
1134 const uint32_t *p;
1135 bool predicated;
1136 unsigned int i;
1137
1139
1140 if (*ptr >= sm1->end)
1141 {
1142 WARN("End of byte-code, failed to read opcode.\n");
1143 goto fail;
1144 }
1145
1146 ++sm1->p.location.line;
1147 opcode_token = read_u32(ptr);
1148 if (!(opcode_info = shader_sm1_get_opcode_info(sm1, opcode_token & VKD3D_SM1_OPCODE_MASK)))
1149 {
1151 "Invalid opcode %#x (token 0x%08x, shader version %u.%u).",
1152 opcode_token & VKD3D_SM1_OPCODE_MASK, opcode_token,
1153 program->shader_version.major, program->shader_version.minor);
1154 goto fail;
1155 }
1156
1157 vsir_instruction_init(ins, &sm1->p.location, opcode_info->vkd3d_opcode);
1159 ins->coissue = opcode_token & VKD3D_SM1_COISSUE;
1160 ins->raw = false;
1161 ins->structured = false;
1162 predicated = !!(opcode_token & VKD3D_SM1_INSTRUCTION_PREDICATED);
1163 ins->predicate = predicate = predicated ? vsir_program_get_src_params(program, 1) : NULL;
1164 ins->dst_count = opcode_info->dst_count;
1165 ins->dst = dst_param = vsir_program_get_dst_params(program, ins->dst_count);
1166 ins->src_count = opcode_info->src_count;
1167 ins->src = src_params = vsir_program_get_src_params(program, ins->src_count);
1168 if ((!predicate && predicated) || (!src_params && ins->src_count) || (!dst_param && ins->dst_count))
1169 {
1171 goto fail;
1172 }
1173
1175 ins->resource_stride = 0;
1180 memset(&ins->texel_offset, 0, sizeof(ins->texel_offset));
1181
1182 p = *ptr;
1183 shader_sm1_skip_opcode(sm1, ptr, opcode_info, opcode_token);
1184 if (*ptr > sm1->end)
1185 {
1187 "The current instruction ends %zu token(s) past the end of the shader.",
1188 *ptr - sm1->end);
1189 goto fail;
1190 }
1191
1192 if (ins->opcode == VKD3DSIH_DCL)
1193 {
1195 }
1196 else if (ins->opcode == VKD3DSIH_DEF)
1197 {
1198 shader_sm1_read_dst_param(sm1, &p, dst_param);
1200 shader_sm1_scan_register(sm1, &dst_param->reg, dst_param->write_mask, true);
1201 }
1202 else if (ins->opcode == VKD3DSIH_DEFB)
1203 {
1204 shader_sm1_read_dst_param(sm1, &p, dst_param);
1206 shader_sm1_scan_register(sm1, &dst_param->reg, dst_param->write_mask, true);
1207 }
1208 else if (ins->opcode == VKD3DSIH_DEFI)
1209 {
1210 shader_sm1_read_dst_param(sm1, &p, dst_param);
1212 shader_sm1_scan_register(sm1, &dst_param->reg, dst_param->write_mask, true);
1213 }
1214 else
1215 {
1216 /* Destination token */
1217 if (ins->dst_count)
1218 {
1219 shader_sm1_read_dst_param(sm1, &p, dst_param);
1220 shader_sm1_scan_register(sm1, &dst_param->reg, dst_param->write_mask, false);
1221 }
1222
1223 /* Predication token */
1224 if (ins->predicate)
1225 shader_sm1_read_src_param(sm1, &p, predicate);
1226
1227 /* Other source tokens */
1228 for (i = 0; i < ins->src_count; ++i)
1229 {
1230 shader_sm1_read_src_param(sm1, &p, &src_params[i]);
1231 shader_sm1_scan_register(sm1, &src_params[i].reg, mask_from_swizzle(src_params[i].swizzle), false);
1232 }
1233 }
1234
1235 if (sm1->abort)
1236 {
1237 sm1->abort = false;
1238 goto fail;
1239 }
1240
1242 return;
1243
1244fail:
1245 ins->opcode = VKD3DSIH_INVALID;
1246 *ptr = sm1->end;
1247}
static const struct vkd3d_sm1_opcode_info * shader_sm1_get_opcode_info(const struct vkd3d_shader_sm1_parser *sm1, enum vkd3d_sm1_opcode opcode)
Definition: d3dbc.c:419
static uint32_t read_u32(const uint32_t **ptr)
Definition: d3dbc.c:405
#define VKD3D_SM1_INSTRUCTION_PREDICATED
Definition: d3dbc.c:54
static void shader_sm1_validate_instruction(struct vkd3d_shader_sm1_parser *sm1, struct vkd3d_shader_instruction *ins)
Definition: d3dbc.c:1108
static void shader_sm1_scan_register(struct vkd3d_shader_sm1_parser *sm1, const struct vkd3d_shader_register *reg, unsigned int mask, bool from_def)
Definition: d3dbc.c:809
static void shader_sm1_read_src_param(struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, struct vkd3d_shader_src_param *src_param)
Definition: d3dbc.c:928
static unsigned int mask_from_swizzle(uint32_t swizzle)
Definition: d3dbc.c:1118
#define VKD3D_SM1_COISSUE
Definition: d3dbc.c:49
static void shader_sm1_read_immconst(struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, struct vkd3d_shader_src_param *src_param, enum vsir_dimension dimension, enum vkd3d_data_type data_type)
Definition: d3dbc.c:1016
static void shader_sm1_read_semantic(struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, struct vkd3d_shader_semantic *semantic)
Definition: d3dbc.c:973
static void shader_sm1_skip_opcode(const struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, const struct vkd3d_sm1_opcode_info *opcode_info, uint32_t opcode_token)
Definition: d3dbc.c:894
static void shader_sm1_read_dst_param(struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, struct vkd3d_shader_dst_param *dst_param)
Definition: d3dbc.c:949
void vsir_instruction_init(struct vkd3d_shader_instruction *ins, const struct vkd3d_shader_location *location, enum vkd3d_shader_opcode opcode)
Definition: ir.c:321
const struct vkd3d_shader_src_param * predicate
struct vkd3d_shader_texel_offset texel_offset
enum vkd3d_shader_resource_type resource_type
enum vkd3d_data_type resource_data_type[VKD3D_VEC4_SIZE]
unsigned int src_count
Definition: d3dbc.c:208
unsigned int dst_count
Definition: d3dbc.c:207
@ VKD3D_SHADER_RESOURCE_NONE
static struct vkd3d_shader_dst_param * vsir_program_get_dst_params(struct vsir_program *program, unsigned int count)
@ VKD3D_DATA_INT
@ VKD3D_DATA_UINT
@ VKD3DSIH_DEFB
@ VKD3DSIH_DEFI

Referenced by d3dbc_parse().

◆ shader_sm1_read_param()

static void shader_sm1_read_param ( struct vkd3d_shader_sm1_parser *  sm1,
const uint32_t **  ptr,
uint32_t *  token,
uint32_t *  addr_token 
)
static

Definition at line 854 of file d3dbc.c.

856{
857 if (*ptr >= sm1->end)
858 {
860 "Attempted to read a parameter token, but no more tokens are remaining.");
861 sm1->abort = true;
862 *token = 0;
863 return;
864 }
865 *token = read_u32(ptr);
867 return;
868
869 /* PS >= 3.0 have relative addressing (with token)
870 * VS >= 2.0 have relative addressing (with token)
871 * VS >= 1.0 < 2.0 have relative addressing (without token)
872 * The version check below should work in general. */
873 if (sm1->p.program->shader_version.major < 2)
874 {
875 *addr_token = (1u << 31)
879 return;
880 }
881
882 if (*ptr >= sm1->end)
883 {
885 "Attempted to read an indirect addressing token, but no more tokens are remaining.");
886 sm1->abort = true;
887 *addr_token = 0;
888 return;
889 }
890 *addr_token = read_u32(ptr);
891}
#define VKD3D_SM1_SWIZZLE_DEFAULT
Definition: d3dbc.c:79
@ VKD3DSPR_ADDR

Referenced by shader_sm1_read_dst_param(), and shader_sm1_read_src_param().

◆ shader_sm1_read_semantic()

static void shader_sm1_read_semantic ( struct vkd3d_shader_sm1_parser *  sm1,
const uint32_t **  ptr,
struct vkd3d_shader_semantic *  semantic 
)
static

Definition at line 973 of file d3dbc.c.

975{
976 enum vkd3d_sm1_resource_type resource_type;
978 uint32_t usage_token, dst_token;
979
980 if (*ptr >= sm1->end || sm1->end - *ptr < 2)
981 {
983 "Attempted to read a declaration instruction, but not enough tokens are remaining.");
984 sm1->abort = true;
985 return;
986 }
987
988 usage_token = read_u32(ptr);
989 dst_token = read_u32(ptr);
990
991 semantic->usage = (usage_token & VKD3D_SM1_DCL_USAGE_MASK) >> VKD3D_SM1_DCL_USAGE_SHIFT;
993 resource_type = (usage_token & VKD3D_SM1_RESOURCE_TYPE_MASK) >> VKD3D_SM1_RESOURCE_TYPE_SHIFT;
994 if (resource_type >= ARRAY_SIZE(resource_type_table))
995 {
997 "Invalid resource type %#x.", resource_type);
999 }
1000 else
1001 {
1002 semantic->resource_type = resource_type_table[resource_type];
1003 }
1004 semantic->resource_data_type[0] = VKD3D_DATA_FLOAT;
1005 semantic->resource_data_type[1] = VKD3D_DATA_FLOAT;
1006 semantic->resource_data_type[2] = VKD3D_DATA_FLOAT;
1007 semantic->resource_data_type[3] = VKD3D_DATA_FLOAT;
1008 shader_sm1_parse_dst_param(dst_token, NULL, &semantic->resource.reg);
1009 range = &semantic->resource.range;
1010 range->space = 0;
1011 range->first = range->last = semantic->resource.reg.reg.idx[0].offset;
1012
1014}
#define VKD3D_SM1_RESOURCE_TYPE_MASK
Definition: d3dbc.c:39
vkd3d_sm1_resource_type
Definition: d3dbc.c:99
#define VKD3D_SM1_DCL_USAGE_INDEX_MASK
Definition: d3dbc.c:36
#define VKD3D_SM1_DCL_USAGE_MASK
Definition: d3dbc.c:34
static enum vkd3d_shader_resource_type resource_type_table[]
Definition: d3dbc.c:396
static bool add_signature_element_from_semantic(struct vkd3d_shader_sm1_parser *sm1, const struct vkd3d_shader_semantic *semantic)
Definition: d3dbc.c:747
range
Definition: d3dx9_private.h:58
enum vkd3d_data_type resource_data_type[VKD3D_VEC4_SIZE]

Referenced by shader_sm1_read_instruction().

◆ shader_sm1_read_src_param()

static void shader_sm1_read_src_param ( struct vkd3d_shader_sm1_parser *  sm1,
const uint32_t **  ptr,
struct vkd3d_shader_src_param *  src_param 
)
static

Definition at line 928 of file d3dbc.c.

930{
931 struct vkd3d_shader_src_param *src_rel_addr = NULL;
932 uint32_t token, addr_token;
933
934 shader_sm1_read_param(sm1, ptr, &token, &addr_token);
936 {
937 if (!(src_rel_addr = vsir_program_get_src_params(sm1->p.program, 1)))
938 {
940 "Out of memory.");
941 sm1->abort = true;
942 return;
943 }
944 shader_sm1_parse_src_param(addr_token, NULL, src_rel_addr);
945 }
946 shader_sm1_parse_src_param(token, src_rel_addr, src_param);
947}

Referenced by shader_sm1_read_instruction().

◆ shader_sm1_scan_register()

static void shader_sm1_scan_register ( struct vkd3d_shader_sm1_parser *  sm1,
const struct vkd3d_shader_register *  reg,
unsigned int  mask,
bool  from_def 
)
static

Definition at line 809 of file d3dbc.c.

811{
812 struct vsir_program *program = sm1->p.program;
813 uint32_t register_index = reg->idx[0].offset;
814
815 switch (reg->type)
816 {
817 case VKD3DSPR_TEMP:
818 program->temp_count = max(program->temp_count, register_index + 1);
819 break;
820
821 case VKD3DSPR_CONST:
823 break;
824
825 case VKD3DSPR_CONST2:
826 record_constant_register(sm1, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER, 2048 + register_index, from_def);
827 break;
828
829 case VKD3DSPR_CONST3:
830 record_constant_register(sm1, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER, 4096 + register_index, from_def);
831 break;
832
833 case VKD3DSPR_CONST4:
834 record_constant_register(sm1, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER, 6144 + register_index, from_def);
835 break;
836
839 break;
840
843 break;
844
845 default:
846 break;
847 }
848
850}
static void record_constant_register(struct vkd3d_shader_sm1_parser *sm1, enum vkd3d_shader_d3dbc_constant_register set, uint32_t index, bool from_def)
Definition: d3dbc.c:796
@ VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER
Definition: vkd3d_shader.h:919
@ VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER
Definition: vkd3d_shader.h:915
@ VKD3D_SHADER_D3DBC_INT_CONSTANT_REGISTER
Definition: vkd3d_shader.h:917
@ VKD3DSPR_CONSTBOOL
@ VKD3DSPR_CONST4
@ VKD3DSPR_CONSTINT
@ VKD3DSPR_CONST2
@ VKD3DSPR_CONST3

Referenced by shader_sm1_read_instruction().

◆ shader_sm1_skip_opcode()

static void shader_sm1_skip_opcode ( const struct vkd3d_shader_sm1_parser *  sm1,
const uint32_t **  ptr,
const struct vkd3d_sm1_opcode_info *  opcode_info,
uint32_t  opcode_token 
)
static

Definition at line 894 of file d3dbc.c.

896{
897 unsigned int length;
898
899 /* Version 2.0+ shaders may contain address tokens, but fortunately they
900 * have a useful length mask - use it here. Version 1.x shaders contain no
901 * such tokens. */
902 if (sm1->p.program->shader_version.major >= 2)
903 {
905 *ptr += length;
906 return;
907 }
908
909 /* DCL instructions do not have sources or destinations, but they
910 * read two tokens to a semantic. See
911 * shader_sm1_read_semantic(). */
912 if (opcode_info->vkd3d_opcode == VKD3DSIH_DCL)
913 {
914 *ptr += 2;
915 }
916 /* Somewhat similarly, DEF and DEFI have a single source, but need to read
917 * four tokens for that source. See shader_sm1_read_immconst().
918 * Technically shader model 1 doesn't have integer registers or DEFI; we
919 * handle it here anyway because it's easy. */
920 else if (opcode_info->vkd3d_opcode == VKD3DSIH_DEF || opcode_info->vkd3d_opcode == VKD3DSIH_DEFI)
921 {
922 *ptr += 3;
923 }
924
925 *ptr += (opcode_info->dst_count + opcode_info->src_count);
926}
#define VKD3D_SM1_INSTRUCTION_LENGTH_MASK
Definition: d3dbc.c:47
GLuint GLsizei GLsizei * length
Definition: glext.h:6040

Referenced by shader_sm1_read_instruction().

◆ shader_sm1_validate_instruction()

static void shader_sm1_validate_instruction ( struct vkd3d_shader_sm1_parser *  sm1,
struct vkd3d_shader_instruction *  ins 
)
static

Definition at line 1108 of file d3dbc.c.

1109{
1110 if ((ins->opcode == VKD3DSIH_BREAKP || ins->opcode == VKD3DSIH_IF) && ins->flags)
1111 {
1113 "Ignoring unexpected instruction flags %#x.", ins->flags);
1114 ins->flags = 0;
1115 }
1116}
@ VKD3D_SHADER_WARNING_D3DBC_IGNORED_INSTRUCTION_FLAGS
@ VKD3DSIH_IF
@ VKD3DSIH_BREAKP

Referenced by shader_sm1_read_instruction().

◆ sm1_dst_reg_from_vsir()

static void sm1_dst_reg_from_vsir ( struct d3dbc_compiler *  d3dbc,
const struct vkd3d_shader_dst_param *  param,
struct sm1_dst_register *  dst,
const struct vkd3d_shader_location *  loc 
)
static

Definition at line 2062 of file d3dbc.c.

2064{
2065 dst->mod = param->modifiers;
2066 dst->reg = param->reg.idx[0].offset;
2067 dst->type = param->reg.type;
2068 dst->writemask = param->write_mask;
2069
2070 if (param->reg.idx[0].rel_addr)
2071 {
2073 "Unhandled relative addressing on destination register.");
2074 d3dbc->failed = true;
2075 }
2076}
@ VKD3D_SHADER_ERROR_D3DBC_NOT_IMPLEMENTED

Referenced by d3dbc_write_vsir_simple_instruction().

◆ sm1_encode_register_type()

static uint32_t sm1_encode_register_type ( enum vkd3d_shader_register_type  type)
static

◆ sm1_register_from_semantic_name()

bool sm1_register_from_semantic_name ( const struct vkd3d_shader_version *  version,
const char *  semantic_name,
unsigned int  semantic_index,
bool  output,
enum vkd3d_shader_register_type *  type,
unsigned int *  reg 
)

Definition at line 1401 of file d3dbc.c.

1403{
1404 unsigned int i;
1405
1406 static const struct
1407 {
1408 const char *semantic;
1409 bool output;
1411 unsigned int major_version;
1413 unsigned int offset;
1414 }
1415 register_table[] =
1416 {
1417 {"color", false, VKD3D_SHADER_TYPE_PIXEL, 1, VKD3DSPR_INPUT},
1418 {"texcoord", false, VKD3D_SHADER_TYPE_PIXEL, 1, VKD3DSPR_TEXTURE},
1419
1420 {"color", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_COLOROUT},
1421 {"depth", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_DEPTHOUT},
1422 {"sv_depth", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_DEPTHOUT},
1423 {"sv_target", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_COLOROUT},
1424 {"color", false, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_INPUT},
1425 {"texcoord", false, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_TEXTURE},
1426
1427 {"color", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3DSPR_COLOROUT},
1428 {"depth", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3DSPR_DEPTHOUT},
1429 {"sv_depth", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3DSPR_DEPTHOUT},
1430 {"sv_target", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3DSPR_COLOROUT},
1434
1435 {"color", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3DSPR_ATTROUT},
1440 {"texcoord", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3DSPR_TEXCRDOUT},
1441
1442 {"color", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3DSPR_ATTROUT},
1447 {"texcoord", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3DSPR_TEXCRDOUT},
1448 };
1449
1450 for (i = 0; i < ARRAY_SIZE(register_table); ++i)
1451 {
1452 if (!ascii_strcasecmp(semantic_name, register_table[i].semantic)
1453 && output == register_table[i].output
1454 && version->type == register_table[i].shader_type
1455 && version->major == register_table[i].major_version)
1456 {
1457 *type = register_table[i].type;
1458 if (register_table[i].type == VKD3DSPR_MISCTYPE || register_table[i].type == VKD3DSPR_RASTOUT)
1459 *reg = register_table[i].offset;
1460 else
1461 *reg = semantic_index;
1462 return true;
1463 }
1464 }
1465
1466 return false;
1467}
GLintptr offset
Definition: glext.h:5920
vkd3d_shader_type
@ VKD3DSPR_TEXCRDOUT
@ VSIR_RASTOUT_FOG
@ VSIR_RASTOUT_POSITION

Referenced by allocate_semantic_register(), d3dbc_write_semantic_dcl(), generate_vsir_signature_entry(), sm1_generate_vsir_init_dst_param_from_deref(), and sm1_generate_vsir_init_src_param_from_deref().

◆ sm1_sort_extern()

static void sm1_sort_extern ( struct list *  sorted,
struct hlsl_ir_var *  to_sort 
)
static

Definition at line 1721 of file d3dbc.c.

1722{
1723 struct hlsl_ir_var *var;
1724
1725 list_remove(&to_sort->extern_entry);
1726
1728 {
1729 if (strcmp(to_sort->name, var->name) < 0)
1730 {
1731 list_add_before(&var->extern_entry, &to_sort->extern_entry);
1732 return;
1733 }
1734 }
1735
1736 list_add_tail(sorted, &to_sort->extern_entry);
1737}
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3324
const char * var
Definition: shader.c:5879
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:236
__WINE_SERVER_LIST_INLINE void list_add_before(struct list *elem, struct list *to_add)
Definition: list.h:89
const char * name
Definition: hlsl.h:456
struct list extern_entry
Definition: hlsl.h:468

Referenced by sm1_sort_externs().

◆ sm1_sort_externs()

static void sm1_sort_externs ( struct hlsl_ctx *  ctx)
static

Definition at line 1739 of file d3dbc.c.

1740{
1741 struct list sorted = LIST_INIT(sorted);
1742 struct hlsl_ir_var *var, *next;
1743
1745 {
1746 if (var->is_uniform)
1747 sm1_sort_extern(&sorted, var);
1748 }
1749 list_move_tail(&ctx->extern_vars, &sorted);
1750}
Definition: list.h:39
static void sm1_sort_extern(struct list *sorted, struct hlsl_ir_var *to_sort)
Definition: d3dbc.c:1721
static void list_move_tail(struct list_head *list, struct list_head *head)
Definition: list.h:122
static unsigned __int64 next
Definition: rand_nt.c:6
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:242
#define LIST_INIT(head)
Definition: queue.h:197

Referenced by write_sm1_uniforms().

◆ sm1_src_reg_from_vsir()

static void sm1_src_reg_from_vsir ( struct d3dbc_compiler *  d3dbc,
const struct vkd3d_shader_src_param *  param,
struct sm1_src_register *  src,
const struct vkd3d_shader_location *  loc 
)
static

Definition at line 2046 of file d3dbc.c.

2048{
2049 src->mod = param->modifiers;
2050 src->reg = param->reg.idx[0].offset;
2051 src->type = param->reg.type;
2052 src->swizzle = swizzle_from_vsir(param->swizzle);
2053
2054 if (param->reg.idx[0].rel_addr)
2055 {
2057 "Unhandled relative addressing on source register.");
2058 d3dbc->failed = true;
2059 }
2060}
static uint32_t swizzle_from_vsir(uint32_t swizzle)
Definition: d3dbc.c:2030

Referenced by d3dbc_write_vsir_simple_instruction().

◆ sm1_usage_from_semantic_name()

bool sm1_usage_from_semantic_name ( const char *  semantic_name,
uint32_t  semantic_index,
enum vkd3d_decl_usage *  usage,
uint32_t *  usage_idx 
)

Definition at line 1469 of file d3dbc.c.

1471{
1472 static const struct
1473 {
1474 const char *name;
1476 }
1477 semantics[] =
1478 {
1479 {"binormal", VKD3D_DECL_USAGE_BINORMAL},
1480 {"blendindices", VKD3D_DECL_USAGE_BLEND_INDICES},
1481 {"blendweight", VKD3D_DECL_USAGE_BLEND_WEIGHT},
1482 {"color", VKD3D_DECL_USAGE_COLOR},
1483 {"depth", VKD3D_DECL_USAGE_DEPTH},
1484 {"fog", VKD3D_DECL_USAGE_FOG},
1485 {"normal", VKD3D_DECL_USAGE_NORMAL},
1486 {"position", VKD3D_DECL_USAGE_POSITION},
1487 {"positiont", VKD3D_DECL_USAGE_POSITIONT},
1488 {"psize", VKD3D_DECL_USAGE_PSIZE},
1489 {"sample", VKD3D_DECL_USAGE_SAMPLE},
1490 {"sv_depth", VKD3D_DECL_USAGE_DEPTH},
1491 {"sv_position", VKD3D_DECL_USAGE_POSITION},
1492 {"sv_target", VKD3D_DECL_USAGE_COLOR},
1493 {"tangent", VKD3D_DECL_USAGE_TANGENT},
1494 {"tessfactor", VKD3D_DECL_USAGE_TESS_FACTOR},
1495 {"texcoord", VKD3D_DECL_USAGE_TEXCOORD},
1496 };
1497
1498 unsigned int i;
1499
1500 for (i = 0; i < ARRAY_SIZE(semantics); ++i)
1501 {
1502 if (!ascii_strcasecmp(semantic_name, semantics[i].name))
1503 {
1504 *usage = semantics[i].usage;
1505 *usage_idx = semantic_index;
1506 return true;
1507 }
1508 }
1509
1510 return false;
1511}

Referenced by allocate_semantic_register(), d3dbc_write_semantic_dcl(), and generate_vsir_signature_entry().

◆ sm1_version()

static uint32_t sm1_version ( enum vkd3d_shader_type  type,
unsigned int  major,
unsigned int  minor 
)
static

Definition at line 1522 of file d3dbc.c.

1523{
1526}
#define minor(rdev)
Definition: propsheet.cpp:929
#define major(rdev)
Definition: propsheet.cpp:928
static uint16_t vkd3d_make_u16(uint8_t low, uint8_t high)
Definition: vkd3d_common.h:376
static uint32_t vkd3d_make_u32(uint16_t low, uint16_t high)
Definition: vkd3d_common.h:381

Referenced by d3dbc_compile(), and write_sm1_uniforms().

◆ swizzle_from_sm1()

static uint32_t swizzle_from_sm1 ( uint32_t  swizzle)
static

Definition at line 445 of file d3dbc.c.

446{
451}
static unsigned int shader_sm1_get_swizzle_component(uint32_t swizzle, unsigned int idx)
Definition: d3dbc.c:440
static uint32_t vkd3d_shader_create_swizzle(enum vkd3d_shader_swizzle_component x, enum vkd3d_shader_swizzle_component y, enum vkd3d_shader_swizzle_component z, enum vkd3d_shader_swizzle_component w)

Referenced by shader_sm1_parse_src_param().

◆ swizzle_from_vsir()

static uint32_t swizzle_from_vsir ( uint32_t  swizzle)
static

Definition at line 2030 of file d3dbc.c.

2031{
2036
2037 if (x & ~0x3u || y & ~0x3u || z & ~0x3u || w & ~0x3u)
2038 ERR("Unexpected vsir swizzle: 0x%08x.\n", swizzle);
2039
2040 return ((x & 0x3u) << VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT(0))
2041 | ((y & 0x3) << VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT(1))
2042 | ((z & 0x3) << VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT(2))
2043 | ((w & 0x3) << VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT(3));
2044}
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6102
GLdouble GLdouble z
Definition: glext.h:5874

Referenced by sm1_src_reg_from_vsir().

◆ write_sm1_dst_register()

static void write_sm1_dst_register ( struct vkd3d_bytecode_buffer *  buffer,
const struct sm1_dst_register *  reg 
)
static

Definition at line 1968 of file d3dbc.c.

1969{
1970 VKD3D_ASSERT(reg->writemask);
1974 | (reg->writemask << VKD3D_SM1_WRITEMASK_SHIFT) | reg->reg);
1975}
static uint32_t sm1_encode_register_type(enum vkd3d_shader_register_type type)
Definition: d3dbc.c:1911

Referenced by d3dbc_write_instruction(), d3dbc_write_semantic_dcl(), d3dbc_write_vsir_def(), and d3dbc_write_vsir_sampler_dcl().

◆ write_sm1_src_register()

static void write_sm1_src_register ( struct vkd3d_bytecode_buffer *  buffer,
const struct sm1_src_register *  reg 
)
static

Definition at line 1977 of file d3dbc.c.

1979{
1983 | (reg->swizzle << VKD3D_SM1_SWIZZLE_SHIFT) | reg->reg);
1984}

Referenced by d3dbc_write_instruction().

◆ write_sm1_type()

static void write_sm1_type ( struct vkd3d_bytecode_buffer *  buffer,
struct hlsl_type *  type,
unsigned int  ctab_start 
)
static

Definition at line 1681 of file d3dbc.c.

1682{
1683 const struct hlsl_type *array_type = hlsl_get_multiarray_element_type(type);
1685 unsigned int field_count = 0;
1686 size_t fields_offset = 0;
1687 size_t i;
1688
1689 if (type->bytecode_offset)
1690 return;
1691
1692 if (array_type->class == HLSL_CLASS_STRUCT)
1693 {
1694 field_count = array_type->e.record.field_count;
1695
1696 for (i = 0; i < field_count; ++i)
1697 {
1698 struct hlsl_struct_field *field = &array_type->e.record.fields[i];
1699
1700 field->name_bytecode_offset = put_string(buffer, field->name);
1701 write_sm1_type(buffer, field->type, ctab_start);
1702 }
1703
1704 fields_offset = bytecode_align(buffer) - ctab_start;
1705
1706 for (i = 0; i < field_count; ++i)
1707 {
1708 struct hlsl_struct_field *field = &array_type->e.record.fields[i];
1709
1710 put_u32(buffer, field->name_bytecode_offset - ctab_start);
1711 put_u32(buffer, field->type->bytecode_offset - ctab_start);
1712 }
1713 }
1714
1715 type->bytecode_offset = put_u32(buffer, vkd3d_make_u32(hlsl_sm1_class(type), hlsl_sm1_base_type(array_type)));
1716 put_u32(buffer, vkd3d_make_u32(type->dimy, type->dimx));
1717 put_u32(buffer, vkd3d_make_u32(array_size, field_count));
1718 put_u32(buffer, fields_offset);
1719}
static void write_sm1_type(struct vkd3d_bytecode_buffer *buffer, struct hlsl_type *type, unsigned int ctab_start)
Definition: d3dbc.c:1681
const struct hlsl_type * hlsl_get_multiarray_element_type(const struct hlsl_type *type)
Definition: hlsl.c:226
unsigned int hlsl_get_multiarray_size(const struct hlsl_type *type)
Definition: hlsl.c:233
static UINT array_size
Definition: msctf.cpp:39
Definition: parser.c:44
size_t field_count
Definition: hlsl.h:203
union hlsl_type::@5997 e
struct hlsl_type::@5997::@5999 record
enum hlsl_type_class class
Definition: hlsl.h:163
size_t bytecode_align(struct vkd3d_bytecode_buffer *buffer)
static size_t put_string(struct vkd3d_bytecode_buffer *buffer, const char *string)

Referenced by write_sm1_type(), and write_sm1_uniforms().

◆ write_sm1_uniforms()

void write_sm1_uniforms ( struct hlsl_ctx *  ctx,
struct vkd3d_bytecode_buffer *  buffer 
)

Definition at line 1752 of file d3dbc.c.

1753{
1754 size_t ctab_offset, ctab_start, ctab_end, vars_offset, vars_start, size_offset, creator_offset, offset;
1755 unsigned int uniform_count = 0;
1756 struct hlsl_ir_var *var;
1757
1758 LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, struct hlsl_ir_var, extern_entry)
1759 {
1760 unsigned int r;
1761
1762 for (r = 0; r <= HLSL_REGSET_LAST; ++r)
1763 {
1764 if (var->semantic.name || !var->regs[r].allocated || !var->last_read)
1765 continue;
1766
1767 ++uniform_count;
1768
1769 if (var->is_param && var->is_uniform)
1770 {
1771 char *new_name;
1772
1773 if (!(new_name = hlsl_sprintf_alloc(ctx, "$%s", var->name)))
1774 return;
1775 vkd3d_free((char *)var->name);
1776 var->name = new_name;
1777 }
1778 }
1779 }
1780
1782
1783 size_offset = put_u32(buffer, 0);
1784 ctab_offset = put_u32(buffer, VKD3D_MAKE_TAG('C','T','A','B'));
1785
1786 ctab_start = put_u32(buffer, 7 * sizeof(uint32_t)); /* CTAB header size. */
1787 creator_offset = put_u32(buffer, 0);
1788 put_u32(buffer, sm1_version(ctx->profile->type, ctx->profile->major_version, ctx->profile->minor_version));
1789 put_u32(buffer, uniform_count);
1790 vars_offset = put_u32(buffer, 0);
1791 put_u32(buffer, 0); /* FIXME: flags */
1792 put_u32(buffer, 0); /* FIXME: target string */
1793
1794 vars_start = bytecode_align(buffer);
1795 set_u32(buffer, vars_offset, vars_start - ctab_start);
1796
1797 LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, struct hlsl_ir_var, extern_entry)
1798 {
1799 unsigned int r;
1800
1801 for (r = 0; r <= HLSL_REGSET_LAST; ++r)
1802 {
1803 if (var->semantic.name || !var->regs[r].allocated || !var->last_read)
1804 continue;
1805
1806 put_u32(buffer, 0); /* name */
1807 if (r == HLSL_REGSET_NUMERIC)
1808 {
1810 put_u32(buffer, var->bind_count[r]);
1811 }
1812 else
1813 {
1815 put_u32(buffer, var->bind_count[r]);
1816 }
1817 put_u32(buffer, 0); /* type */
1818 put_u32(buffer, 0); /* default value */
1819 }
1820 }
1821
1822 uniform_count = 0;
1823
1824 LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, struct hlsl_ir_var, extern_entry)
1825 {
1826 unsigned int r;
1827
1828 for (r = 0; r <= HLSL_REGSET_LAST; ++r)
1829 {
1830 size_t var_offset, name_offset;
1831
1832 if (var->semantic.name || !var->regs[r].allocated || !var->last_read)
1833 continue;
1834
1835 var_offset = vars_start + (uniform_count * 5 * sizeof(uint32_t));
1836
1837 name_offset = put_string(buffer, var->name);
1838 set_u32(buffer, var_offset, name_offset - ctab_start);
1839
1840 write_sm1_type(buffer, var->data_type, ctab_start);
1841 set_u32(buffer, var_offset + 3 * sizeof(uint32_t), var->data_type->bytecode_offset - ctab_start);
1842
1843 if (var->default_values)
1844 {
1845 unsigned int reg_size = var->data_type->reg_size[HLSL_REGSET_NUMERIC];
1846 unsigned int comp_count = hlsl_type_component_count(var->data_type);
1847 unsigned int default_value_offset;
1848 unsigned int k;
1849
1850 default_value_offset = bytecode_reserve_bytes(buffer, reg_size * sizeof(uint32_t));
1851 set_u32(buffer, var_offset + 4 * sizeof(uint32_t), default_value_offset - ctab_start);
1852
1853 for (k = 0; k < comp_count; ++k)
1854 {
1855 struct hlsl_type *comp_type = hlsl_type_get_component_type(ctx, var->data_type, k);
1856 unsigned int comp_offset;
1857 enum hlsl_regset regset;
1858
1859 comp_offset = hlsl_type_get_component_offset(ctx, var->data_type, k, &regset);
1861 {
1862 union
1863 {
1864 uint32_t u;
1865 float f;
1866 } uni;
1867
1868 switch (comp_type->e.numeric.type)
1869 {
1870 case HLSL_TYPE_DOUBLE:
1871 if (ctx->double_as_float_alias)
1872 uni.u = var->default_values[k].number.u;
1873 else
1874 uni.u = 0;
1875 break;
1876
1877 case HLSL_TYPE_INT:
1878 uni.f = var->default_values[k].number.i;
1879 break;
1880
1881 case HLSL_TYPE_UINT:
1882 case HLSL_TYPE_BOOL:
1883 uni.f = var->default_values[k].number.u;
1884 break;
1885
1886 case HLSL_TYPE_HALF:
1887 case HLSL_TYPE_FLOAT:
1888 uni.u = var->default_values[k].number.u;
1889 break;
1890
1891 default:
1893 }
1894
1895 set_u32(buffer, default_value_offset + comp_offset * sizeof(uint32_t), uni.u);
1896 }
1897 }
1898 }
1899
1900 ++uniform_count;
1901 }
1902 }
1903
1905 set_u32(buffer, creator_offset, offset - ctab_start);
1906
1907 ctab_end = bytecode_align(buffer);
1908 set_u32(buffer, size_offset, vkd3d_make_u32(VKD3D_SM1_OP_COMMENT, (ctab_end - ctab_offset) / sizeof(uint32_t)));
1909}
static const unsigned char reg_size[]
Definition: amd64_sup.c:21
static void sm1_sort_externs(struct hlsl_ctx *ctx)
Definition: d3dbc.c:1739
@ D3DXRS_FLOAT4
Definition: d3dx9shader.h:55
@ D3DXRS_SAMPLER
Definition: d3dx9shader.h:56
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
unsigned int hlsl_type_component_count(const struct hlsl_type *type)
Definition: hlsl.c:1042
unsigned int hlsl_type_get_component_offset(struct hlsl_ctx *ctx, struct hlsl_type *type, unsigned int index, enum hlsl_regset *regset)
Definition: hlsl.c:620
struct hlsl_type * hlsl_type_get_component_type(struct hlsl_ctx *ctx, struct hlsl_type *type, unsigned int index)
Definition: hlsl.c:611
char * hlsl_sprintf_alloc(struct hlsl_ctx *ctx, const char *fmt,...)
Definition: hlsl.c:75
hlsl_regset
Definition: hlsl.h:146
@ HLSL_REGSET_NUMERIC
Definition: hlsl.h:151
@ HLSL_REGSET_LAST
Definition: hlsl.h:152
#define f
Definition: ke_i.h:83
D3DXREGISTER_SET regset
Definition: shader.c:5881
int k
Definition: mpi.c:3369
#define uint32_t
Definition: nsiface.idl:61
struct hlsl_type::@5997::@5998 numeric
#define VKD3D_MAKE_TAG(ch0, ch1, ch2, ch3)
Definition: vkd3d_common.h:57
VKD3D_SHADER_API const char * vkd3d_shader_get_version(unsigned int *major, unsigned int *minor)
size_t bytecode_reserve_bytes(struct vkd3d_bytecode_buffer *buffer, size_t size)
void set_u32(struct vkd3d_bytecode_buffer *buffer, size_t offset, uint32_t value)

Referenced by sm1_generate_vsir().

Variable Documentation

◆ ps_opcode_table

const struct vkd3d_sm1_opcode_info ps_opcode_table[]
static

Definition at line 301 of file d3dbc.c.

Referenced by d3dbc_compile(), and shader_sm1_init().

◆ resource_type_table

◆ vs_opcode_table

const struct vkd3d_sm1_opcode_info vs_opcode_table[]
static

Definition at line 233 of file d3dbc.c.

Referenced by d3dbc_compile(), and shader_sm1_init().