ReactOS  0.4.15-dev-2355-gaf9df93
preshader.c File Reference
#include "d3dx9_private.h"
#include <float.h>
#include <math.h>
#include <assert.h>
Include dependency graph for preshader.c:

Go to the source code of this file.

Classes

struct  op_info
 
struct  d3dx_pres_reg
 
struct  d3dx_pres_operand
 
struct  d3dx_pres_ins
 
struct  const_upload_info
 

Macros

#define PRES_OPCODE_MASK   0x7ff00000
 
#define PRES_OPCODE_SHIFT   20
 
#define PRES_SCALAR_FLAG   0x80000000
 
#define PRES_NCOMP_MASK   0x0000ffff
 
#define FOURCC_PRES   0x53455250
 
#define FOURCC_CLIT   0x54494c43
 
#define FOURCC_FXLC   0x434c5846
 
#define FOURCC_PRSI   0x49535250
 
#define PRES_SIGN   0x46580000
 
#define MAX_INPUTS_COUNT   8
 
#define PRES_BITMASK_BLOCK_SIZE   (sizeof(unsigned int) * 8)
 
#define INITIAL_CONST_SET_SIZE   16
 
#define ARGS_ARRAY_SIZE   8
 

Typedefs

typedef double(* pres_op_func) (double *args, int n)
 

Enumerations

enum  pres_ops {
  PRESHADER_OP_NOP, PRESHADER_OP_MOV, PRESHADER_OP_NEG, PRESHADER_OP_RCP,
  PRESHADER_OP_FRC, PRESHADER_OP_EXP, PRESHADER_OP_LOG, PRESHADER_OP_RSQ,
  PRESHADER_OP_SIN, PRESHADER_OP_COS, PRESHADER_OP_ASIN, PRESHADER_OP_ACOS,
  PRESHADER_OP_ATAN, PRESHADER_OP_MIN, PRESHADER_OP_MAX, PRESHADER_OP_LT,
  PRESHADER_OP_GE, PRESHADER_OP_ADD, PRESHADER_OP_MUL, PRESHADER_OP_ATAN2,
  PRESHADER_OP_DIV, PRESHADER_OP_CMP, PRESHADER_OP_DOT, PRESHADER_OP_DOTSWIZ6,
  PRESHADER_OP_DOTSWIZ8
}
 
enum  pres_value_type {
  PRES_VT_FLOAT, PRES_VT_DOUBLE, PRES_VT_INT, PRES_VT_BOOL,
  PRES_VT_COUNT
}
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (d3dx)
 
static double to_signed_nan (double v)
 
static double pres_mov (double *args, int n)
 
static double pres_add (double *args, int n)
 
static double pres_mul (double *args, int n)
 
static double pres_dot (double *args, int n)
 
static double pres_dotswiz6 (double *args, int n)
 
static double pres_dotswiz8 (double *args, int n)
 
static double pres_neg (double *args, int n)
 
static double pres_rcp (double *args, int n)
 
static double pres_lt (double *args, int n)
 
static double pres_ge (double *args, int n)
 
static double pres_frc (double *args, int n)
 
static double pres_min (double *args, int n)
 
static double pres_max (double *args, int n)
 
static double pres_cmp (double *args, int n)
 
static double pres_sin (double *args, int n)
 
static double pres_cos (double *args, int n)
 
static double pres_rsq (double *args, int n)
 
static double pres_exp (double *args, int n)
 
static double pres_log (double *args, int n)
 
static double pres_asin (double *args, int n)
 
static double pres_acos (double *args, int n)
 
static double pres_atan (double *args, int n)
 
static double pres_atan2 (double *args, int n)
 
static double pres_div (double *args, int n)
 
static enum pres_value_type table_type_from_param_type (D3DXPARAMETER_TYPE type)
 
static unsigned int get_reg_offset (unsigned int table, unsigned int offset)
 
static unsigned int get_offset_reg (unsigned int table, unsigned int reg_idx)
 
static unsigned int get_reg_components (unsigned int table)
 
static HRESULT regstore_alloc_table (struct d3dx_regstore *rs, unsigned int table)
 
static void regstore_free_tables (struct d3dx_regstore *rs)
 
static void regstore_set_values (struct d3dx_regstore *rs, unsigned int table, const void *data, unsigned int start_offset, unsigned int count)
 
static double regstore_get_double (struct d3dx_regstore *rs, unsigned int table, unsigned int offset)
 
static void regstore_set_double (struct d3dx_regstore *rs, unsigned int table, unsigned int offset, double v)
 
static void dump_bytecode (void *data, unsigned int size)
 
static unsigned intfind_bytecode_comment (unsigned int *ptr, unsigned int count, unsigned int fourcc, unsigned int *size)
 
static unsigned intparse_pres_reg (unsigned int *ptr, struct d3dx_pres_reg *reg)
 
static unsigned intparse_pres_arg (unsigned int *ptr, unsigned int count, struct d3dx_pres_operand *opr)
 
static unsigned intparse_pres_ins (unsigned int *ptr, unsigned int count, struct d3dx_pres_ins *ins)
 
static HRESULT get_ctab_constant_desc (ID3DXConstantTable *ctab, D3DXHANDLE hc, D3DXCONSTANT_DESC *desc, WORD *constantinfo_reserved)
 
static void get_const_upload_info (struct d3dx_const_param_eval_output *const_set, struct const_upload_info *info)
 
static HRESULT append_const_set (struct d3dx_const_tab *const_tab, struct d3dx_const_param_eval_output *set)
 
static void append_pres_const_sets_for_shader_input (struct d3dx_const_tab *const_tab, struct d3dx_preshader *pres)
 
static int __cdecl compare_const_set (const void *a, const void *b)
 
static HRESULT merge_const_set_entries (struct d3dx_const_tab *const_tab, struct d3dx_parameter *param, unsigned int index)
 
static HRESULT init_set_constants_param (struct d3dx_const_tab *const_tab, ID3DXConstantTable *ctab, D3DXHANDLE hc, struct d3dx_parameter *param)
 
static HRESULT get_constants_desc (unsigned int *byte_code, struct d3dx_const_tab *out, struct d3dx_effect *effect, const char **skip_constants, unsigned int skip_constants_count, struct d3dx_preshader *pres)
 
static void update_table_size (unsigned int *table_sizes, unsigned int table, unsigned int max_register)
 
static void update_table_sizes_consts (unsigned int *table_sizes, struct d3dx_const_tab *ctab)
 
static void dump_arg (struct d3dx_regstore *rs, const struct d3dx_pres_operand *arg, int component_count)
 
static void dump_registers (struct d3dx_const_tab *ctab)
 
static void dump_ins (struct d3dx_regstore *rs, const struct d3dx_pres_ins *ins)
 
static void dump_preshader (struct d3dx_preshader *pres)
 
static HRESULT parse_preshader (struct d3dx_preshader *pres, unsigned int *ptr, unsigned int count, struct d3dx_effect *effect)
 
HRESULT d3dx_create_param_eval (struct d3dx_effect *effect, void *byte_code, unsigned int byte_code_size, D3DXPARAMETER_TYPE type, struct d3dx_param_eval **peval_out, ULONG64 *version_counter, const char **skip_constants, unsigned int skip_constants_count)
 
static void d3dx_free_const_tab (struct d3dx_const_tab *ctab)
 
static void d3dx_free_preshader (struct d3dx_preshader *pres)
 
void d3dx_free_param_eval (struct d3dx_param_eval *peval)
 
static void pres_int_from_float (void *out, const void *in, unsigned int count)
 
static void pres_bool_from_value (void *out, const void *in, unsigned int count)
 
static void pres_float_from_int (void *out, const void *in, unsigned int count)
 
static void pres_float_from_bool (void *out, const void *in, unsigned int count)
 
static void pres_int_from_bool (void *out, const void *in, unsigned int count)
 
static void regstore_set_data (struct d3dx_regstore *rs, unsigned int table, unsigned int offset, const unsigned int *in, unsigned int count, enum pres_value_type param_type)
 
static HRESULT set_constants_device (ID3DXEffectStateManager *manager, struct IDirect3DDevice9 *device, D3DXPARAMETER_TYPE type, enum pres_reg_tables table, void *ptr, unsigned int start, unsigned int count)
 
static HRESULT set_constants (struct d3dx_regstore *rs, struct d3dx_const_tab *const_tab, ULONG64 new_update_version, ID3DXEffectStateManager *manager, struct IDirect3DDevice9 *device, D3DXPARAMETER_TYPE type, BOOL device_update_all, BOOL pres_dirty)
 
static double exec_get_reg_value (struct d3dx_regstore *rs, enum pres_reg_tables table, unsigned int offset)
 
static double exec_get_arg (struct d3dx_regstore *rs, const struct d3dx_pres_operand *opr, unsigned int comp)
 
static void exec_set_arg (struct d3dx_regstore *rs, const struct d3dx_pres_reg *reg, unsigned int comp, double res)
 
static HRESULT execute_preshader (struct d3dx_preshader *pres)
 
static BOOL is_const_tab_input_dirty (struct d3dx_const_tab *ctab, ULONG64 update_version)
 
BOOL is_param_eval_input_dirty (struct d3dx_param_eval *peval, ULONG64 update_version)
 
HRESULT d3dx_evaluate_parameter (struct d3dx_param_eval *peval, const struct d3dx_parameter *param, void *param_value)
 
HRESULT d3dx_param_eval_set_shader_constants (ID3DXEffectStateManager *manager, struct IDirect3DDevice9 *device, struct d3dx_param_eval *peval, BOOL update_all)
 

Variables

static const struct op_info pres_op_info []
 
struct {
   unsigned int   component_size
 
   enum pres_value_type   type
 
table_info []
 
static const chartable_symbol []
 
static enum pres_reg_tables pres_regset2table []
 
static enum pres_reg_tables shad_regset2table []
 

Macro Definition Documentation

◆ ARGS_ARRAY_SIZE

#define ARGS_ARRAY_SIZE   8

Definition at line 1658 of file preshader.c.

◆ FOURCC_CLIT

#define FOURCC_CLIT   0x54494c43

Definition at line 154 of file preshader.c.

◆ FOURCC_FXLC

#define FOURCC_FXLC   0x434c5846

Definition at line 155 of file preshader.c.

◆ FOURCC_PRES

#define FOURCC_PRES   0x53455250

Definition at line 153 of file preshader.c.

◆ FOURCC_PRSI

#define FOURCC_PRSI   0x49535250

Definition at line 156 of file preshader.c.

◆ INITIAL_CONST_SET_SIZE

#define INITIAL_CONST_SET_SIZE   16

Definition at line 593 of file preshader.c.

◆ MAX_INPUTS_COUNT

#define MAX_INPUTS_COUNT   8

Definition at line 257 of file preshader.c.

◆ PRES_BITMASK_BLOCK_SIZE

#define PRES_BITMASK_BLOCK_SIZE   (sizeof(unsigned int) * 8)

Definition at line 311 of file preshader.c.

◆ PRES_NCOMP_MASK

#define PRES_NCOMP_MASK   0x0000ffff

Definition at line 151 of file preshader.c.

◆ PRES_OPCODE_MASK

#define PRES_OPCODE_MASK   0x7ff00000

Definition at line 148 of file preshader.c.

◆ PRES_OPCODE_SHIFT

#define PRES_OPCODE_SHIFT   20

Definition at line 149 of file preshader.c.

◆ PRES_SCALAR_FLAG

#define PRES_SCALAR_FLAG   0x80000000

Definition at line 150 of file preshader.c.

◆ PRES_SIGN

#define PRES_SIGN   0x46580000

Definition at line 157 of file preshader.c.

Typedef Documentation

◆ pres_op_func

typedef double(* pres_op_func) (double *args, int n)

Definition at line 67 of file preshader.c.

Enumeration Type Documentation

◆ pres_ops

Enumerator
PRESHADER_OP_NOP 
PRESHADER_OP_MOV 
PRESHADER_OP_NEG 
PRESHADER_OP_RCP 
PRESHADER_OP_FRC 
PRESHADER_OP_EXP 
PRESHADER_OP_LOG 
PRESHADER_OP_RSQ 
PRESHADER_OP_SIN 
PRESHADER_OP_COS 
PRESHADER_OP_ASIN 
PRESHADER_OP_ACOS 
PRESHADER_OP_ATAN 
PRESHADER_OP_MIN 
PRESHADER_OP_MAX 
PRESHADER_OP_LT 
PRESHADER_OP_GE 
PRESHADER_OP_ADD 
PRESHADER_OP_MUL 
PRESHADER_OP_ATAN2 
PRESHADER_OP_DIV 
PRESHADER_OP_CMP 
PRESHADER_OP_DOT 
PRESHADER_OP_DOTSWIZ6 
PRESHADER_OP_DOTSWIZ8 

Definition at line 38 of file preshader.c.

39 {
65 };

◆ pres_value_type

Enumerator
PRES_VT_FLOAT 
PRES_VT_DOUBLE 
PRES_VT_INT 
PRES_VT_BOOL 
PRES_VT_COUNT 

Definition at line 197 of file preshader.c.

Function Documentation

◆ append_const_set()

static HRESULT append_const_set ( struct d3dx_const_tab const_tab,
struct d3dx_const_param_eval_output set 
)
static

Definition at line 595 of file preshader.c.

596 {
597  if (const_tab->const_set_count >= const_tab->const_set_size)
598  {
599  unsigned int new_size;
600  struct d3dx_const_param_eval_output *new_alloc;
601 
602  if (!const_tab->const_set_size)
603  {
604  new_size = INITIAL_CONST_SET_SIZE;
605  new_alloc = HeapAlloc(GetProcessHeap(), 0, sizeof(*const_tab->const_set) * new_size);
606  if (!new_alloc)
607  {
608  ERR("Out of memory.\n");
609  return E_OUTOFMEMORY;
610  }
611  }
612  else
613  {
614  new_size = const_tab->const_set_size * 2;
615  new_alloc = HeapReAlloc(GetProcessHeap(), 0, const_tab->const_set,
616  sizeof(*const_tab->const_set) * new_size);
617  if (!new_alloc)
618  {
619  ERR("Out of memory.\n");
620  return E_OUTOFMEMORY;
621  }
622  }
623  const_tab->const_set = new_alloc;
624  const_tab->const_set_size = new_size;
625  }
626  const_tab->const_set[const_tab->const_set_count++] = *set;
627  return D3D_OK;
628 }
struct d3dx_const_param_eval_output * const_set
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static UINT set(struct ID3DXConstantTableImpl *table, IDirect3DDevice9 *device, struct ctab_constant *constant, const void **indata, D3DXPARAMETER_TYPE intype, UINT *size, UINT incol, D3DXPARAMETER_CLASS inclass, UINT index, BOOL is_pointer)
Definition: shader.c:1102
#define INITIAL_CONST_SET_SIZE
Definition: preshader.c:593
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define ERR(fmt,...)
Definition: debug.h:110
#define D3D_OK
Definition: d3d.h:106
unsigned int const_set_size
#define HeapReAlloc
Definition: compat.h:593
unsigned int const_set_count

Referenced by append_pres_const_sets_for_shader_input(), and init_set_constants_param().

◆ append_pres_const_sets_for_shader_input()

static void append_pres_const_sets_for_shader_input ( struct d3dx_const_tab const_tab,
struct d3dx_preshader pres 
)
static

Definition at line 630 of file preshader.c.

632 {
633  unsigned int i;
634  struct d3dx_const_param_eval_output const_set = {NULL};
635 
636  for (i = 0; i < pres->ins_count; ++i)
637  {
638  const struct d3dx_pres_ins *ins = &pres->ins[i];
639  const struct d3dx_pres_reg *reg = &ins->output.reg;
640 
641  if (reg->table == PRES_REGTAB_TEMP)
642  continue;
643 
644  const_set.register_index = get_reg_offset(reg->table, reg->offset);
645  const_set.register_count = 1;
646  const_set.table = reg->table;
648  const_set.element_count = 1;
649  append_const_set(const_tab, &const_set);
650  }
651 }
enum pres_reg_tables table
static unsigned int get_reg_offset(unsigned int table, unsigned int offset)
Definition: preshader.c:296
struct d3dx_pres_operand output
Definition: preshader.c:267
unsigned int ins_count
static int reg
Definition: i386-dis.c:1283
enum D3DXPARAMETER_CLASS constant_class
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
#define NULL
Definition: types.h:112
struct d3dx_pres_ins * ins
static HRESULT append_const_set(struct d3dx_const_tab *const_tab, struct d3dx_const_param_eval_output *set)
Definition: preshader.c:595

Referenced by get_constants_desc().

◆ compare_const_set()

static int __cdecl compare_const_set ( const void a,
const void b 
)
static

Definition at line 653 of file preshader.c.

654 {
655  const struct d3dx_const_param_eval_output *r1 = a;
656  const struct d3dx_const_param_eval_output *r2 = b;
657 
658  if (r1->table != r2->table)
659  return r1->table - r2->table;
660  return r1->register_index - r2->register_index;
661 }
static DNS_RECORDW r1
Definition: record.c:37
#define a
Definition: ke_i.h:78
#define b
Definition: ke_i.h:79
static DNS_RECORDW r2
Definition: record.c:38

Referenced by get_constants_desc().

◆ d3dx_create_param_eval()

HRESULT d3dx_create_param_eval ( struct d3dx_effect effect,
void byte_code,
unsigned int  byte_code_size,
D3DXPARAMETER_TYPE  type,
struct d3dx_param_eval **  peval_out,
ULONG64 version_counter,
const char **  skip_constants,
unsigned int  skip_constants_count 
)

Definition at line 1233 of file preshader.c.

1236 {
1237  struct d3dx_param_eval *peval;
1238  unsigned int *ptr, *shader_ptr = NULL;
1239  unsigned int i;
1240  BOOL shader;
1241  unsigned int count, pres_size;
1242  HRESULT ret;
1243 
1244  TRACE("effect %p, byte_code %p, byte_code_size %u, type %u, peval_out %p.\n",
1245  effect, byte_code, byte_code_size, type, peval_out);
1246 
1247  count = byte_code_size / sizeof(unsigned int);
1248  if (!byte_code || !count)
1249  {
1250  *peval_out = NULL;
1251  return D3D_OK;
1252  }
1253 
1254  peval = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*peval));
1255  if (!peval)
1256  {
1257  ret = E_OUTOFMEMORY;
1258  goto err_out;
1259  }
1261 
1262  peval->param_type = type;
1263  switch (type)
1264  {
1265  case D3DXPT_VERTEXSHADER:
1266  case D3DXPT_PIXELSHADER:
1267  shader = TRUE;
1268  break;
1269  default:
1270  shader = FALSE;
1271  break;
1272  }
1273  peval->shader_inputs.regset2table = shad_regset2table;
1274 
1275  ptr = (unsigned int *)byte_code;
1276  if (shader)
1277  {
1278  if ((*ptr & 0xfffe0000) != 0xfffe0000)
1279  {
1280  FIXME("Invalid shader signature %#x.\n", *ptr);
1282  goto err_out;
1283  }
1284  TRACE("Shader version %#x.\n", *ptr & 0xffff);
1285  shader_ptr = ptr;
1286  ptr = find_bytecode_comment(ptr + 1, count - 1, FOURCC_PRES, &pres_size);
1287  if (!ptr)
1288  TRACE("No preshader found.\n");
1289  }
1290  else
1291  {
1292  pres_size = count;
1293  }
1294 
1295  if (ptr && FAILED(ret = parse_preshader(&peval->pres, ptr, pres_size, effect)))
1296  {
1297  FIXME("Failed parsing preshader, byte code for analysis follows.\n");
1298  dump_bytecode(byte_code, byte_code_size);
1299  goto err_out;
1300  }
1301 
1302  if (shader)
1303  {
1304  if (FAILED(ret = get_constants_desc(shader_ptr, &peval->shader_inputs, effect,
1305  skip_constants, skip_constants_count, &peval->pres)))
1306  {
1307  TRACE("Could not get shader constant table, hr %#x.\n", ret);
1308  goto err_out;
1309  }
1310  update_table_sizes_consts(peval->pres.regs.table_sizes, &peval->shader_inputs);
1311  }
1312 
1314  {
1315  if (FAILED(ret = regstore_alloc_table(&peval->pres.regs, i)))
1316  goto err_out;
1317  }
1318 
1319  if (TRACE_ON(d3dx))
1320  {
1321  dump_bytecode(byte_code, byte_code_size);
1322  dump_preshader(&peval->pres);
1323  if (shader)
1324  {
1325  TRACE("// Shader registers:\n");
1326  dump_registers(&peval->shader_inputs);
1327  }
1328  }
1329  *peval_out = peval;
1330  TRACE("Created parameter evaluator %p.\n", *peval_out);
1331  return D3D_OK;
1332 
1333 err_out:
1334  WARN("Error creating parameter evaluator.\n");
1335  if (TRACE_ON(d3dx))
1336  dump_bytecode(byte_code, byte_code_size);
1337 
1338  d3dx_free_param_eval(peval);
1339  *peval_out = NULL;
1340  return ret;
1341 }
#define TRUE
Definition: types.h:120
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define WARN(fmt,...)
Definition: debug.h:112
enum pres_value_type type
Definition: preshader.c:209
static void dump_preshader(struct d3dx_preshader *pres)
Definition: preshader.c:1089
void d3dx_free_param_eval(struct d3dx_param_eval *peval)
Definition: preshader.c:1358
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define FIXME(fmt,...)
Definition: debug.h:111
static PVOID ptr
Definition: dispmode.c:27
static HRESULT parse_preshader(struct d3dx_preshader *pres, unsigned int *ptr, unsigned int count, struct d3dx_effect *effect)
Definition: preshader.c:1113
GLuint shader
Definition: glext.h:6030
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
static enum pres_reg_tables shad_regset2table[]
Definition: preshader.c:235
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
LONG HRESULT
Definition: typedefs.h:79
static void dump_registers(struct d3dx_const_tab *ctab)
Definition: preshader.c:1063
static HRESULT get_constants_desc(unsigned int *byte_code, struct d3dx_const_tab *out, struct d3dx_effect *effect, const char **skip_constants, unsigned int skip_constants_count, struct d3dx_preshader *pres)
Definition: preshader.c:862
int ret
struct d3dx_const_tab shader_inputs
#define FOURCC_PRES
Definition: preshader.c:153
#define D3D_OK
Definition: d3d.h:106
struct d3dx_preshader pres
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static HRESULT regstore_alloc_table(struct d3dx_regstore *rs, unsigned int table)
Definition: preshader.c:313
#define NULL
Definition: types.h:112
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
static void update_table_sizes_consts(unsigned int *table_sizes, struct d3dx_const_tab *ctab)
Definition: preshader.c:1015
ULONG64 * version_counter
D3DXPARAMETER_TYPE param_type
static void dump_bytecode(void *data, unsigned int size)
Definition: preshader.c:384
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
#define TRACE_ON(x)
Definition: compat.h:75
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
static unsigned int * find_bytecode_comment(unsigned int *ptr, unsigned int count, unsigned int fourcc, unsigned int *size)
Definition: preshader.c:401

Referenced by d3dx_parse_array_selector(), and d3dx_parse_resource().

◆ d3dx_evaluate_parameter()

HRESULT d3dx_evaluate_parameter ( struct d3dx_param_eval peval,
const struct d3dx_parameter param,
void param_value 
)

Definition at line 1723 of file preshader.c.

1725 {
1726  HRESULT hr;
1727  unsigned int i;
1728  unsigned int elements, elements_param, elements_table;
1729  float *oc;
1730 
1731  TRACE("peval %p, param %p, param_value %p.\n", peval, param, param_value);
1732 
1733  if (is_const_tab_input_dirty(&peval->pres.inputs, ULONG64_MAX))
1734  {
1735  set_constants(&peval->pres.regs, &peval->pres.inputs,
1737  NULL, NULL, peval->param_type, FALSE, FALSE);
1738 
1739  if (FAILED(hr = execute_preshader(&peval->pres)))
1740  return hr;
1741  }
1742 
1743  elements_table = get_offset_reg(PRES_REGTAB_OCONST, peval->pres.regs.table_sizes[PRES_REGTAB_OCONST]);
1744  elements_param = param->bytes / sizeof(unsigned int);
1745  elements = min(elements_table, elements_param);
1746  oc = (float *)peval->pres.regs.tables[PRES_REGTAB_OCONST];
1747  for (i = 0; i < elements; ++i)
1748  set_number((unsigned int *)param_value + i, param->type, oc + i, D3DXPT_FLOAT);
1749  return D3D_OK;
1750 }
static HRESULT set_constants(struct d3dx_regstore *rs, struct d3dx_const_tab *const_tab, ULONG64 new_update_version, ID3DXEffectStateManager *manager, struct IDirect3DDevice9 *device, D3DXPARAMETER_TYPE type, BOOL device_update_all, BOOL pres_dirty)
Definition: preshader.c:1483
HRESULT hr
Definition: shlfolder.c:183
static void set_number(void *outdata, D3DXPARAMETER_TYPE outtype, const void *indata, D3DXPARAMETER_TYPE intype)
static BOOL is_const_tab_input_dirty(struct d3dx_const_tab *ctab, ULONG64 update_version)
Definition: preshader.c:1702
#define FALSE
Definition: types.h:117
static HRESULT execute_preshader(struct d3dx_preshader *pres)
Definition: preshader.c:1659
#define TRACE(s)
Definition: solgame.cpp:4
static unsigned int get_offset_reg(unsigned int table, unsigned int reg_idx)
Definition: preshader.c:301
static ULONG64 next_update_version(ULONG64 *version_counter)
LONG HRESULT
Definition: typedefs.h:79
GLfloat param
Definition: glext.h:5796
#define for
Definition: utility.h:88
#define ULONG64_MAX
Definition: d3dx9_private.h:34
#define D3D_OK
Definition: d3d.h:106
struct d3dx_preshader pres
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
#define min(a, b)
Definition: monoChain.cc:55
#define NULL
Definition: types.h:112
ULONG64 * version_counter
D3DXPARAMETER_TYPE param_type
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31

Referenced by d3dx9_get_param_value_ptr().

◆ d3dx_free_const_tab()

static void d3dx_free_const_tab ( struct d3dx_const_tab ctab)
static

Definition at line 1343 of file preshader.c.

1344 {
1345  HeapFree(GetProcessHeap(), 0, ctab->inputs);
1346  HeapFree(GetProcessHeap(), 0, ctab->inputs_param);
1347  HeapFree(GetProcessHeap(), 0, ctab->const_set);
1348 }
D3DXCONSTANT_DESC * inputs
struct d3dx_const_param_eval_output * const_set
struct d3dx_parameter ** inputs_param
#define GetProcessHeap()
Definition: compat.h:595
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by d3dx_free_param_eval(), and d3dx_free_preshader().

◆ d3dx_free_param_eval()

void d3dx_free_param_eval ( struct d3dx_param_eval peval)

Definition at line 1358 of file preshader.c.

1359 {
1360  TRACE("peval %p.\n", peval);
1361 
1362  if (!peval)
1363  return;
1364 
1365  d3dx_free_preshader(&peval->pres);
1367  HeapFree(GetProcessHeap(), 0, peval);
1368 }
static void d3dx_free_preshader(struct d3dx_preshader *pres)
Definition: preshader.c:1350
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
struct d3dx_const_tab shader_inputs
struct d3dx_preshader pres
static void d3dx_free_const_tab(struct d3dx_const_tab *ctab)
Definition: preshader.c:1343
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by d3dx_create_param_eval(), and free_parameter().

◆ d3dx_free_preshader()

static void d3dx_free_preshader ( struct d3dx_preshader pres)
static

Definition at line 1350 of file preshader.c.

1351 {
1352  HeapFree(GetProcessHeap(), 0, pres->ins);
1353 
1354  regstore_free_tables(&pres->regs);
1355  d3dx_free_const_tab(&pres->inputs);
1356 }
#define GetProcessHeap()
Definition: compat.h:595
struct d3dx_preshader pres
static void regstore_free_tables(struct d3dx_regstore *rs)
Definition: preshader.c:327
static void d3dx_free_const_tab(struct d3dx_const_tab *ctab)
Definition: preshader.c:1343
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by d3dx_free_param_eval().

◆ d3dx_param_eval_set_shader_constants()

HRESULT d3dx_param_eval_set_shader_constants ( ID3DXEffectStateManager *  manager,
struct IDirect3DDevice9 *  device,
struct d3dx_param_eval peval,
BOOL  update_all 
)

Definition at line 1752 of file preshader.c.

1754 {
1755  HRESULT hr;
1756  struct d3dx_preshader *pres = &peval->pres;
1757  struct d3dx_regstore *rs = &pres->regs;
1758  ULONG64 new_update_version = next_update_version(peval->version_counter);
1759  BOOL pres_dirty = FALSE;
1760 
1761  TRACE("device %p, peval %p, param_type %u.\n", device, peval, peval->param_type);
1762 
1764  {
1765  set_constants(rs, &pres->inputs, new_update_version,
1766  NULL, NULL, peval->param_type, FALSE, FALSE);
1767  if (FAILED(hr = execute_preshader(pres)))
1768  return hr;
1769  pres_dirty = TRUE;
1770  }
1771 
1772  return set_constants(rs, &peval->shader_inputs, new_update_version,
1773  manager, device, peval->param_type, update_all, pres_dirty);
1774 }
static HRESULT set_constants(struct d3dx_regstore *rs, struct d3dx_const_tab *const_tab, ULONG64 new_update_version, ID3DXEffectStateManager *manager, struct IDirect3DDevice9 *device, D3DXPARAMETER_TYPE type, BOOL device_update_all, BOOL pres_dirty)
Definition: preshader.c:1483
HRESULT hr
Definition: shlfolder.c:183
#define TRUE
Definition: types.h:120
static BOOL is_const_tab_input_dirty(struct d3dx_const_tab *ctab, ULONG64 update_version)
Definition: preshader.c:1702
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
Definition: devices.h:37
static HRESULT execute_preshader(struct d3dx_preshader *pres)
Definition: preshader.c:1659
#define TRACE(s)
Definition: solgame.cpp:4
static ULONG64 next_update_version(ULONG64 *version_counter)
LONG HRESULT
Definition: typedefs.h:79
#define ULONG64_MAX
Definition: d3dx9_private.h:34
unsigned __int64 ULONG64
Definition: imports.h:198
struct d3dx_const_tab shader_inputs
struct d3dx_preshader pres
#define NULL
Definition: types.h:112
ULONG64 * version_counter
D3DXPARAMETER_TYPE param_type
struct d3dx_regstore regs
struct d3dx_const_tab inputs

Referenced by d3dx_set_shader_constants().

◆ dump_arg()

static void dump_arg ( struct d3dx_regstore rs,
const struct d3dx_pres_operand arg,
int  component_count 
)
static

Definition at line 1029 of file preshader.c.

1030 {
1031  static const char *xyzw_str = "xyzw";
1032  unsigned int i, table;
1033 
1034  table = arg->reg.table;
1035  if (table == PRES_REGTAB_IMMED && arg->index_reg.table == PRES_REGTAB_COUNT)
1036  {
1037  TRACE("(");
1038  for (i = 0; i < component_count; ++i)
1039  TRACE(i < component_count - 1 ? "%.16e, " : "%.16e",
1040  ((double *)rs->tables[PRES_REGTAB_IMMED])[arg->reg.offset + i]);
1041  TRACE(")");
1042  }
1043  else
1044  {
1045  if (arg->index_reg.table == PRES_REGTAB_COUNT)
1046  {
1047  TRACE("%s%u.", table_symbol[table], get_reg_offset(table, arg->reg.offset));
1048  }
1049  else
1050  {
1051  unsigned int index_reg;
1052 
1053  index_reg = get_reg_offset(arg->index_reg.table, arg->index_reg.offset);
1054  TRACE("%s[%u + %s%u.%c].", table_symbol[table], get_reg_offset(table, arg->reg.offset),
1055  table_symbol[arg->index_reg.table], index_reg,
1056  xyzw_str[arg->index_reg.offset - get_offset_reg(arg->index_reg.table, index_reg)]);
1057  }
1058  for (i = 0; i < component_count; ++i)
1059  TRACE("%c", xyzw_str[(arg->reg.offset + i) % 4]);
1060  }
1061 }
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644
static unsigned int get_reg_offset(unsigned int table, unsigned int offset)
Definition: preshader.c:296
unsigned int component_count
#define TRACE(s)
Definition: solgame.cpp:4
static unsigned int get_offset_reg(unsigned int table, unsigned int reg_idx)
Definition: preshader.c:301
static const char * table_symbol[]
Definition: preshader.c:222
void * tables[PRES_REGTAB_COUNT]
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

Referenced by dump_ins().

◆ dump_bytecode()

static void dump_bytecode ( void data,
unsigned int  size 
)
static

Definition at line 384 of file preshader.c.

385 {
386  unsigned int *bytecode = (unsigned int *)data;
387  unsigned int i, j, n;
388 
389  size /= sizeof(*bytecode);
390  i = 0;
391  while (i < size)
392  {
393  n = min(size - i, 8);
394  for (j = 0; j < n; ++j)
395  TRACE("0x%08x,", bytecode[i + j]);
396  i += n;
397  TRACE("\n");
398  }
399 }
GLdouble n
Definition: glext.h:7729
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
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
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
#define min(a, b)
Definition: monoChain.cc:55

Referenced by d3dx_create_param_eval().

◆ dump_ins()

static void dump_ins ( struct d3dx_regstore rs,
const struct d3dx_pres_ins ins 
)
static

Definition at line 1075 of file preshader.c.

1076 {
1077  unsigned int i;
1078 
1079  TRACE("%s ", pres_op_info[ins->op].mnem);
1080  dump_arg(rs, &ins->output, pres_op_info[ins->op].func_all_comps ? 1 : ins->component_count);
1081  for (i = 0; i < pres_op_info[ins->op].input_count; ++i)
1082  {
1083  TRACE(", ");
1084  dump_arg(rs, &ins->inputs[i], ins->scalar_op && !i ? 1 : ins->component_count);
1085  }
1086  TRACE("\n");
1087 }
BOOL scalar_op
Definition: preshader.c:264
enum pres_ops op
Definition: preshader.c:261
static const struct op_info pres_op_info[]
Definition: preshader.c:168
unsigned int component_count
Definition: preshader.c:265
struct d3dx_pres_operand output
Definition: preshader.c:267
#define TRACE(s)
Definition: solgame.cpp:4
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static void dump_arg(struct d3dx_regstore *rs, const struct d3dx_pres_operand *arg, int component_count)
Definition: preshader.c:1029
struct d3dx_pres_operand inputs[MAX_INPUTS_COUNT]
Definition: preshader.c:266

Referenced by dump_preshader().

◆ dump_preshader()

static void dump_preshader ( struct d3dx_preshader pres)
static

Definition at line 1089 of file preshader.c.

1090 {
1091  unsigned int i, immediate_count = pres->regs.table_sizes[PRES_REGTAB_IMMED] * 4;
1092  const double *immediates = pres->regs.tables[PRES_REGTAB_IMMED];
1093 
1094  if (immediate_count)
1095  TRACE("// Immediates:\n");
1096  for (i = 0; i < immediate_count; ++i)
1097  {
1098  if (!(i % 4))
1099  TRACE("// ");
1100  TRACE("%.8e", immediates[i]);
1101  if (i % 4 == 3)
1102  TRACE("\n");
1103  else
1104  TRACE(", ");
1105  }
1106  TRACE("// Preshader registers:\n");
1107  dump_registers(&pres->inputs);
1108  TRACE("preshader\n");
1109  for (i = 0; i < pres->ins_count; ++i)
1110  dump_ins(&pres->regs, &pres->ins[i]);
1111 }
#define TRACE(s)
Definition: solgame.cpp:4
static void dump_registers(struct d3dx_const_tab *ctab)
Definition: preshader.c:1063
unsigned int ins_count
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
struct d3dx_pres_ins * ins
struct d3dx_regstore regs
struct d3dx_const_tab inputs
static void dump_ins(struct d3dx_regstore *rs, const struct d3dx_pres_ins *ins)
Definition: preshader.c:1075

Referenced by d3dx_create_param_eval().

◆ dump_registers()

static void dump_registers ( struct d3dx_const_tab ctab)
static

Definition at line 1063 of file preshader.c.

1064 {
1065  unsigned int table, i;
1066 
1067  for (i = 0; i < ctab->input_count; ++i)
1068  {
1069  table = ctab->regset2table[ctab->inputs[i].RegisterSet];
1070  TRACE("// %-12s %s%-4u %u\n", ctab->inputs_param[i] ? ctab->inputs_param[i]->name : "(nil)",
1072  }
1073 }
D3DXCONSTANT_DESC * inputs
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644
struct d3dx_parameter ** inputs_param
D3DXREGISTER_SET RegisterSet
Definition: d3dx9shader.h:106
#define TRACE(s)
Definition: solgame.cpp:4
unsigned int input_count
static const char * table_symbol[]
Definition: preshader.c:222
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
enum pres_reg_tables * regset2table

Referenced by d3dx_create_param_eval(), and dump_preshader().

◆ exec_get_arg()

static double exec_get_arg ( struct d3dx_regstore rs,
const struct d3dx_pres_operand opr,
unsigned int  comp 
)
static

Definition at line 1610 of file preshader.c.

1611 {
1612  unsigned int offset, base_index, reg_index, table;
1613 
1614  table = opr->reg.table;
1615 
1616  if (opr->index_reg.table == PRES_REGTAB_COUNT)
1617  base_index = 0;
1618  else
1619  base_index = lrint(exec_get_reg_value(rs, opr->index_reg.table, opr->index_reg.offset));
1620 
1621  offset = get_offset_reg(table, base_index) + opr->reg.offset + comp;
1622  reg_index = get_reg_offset(table, offset);
1623 
1624  if (reg_index >= rs->table_sizes[table])
1625  {
1626  unsigned int wrap_size;
1627 
1628  if (table == PRES_REGTAB_CONST)
1629  {
1630  /* As it can be guessed from tests, offset into floating constant table is wrapped
1631  * to the nearest power of 2 and not to the actual table size. */
1632  for (wrap_size = 1; wrap_size < rs->table_sizes[table]; wrap_size <<= 1)
1633  ;
1634  }
1635  else
1636  {
1637  wrap_size = rs->table_sizes[table];
1638  }
1639  WARN("Wrapping register index %u, table %u, wrap_size %u, table size %u.\n",
1640  reg_index, table, wrap_size, rs->table_sizes[table]);
1641  reg_index %= wrap_size;
1642 
1643  if (reg_index >= rs->table_sizes[table])
1644  return 0.0;
1645 
1647  }
1648 
1649  return exec_get_reg_value(rs, table, offset);
1650 }
static double exec_get_reg_value(struct d3dx_regstore *rs, enum pres_reg_tables table, unsigned int offset)
Definition: preshader.c:1605
#define WARN(fmt,...)
Definition: debug.h:112
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644
_Check_return_ __CRT_INLINE long lrint(_In_ double x)
Definition: math.h:267
static unsigned int get_reg_offset(unsigned int table, unsigned int offset)
Definition: preshader.c:296
unsigned int table_sizes[PRES_REGTAB_COUNT]
static unsigned int get_reg_components(unsigned int table)
Definition: preshader.c:306
static unsigned int get_offset_reg(unsigned int table, unsigned int reg_idx)
Definition: preshader.c:301
GLintptr offset
Definition: glext.h:5920
struct d3dx_pres_reg reg
Definition: preshader.c:253
struct d3dx_pres_reg index_reg
Definition: preshader.c:254

Referenced by execute_preshader().

◆ exec_get_reg_value()

static double exec_get_reg_value ( struct d3dx_regstore rs,
enum pres_reg_tables  table,
unsigned int  offset 
)
static

Definition at line 1605 of file preshader.c.

1606 {
1607  return regstore_get_double(rs, table, offset);
1608 }
GLintptr offset
Definition: glext.h:5920
static double regstore_get_double(struct d3dx_regstore *rs, unsigned int table, unsigned int offset)
Definition: preshader.c:350

Referenced by exec_get_arg().

◆ exec_set_arg()

static void exec_set_arg ( struct d3dx_regstore rs,
const struct d3dx_pres_reg reg,
unsigned int  comp,
double  res 
)
static

Definition at line 1652 of file preshader.c.

1654 {
1655  regstore_set_double(rs, reg->table, reg->offset + comp, res);
1656 }
static int reg
Definition: i386-dis.c:1283
GLuint res
Definition: glext.h:9613
static void regstore_set_double(struct d3dx_regstore *rs, unsigned int table, unsigned int offset, double v)
Definition: preshader.c:367

Referenced by execute_preshader().

◆ execute_preshader()

static HRESULT execute_preshader ( struct d3dx_preshader pres)
static

Definition at line 1659 of file preshader.c.

1660 {
1661  unsigned int i, j, k;
1662  double args[ARGS_ARRAY_SIZE];
1663  double res;
1664 
1665  for (i = 0; i < pres->ins_count; ++i)
1666  {
1667  const struct d3dx_pres_ins *ins;
1668  const struct op_info *oi;
1669 
1670  ins = &pres->ins[i];
1671  oi = &pres_op_info[ins->op];
1672  if (oi->func_all_comps)
1673  {
1674  if (oi->input_count * ins->component_count > ARGS_ARRAY_SIZE)
1675  {
1676  FIXME("Too many arguments (%u) for one instruction.\n", oi->input_count * ins->component_count);
1677  return E_FAIL;
1678  }
1679  for (k = 0; k < oi->input_count; ++k)
1680  for (j = 0; j < ins->component_count; ++j)
1681  args[k * ins->component_count + j] = exec_get_arg(&pres->regs, &ins->inputs[k],
1682  ins->scalar_op && !k ? 0 : j);
1683  res = oi->func(args, ins->component_count);
1684 
1685  /* only 'dot' instruction currently falls here */
1686  exec_set_arg(&pres->regs, &ins->output.reg, 0, res);
1687  }
1688  else
1689  {
1690  for (j = 0; j < ins->component_count; ++j)
1691  {
1692  for (k = 0; k < oi->input_count; ++k)
1693  args[k] = exec_get_arg(&pres->regs, &ins->inputs[k], ins->scalar_op && !k ? 0 : j);
1694  res = oi->func(args, ins->component_count);
1695  exec_set_arg(&pres->regs, &ins->output.reg, j, res);
1696  }
1697  }
1698  }
1699  return D3D_OK;
1700 }
static double exec_get_arg(struct d3dx_regstore *rs, const struct d3dx_pres_operand *opr, unsigned int comp)
Definition: preshader.c:1610
#define E_FAIL
Definition: ddrawi.h:102
Definition: match.c:390
BOOL scalar_op
Definition: preshader.c:264
enum pres_ops op
Definition: preshader.c:261
#define FIXME(fmt,...)
Definition: debug.h:111
static const struct op_info pres_op_info[]
Definition: preshader.c:168
unsigned int component_count
Definition: preshader.c:265
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 d3dx_pres_operand output
Definition: preshader.c:267
unsigned int ins_count
#define D3D_OK
Definition: d3d.h:106
pres_op_func func
Definition: preshader.c:165
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
struct d3dx_pres_ins * ins
GLuint res
Definition: glext.h:9613
struct d3dx_regstore regs
BOOL func_all_comps
Definition: preshader.c:164
static void exec_set_arg(struct d3dx_regstore *rs, const struct d3dx_pres_reg *reg, unsigned int comp, double res)
Definition: preshader.c:1652
int k
Definition: mpi.c:3369
#define ARGS_ARRAY_SIZE
Definition: preshader.c:1658
struct d3dx_pres_operand inputs[MAX_INPUTS_COUNT]
Definition: preshader.c:266
unsigned int input_count
Definition: preshader.c:163

Referenced by d3dx_evaluate_parameter(), and d3dx_param_eval_set_shader_constants().

◆ find_bytecode_comment()

static unsigned int* find_bytecode_comment ( unsigned int ptr,
unsigned int  count,
unsigned int  fourcc,
unsigned int size 
)
static

Definition at line 401 of file preshader.c.

403 {
404  /* Provide at least one value in comment section on non-NULL return. */
405  while (count > 2 && (*ptr & 0xffff) == 0xfffe)
406  {
407  unsigned int section_size;
408 
409  section_size = (*ptr >> 16);
410  if (!section_size || section_size + 1 > count)
411  break;
412  if (*(ptr + 1) == fourcc)
413  {
414  *size = section_size;
415  return ptr + 2;
416  }
417  count -= section_size + 1;
418  ptr += section_size + 1;
419  }
420  return NULL;
421 }
GLuint GLuint GLsizei count
Definition: gl.h:1545
static PVOID ptr
Definition: dispmode.c:27
GLsizeiptr size
Definition: glext.h:5919
#define NULL
Definition: types.h:112

Referenced by d3dx_create_param_eval(), and parse_preshader().

◆ get_const_upload_info()

static void get_const_upload_info ( struct d3dx_const_param_eval_output const_set,
struct const_upload_info info 
)
static

Definition at line 557 of file preshader.c.

559 {
560  struct d3dx_parameter *param = const_set->param;
561  unsigned int table = const_set->table;
562 
563  info->transpose = (const_set->constant_class == D3DXPC_MATRIX_COLUMNS && param->class == D3DXPC_MATRIX_ROWS)
564  || (param->class == D3DXPC_MATRIX_COLUMNS && const_set->constant_class == D3DXPC_MATRIX_ROWS);
565  if (const_set->constant_class == D3DXPC_MATRIX_COLUMNS)
566  {
567  info->major = param->columns;
568  info->minor = param->rows;
569  }
570  else
571  {
572  info->major = param->rows;
573  info->minor = param->columns;
574  }
575 
576  if (get_reg_components(table) == 1)
577  {
578  unsigned int const_length = get_offset_reg(table, const_set->register_count);
579 
580  info->major_stride = info->minor;
581  info->major_count = const_length / info->major_stride;
582  info->minor_remainder = const_length % info->major_stride;
583  }
584  else
585  {
586  info->major_stride = get_reg_components(table);
587  info->major_count = const_set->register_count;
588  info->minor_remainder = 0;
589  }
590  info->count = info->major_count * info->minor + info->minor_remainder;
591 }
enum pres_reg_tables table
unsigned int count
Definition: notification.c:64
static unsigned int get_reg_components(unsigned int table)
Definition: preshader.c:306
static unsigned int get_offset_reg(unsigned int table, unsigned int reg_idx)
Definition: preshader.c:301
GLfloat param
Definition: glext.h:5796
enum D3DXPARAMETER_CLASS constant_class
struct d3dx_parameter * param

Referenced by init_set_constants_param(), and set_constants().

◆ get_constants_desc()

static HRESULT get_constants_desc ( unsigned int byte_code,
struct d3dx_const_tab out,
struct d3dx_effect effect,
const char **  skip_constants,
unsigned int  skip_constants_count,
struct d3dx_preshader pres 
)
static

Definition at line 862 of file preshader.c.

865 {
866  ID3DXConstantTable *ctab;
867  D3DXCONSTANT_DESC *cdesc;
868  struct d3dx_parameter **inputs_param;
870  HRESULT hr;
871  D3DXHANDLE hc;
872  unsigned int i, j;
873 
874  hr = D3DXGetShaderConstantTable(byte_code, &ctab);
875  if (FAILED(hr) || !ctab)
876  {
877  TRACE("Could not get CTAB data, hr %#x.\n", hr);
878  /* returning OK, shaders and preshaders without CTAB are valid */
879  return D3D_OK;
880  }
881  if (FAILED(hr = ID3DXConstantTable_GetDesc(ctab, &desc)))
882  {
883  FIXME("Could not get CTAB desc, hr %#x.\n", hr);
884  goto cleanup;
885  }
886 
887  out->inputs = cdesc = HeapAlloc(GetProcessHeap(), 0, sizeof(*cdesc) * desc.Constants);
888  out->inputs_param = inputs_param = HeapAlloc(GetProcessHeap(), 0, sizeof(*inputs_param) * desc.Constants);
889  if (!cdesc || !inputs_param)
890  {
891  hr = E_OUTOFMEMORY;
892  goto cleanup;
893  }
894 
895  for (i = 0; i < desc.Constants; ++i)
896  {
897  unsigned int index = out->input_count;
898  WORD constantinfo_reserved;
899 
901  if (!hc)
902  {
903  FIXME("Null constant handle.\n");
904  goto cleanup;
905  }
906  if (FAILED(hr = get_ctab_constant_desc(ctab, hc, &cdesc[index], &constantinfo_reserved)))
907  goto cleanup;
908  inputs_param[index] = get_parameter_by_name(effect, NULL, cdesc[index].Name);
909  if (!inputs_param[index])
910  {
911  WARN("Could not find parameter %s in effect.\n", cdesc[index].Name);
912  continue;
913  }
914  if (cdesc[index].Class == D3DXPC_OBJECT)
915  {
916  TRACE("Object %s, parameter %p.\n", cdesc[index].Name, inputs_param[index]);
917  if (cdesc[index].RegisterSet != D3DXRS_SAMPLER || inputs_param[index]->class != D3DXPC_OBJECT
918  || !is_param_type_sampler(inputs_param[index]->type))
919  {
920  WARN("Unexpected object type, constant %s.\n", debugstr_a(cdesc[index].Name));
922  goto cleanup;
923  }
924  if (max(inputs_param[index]->element_count, 1) < cdesc[index].RegisterCount)
925  {
926  WARN("Register count exceeds parameter size, constant %s.\n", debugstr_a(cdesc[index].Name));
928  goto cleanup;
929  }
930  }
931  if (!is_top_level_parameter(inputs_param[index]))
932  {
933  WARN("Expected top level parameter '%s'.\n", debugstr_a(cdesc[index].Name));
934  hr = E_FAIL;
935  goto cleanup;
936  }
937 
938  for (j = 0; j < skip_constants_count; ++j)
939  {
940  if (!strcmp(cdesc[index].Name, skip_constants[j]))
941  {
942  if (!constantinfo_reserved)
943  {
944  WARN("skip_constants parameter %s is not register bound.\n",
945  cdesc[index].Name);
947  goto cleanup;
948  }
949  TRACE("Skipping constant %s.\n", cdesc[index].Name);
950  break;
951  }
952  }
953  if (j < skip_constants_count)
954  continue;
955  ++out->input_count;
956  if (inputs_param[index]->class == D3DXPC_OBJECT)
957  continue;
958  if (FAILED(hr = init_set_constants_param(out, ctab, hc, inputs_param[index])))
959  goto cleanup;
960  }
961  if (pres)
963  if (out->const_set_count)
964  {
965  struct d3dx_const_param_eval_output *new_alloc;
966 
967  qsort(out->const_set, out->const_set_count, sizeof(*out->const_set), compare_const_set);
968 
969  i = 0;
970  while (i < out->const_set_count - 1)
971  {
972  if (out->const_set[i].constant_class == D3DXPC_FORCE_DWORD
973  && out->const_set[i + 1].constant_class == D3DXPC_FORCE_DWORD
974  && out->const_set[i].table == out->const_set[i + 1].table
975  && out->const_set[i].register_index + out->const_set[i].register_count
976  >= out->const_set[i + 1].register_index)
977  {
978  assert(out->const_set[i].register_index + out->const_set[i].register_count
979  <= out->const_set[i + 1].register_index + 1);
980  out->const_set[i].register_count = out->const_set[i + 1].register_index + 1
981  - out->const_set[i].register_index;
982  memmove(&out->const_set[i + 1], &out->const_set[i + 2], sizeof(out->const_set[i])
983  * (out->const_set_count - i - 2));
984  --out->const_set_count;
985  }
986  else
987  {
988  ++i;
989  }
990  }
991 
992  new_alloc = HeapReAlloc(GetProcessHeap(), 0, out->const_set,
993  sizeof(*out->const_set) * out->const_set_count);
994  if (new_alloc)
995  {
996  out->const_set = new_alloc;
997  out->const_set_size = out->const_set_count;
998  }
999  else
1000  {
1001  WARN("Out of memory.\n");
1002  }
1003  }
1004 cleanup:
1006  return hr;
1007 }
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
#define max(a, b)
Definition: svc.c:63
static BOOL is_param_type_sampler(D3DXPARAMETER_TYPE type)
HRESULT hr
Definition: shlfolder.c:183
const char * D3DXHANDLE
Definition: d3dx9shader.h:48
HRESULT WINAPI D3DXGetShaderConstantTable(const DWORD *byte_code, ID3DXConstantTable **constant_table)
Definition: shader.c:2111
#define WARN(fmt,...)
Definition: debug.h:112
static HRESULT init_set_constants_param(struct d3dx_const_tab *const_tab, ID3DXConstantTable *ctab, D3DXHANDLE hc, struct d3dx_parameter *param)
Definition: preshader.c:740
#define D3DERR_INVALIDCALL
#define assert(x)
Definition: debug.h:53
#define ID3DXConstantTable_GetConstant(p, a, b)
Definition: d3dx9shader.h:185
#define ID3DXConstantTable_Release(p)
Definition: d3dx9shader.h:177
static int __cdecl compare_const_set(const void *a, const void *b)
Definition: preshader.c:653
#define E_FAIL
Definition: ddrawi.h:102
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static const WCHAR desc[]
Definition: protectdata.c:36
static void append_pres_const_sets_for_shader_input(struct d3dx_const_tab *const_tab, struct d3dx_preshader *pres)
Definition: preshader.c:630
void __cdecl qsort(_Inout_updates_bytes_(_NumOfElements *_SizeOfElements) void *_Base, _In_ size_t _NumOfElements, _In_ size_t _SizeOfElements, _In_ int(__cdecl *_PtFuncCompare)(const void *, const void *))
#define FIXME(fmt,...)
Definition: debug.h:111
static BOOL is_top_level_parameter(struct d3dx_parameter *param)
GLuint index
Definition: glext.h:6031
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
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define debugstr_a
Definition: kernel32.h:31
LONG HRESULT
Definition: typedefs.h:79
unsigned short WORD
Definition: ntddk_ex.h:93
static FILE * out
Definition: regtests2xml.c:44
#define index(s, c)
Definition: various.h:29
#define ID3DXConstantTable_GetDesc(p, a)
Definition: d3dx9shader.h:182
#define D3D_OK
Definition: d3d.h:106
struct d3dx_parameter * get_parameter_by_name(struct d3dx_effect *effect, struct d3dx_parameter *parameter, const char *name) DECLSPEC_HIDDEN
Definition: effect.c:1026
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
#define HeapReAlloc
Definition: compat.h:593
#define NULL
Definition: types.h:112
static HRESULT get_ctab_constant_desc(ID3DXConstantTable *ctab, D3DXHANDLE hc, D3DXCONSTANT_DESC *desc, WORD *constantinfo_reserved)
Definition: preshader.c:539
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
char * cleanup(char *str)
Definition: wpickclick.c:99
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545

Referenced by d3dx_create_param_eval(), and parse_preshader().

◆ get_ctab_constant_desc()

static HRESULT get_ctab_constant_desc ( ID3DXConstantTable *  ctab,
D3DXHANDLE  hc,
D3DXCONSTANT_DESC desc,
WORD constantinfo_reserved 
)
static

Definition at line 539 of file preshader.c.

541 {
542  const struct ctab_constant *constant = d3dx_shader_get_ctab_constant(ctab, hc);
543 
544  if (!constant)
545  {
546  FIXME("Could not get constant desc.\n");
549  return D3DERR_INVALIDCALL;
550  }
551  *desc = constant->desc;
553  *constantinfo_reserved = constant->constantinfo_reserved;
554  return D3D_OK;
555 }
#define D3DERR_INVALIDCALL
WORD constantinfo_reserved
static const WCHAR desc[]
Definition: protectdata.c:36
#define FIXME(fmt,...)
Definition: debug.h:111
const struct ctab_constant * d3dx_shader_get_ctab_constant(ID3DXConstantTable *iface, D3DXHANDLE constant) DECLSPEC_HIDDEN
Definition: shader.c:984
#define D3D_OK
Definition: d3d.h:106

Referenced by get_constants_desc(), and init_set_constants_param().

◆ get_offset_reg()

◆ get_reg_components()

static unsigned int get_reg_components ( unsigned int  table)
static

Definition at line 306 of file preshader.c.

307 {
308  return get_offset_reg(table, 1);
309 }
static unsigned int get_offset_reg(unsigned int table, unsigned int reg_idx)
Definition: preshader.c:301

Referenced by exec_get_arg(), get_const_upload_info(), parse_preshader(), and set_constants().

◆ get_reg_offset()

static unsigned int get_reg_offset ( unsigned int  table,
unsigned int  offset 
)
static

◆ init_set_constants_param()

static HRESULT init_set_constants_param ( struct d3dx_const_tab const_tab,
ID3DXConstantTable *  ctab,
D3DXHANDLE  hc,
struct d3dx_parameter param 
)
static

Definition at line 740 of file preshader.c.

742 {
744  unsigned int const_count, param_count, i;
745  BOOL get_element;
746  struct d3dx_const_param_eval_output const_set;
747  struct const_upload_info info;
748  enum pres_value_type table_type;
749  HRESULT hr;
750 
751  if (FAILED(get_ctab_constant_desc(ctab, hc, &desc, NULL)))
752  return D3DERR_INVALIDCALL;
753 
754  if (param->element_count)
755  {
756  param_count = param->element_count;
757  const_count = desc.Elements;
758  get_element = TRUE;
759  }
760  else
761  {
762  if (desc.Elements > 1)
763  {
764  FIXME("Unexpected number of constant elements %u.\n", desc.Elements);
765  return D3DERR_INVALIDCALL;
766  }
767  param_count = param->member_count;
768  const_count = desc.StructMembers;
769  get_element = FALSE;
770  }
771  if (const_count != param_count)
772  {
773  FIXME("Number of elements or struct members differs between parameter (%u) and constant (%u).\n",
774  param_count, const_count);
775  return D3DERR_INVALIDCALL;
776  }
777  if (const_count)
778  {
779  HRESULT ret = D3D_OK;
780  D3DXHANDLE hc_element;
781  unsigned int index = const_tab->const_set_count;
782 
783  for (i = 0; i < const_count; ++i)
784  {
785  if (get_element)
786  hc_element = ID3DXConstantTable_GetConstantElement(ctab, hc, i);
787  else
788  hc_element = ID3DXConstantTable_GetConstant(ctab, hc, i);
789  if (!hc_element)
790  {
791  FIXME("Could not get constant.\n");
793  }
794  else
795  {
796  hr = init_set_constants_param(const_tab, ctab, hc_element, &param->members[i]);
797  }
798  if (FAILED(hr))
799  ret = hr;
800  }
801  if (FAILED(ret))
802  return ret;
803  return merge_const_set_entries(const_tab, param, index);
804  }
805 
806  TRACE("Constant %s, rows %u, columns %u, class %u, bytes %u.\n",
807  debugstr_a(desc.Name), desc.Rows, desc.Columns, desc.Class, desc.Bytes);
808  TRACE("Parameter %s, rows %u, columns %u, class %u, flags %#x, bytes %u.\n",
809  debugstr_a(param->name), param->rows, param->columns, param->class,
810  param->flags, param->bytes);
811 
812  const_set.element_count = 1;
813  const_set.param = param;
814  const_set.constant_class = desc.Class;
815  if (desc.RegisterSet >= ARRAY_SIZE(shad_regset2table))
816  {
817  FIXME("Unknown register set %u.\n", desc.RegisterSet);
818  return D3DERR_INVALIDCALL;
819  }
820  const_set.register_index = desc.RegisterIndex;
821  const_set.table = const_tab->regset2table[desc.RegisterSet];
822  if (const_set.table >= PRES_REGTAB_COUNT)
823  {
824  ERR("Unexpected register set %u.\n", desc.RegisterSet);
825  return D3DERR_INVALIDCALL;
826  }
827  assert(table_info[const_set.table].component_size == sizeof(unsigned int));
828  assert(param->bytes / (param->rows * param->columns) == sizeof(unsigned int));
829  const_set.register_count = desc.RegisterCount;
830  table_type = table_info[const_set.table].type;
831  get_const_upload_info(&const_set, &info);
832  if (!info.count)
833  {
834  TRACE("%s has zero count, skipping.\n", debugstr_a(param->name));
835  return D3D_OK;
836  }
837 
839  return D3DERR_INVALIDCALL;
840 
841  const_set.direct_copy = table_type_from_param_type(param->type) == table_type
842  && !info.transpose && info.minor == info.major_stride
843  && info.count == get_offset_reg(const_set.table, const_set.register_count)
844  && info.count * sizeof(unsigned int) <= param->bytes;
845  if (info.minor_remainder && !const_set.direct_copy && !info.transpose)
846  FIXME("Incomplete last row for not transposed matrix which cannot be directly copied, parameter %s.\n",
847  debugstr_a(param->name));
848 
849  if (info.major_count > info.major
850  || (info.major_count == info.major && info.minor_remainder))
851  {
852  WARN("Constant dimensions exceed parameter size.\n");
853  return D3DERR_INVALIDCALL;
854  }
855 
856  if (FAILED(hr = append_const_set(const_tab, &const_set)))
857  return hr;
858 
859  return D3D_OK;
860 }
#define ID3DXConstantTable_GetConstantElement(p, a, b)
Definition: d3dx9shader.h:187
HRESULT hr
Definition: shlfolder.c:183
const char * D3DXHANDLE
Definition: d3dx9shader.h:48
#define TRUE
Definition: types.h:120
#define WARN(fmt,...)
Definition: debug.h:112
static HRESULT init_set_constants_param(struct d3dx_const_tab *const_tab, ID3DXConstantTable *ctab, D3DXHANDLE hc, struct d3dx_parameter *param)
Definition: preshader.c:740
#define D3DERR_INVALIDCALL
#define assert(x)
Definition: debug.h:53
#define ID3DXConstantTable_GetConstant(p, a, b)
Definition: d3dx9shader.h:185
if(dx==0 &&dy==0)
Definition: linetemp.h:174
static enum pres_value_type table_type_from_param_type(D3DXPARAMETER_TYPE type)
Definition: preshader.c:280
unsigned int count
Definition: notification.c:64
pres_value_type
Definition: preshader.c:197
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
static const WCHAR desc[]
Definition: protectdata.c:36
#define FIXME(fmt,...)
Definition: debug.h:111
static void get_const_upload_info(struct d3dx_const_param_eval_output *const_set, struct const_upload_info *info)
Definition: preshader.c:557
GLuint index
Definition: glext.h:6031
#define TRACE(s)
Definition: solgame.cpp:4
static unsigned int get_offset_reg(unsigned int table, unsigned int reg_idx)
Definition: preshader.c:301
static enum pres_reg_tables shad_regset2table[]
Definition: preshader.c:235
static const struct @234 table_info[]
#define debugstr_a
Definition: kernel32.h:31
LONG HRESULT
Definition: typedefs.h:79
GLfloat param
Definition: glext.h:5796
int ret
#define ERR(fmt,...)
Definition: debug.h:110
#define D3D_OK
Definition: d3d.h:106
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
#define ARRAY_SIZE(a)
Definition: main.h:24
#define NULL
Definition: types.h:112
static HRESULT merge_const_set_entries(struct d3dx_const_tab *const_tab, struct d3dx_parameter *param, unsigned int index)
Definition: preshader.c:663
static HRESULT get_ctab_constant_desc(ID3DXConstantTable *ctab, D3DXHANDLE hc, D3DXCONSTANT_DESC *desc, WORD *constantinfo_reserved)
Definition: preshader.c:539
unsigned int const_set_count
enum pres_reg_tables * regset2table
static HRESULT append_const_set(struct d3dx_const_tab *const_tab, struct d3dx_const_param_eval_output *set)
Definition: preshader.c:595
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31

Referenced by get_constants_desc().

◆ is_const_tab_input_dirty()

static BOOL is_const_tab_input_dirty ( struct d3dx_const_tab ctab,
ULONG64  update_version 
)
static

Definition at line 1702 of file preshader.c.

1703 {
1704  unsigned int i;
1705 
1706  if (update_version == ULONG64_MAX)
1707  update_version = ctab->update_version;
1708  for (i = 0; i < ctab->input_count; ++i)
1709  {
1711  update_version))
1712  return TRUE;
1713  }
1714  return FALSE;
1715 }
#define TRUE
Definition: types.h:120
struct d3dx_parameter ** inputs_param
static BOOL is_top_level_param_dirty(struct d3dx_top_level_parameter *param, ULONG64 update_version)
#define FALSE
Definition: types.h:117
unsigned int input_count
#define ULONG64_MAX
Definition: d3dx9_private.h:34
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static struct d3dx_top_level_parameter * top_level_parameter_from_parameter(struct d3dx_parameter *param)
ULONG64 update_version

Referenced by d3dx_evaluate_parameter(), d3dx_param_eval_set_shader_constants(), and is_param_eval_input_dirty().

◆ is_param_eval_input_dirty()

BOOL is_param_eval_input_dirty ( struct d3dx_param_eval peval,
ULONG64  update_version 
)

Definition at line 1717 of file preshader.c.

1718 {
1719  return is_const_tab_input_dirty(&peval->pres.inputs, update_version)
1720  || is_const_tab_input_dirty(&peval->shader_inputs, update_version);
1721 }
static BOOL is_const_tab_input_dirty(struct d3dx_const_tab *ctab, ULONG64 update_version)
Definition: preshader.c:1702
struct d3dx_const_tab shader_inputs
struct d3dx_preshader pres

Referenced by d3dx9_get_param_value_ptr().

◆ merge_const_set_entries()

static HRESULT merge_const_set_entries ( struct d3dx_const_tab const_tab,
struct d3dx_parameter param,
unsigned int  index 
)
static

Definition at line 663 of file preshader.c.

665 {
666  unsigned int i, start_index = index;
667  DWORD *current_data;
668  enum pres_reg_tables current_table;
669  unsigned int current_start_offset, element_count;
670  struct d3dx_const_param_eval_output *first_const;
671 
672  if (!const_tab->const_set_count)
673  return D3D_OK;
674 
675  while (index < const_tab->const_set_count - 1)
676  {
677  first_const = &const_tab->const_set[index];
678  current_data = first_const->param->data;
679  current_table = first_const->table;
680  current_start_offset = get_offset_reg(current_table, first_const->register_index);
681  element_count = 0;
682  for (i = index; i < const_tab->const_set_count; ++i)
683  {
684  struct d3dx_const_param_eval_output *const_set = &const_tab->const_set[i];
685  unsigned int count = get_offset_reg(const_set->table,
686  const_set->register_count * const_set->element_count);
687  unsigned int start_offset = get_offset_reg(const_set->table, const_set->register_index);
688 
689  if (!(const_set->table == current_table && current_start_offset == start_offset
690  && const_set->direct_copy == first_const->direct_copy
691  && current_data == const_set->param->data
692  && (const_set->direct_copy || (first_const->param->type == const_set->param->type
693  && first_const->param->class == const_set->param->class
694  && first_const->param->columns == const_set->param->columns
695  && first_const->param->rows == const_set->param->rows
696  && first_const->register_count == const_set->register_count
697  && (i == const_tab->const_set_count - 1
698  || first_const->param->element_count == const_set->param->element_count)))))
699  break;
700 
701  current_start_offset += count;
702  current_data += const_set->direct_copy ? count : const_set->param->rows
703  * const_set->param->columns * const_set->element_count;
704  element_count += const_set->element_count;
705  }
706 
707  if (i > index + 1)
708  {
709  TRACE("Merging %u child parameters for %s, not merging %u, direct_copy %#x.\n", i - index,
710  debugstr_a(param->name), const_tab->const_set_count - i, first_const->direct_copy);
711 
712  first_const->element_count = element_count;
713  if (first_const->direct_copy)
714  {
715  first_const->element_count = 1;
716  if (index == start_index
717  && !(param->type == D3DXPT_VOID && param->class == D3DXPC_STRUCT))
718  {
720  return D3DERR_INVALIDCALL;
721  first_const->param = param;
722  }
723  first_const->register_count = get_reg_offset(current_table, current_start_offset)
724  - first_const->register_index;
725  }
726  memmove(&const_tab->const_set[index + 1], &const_tab->const_set[i],
727  sizeof(*const_tab->const_set) * (const_tab->const_set_count - i));
728  const_tab->const_set_count -= i - index - 1;
729  }
730  else
731  {
732  TRACE("Not merging %u child parameters for %s, direct_copy %#x.\n",
733  const_tab->const_set_count - i, debugstr_a(param->name), first_const->direct_copy);
734  }
735  index = i;
736  }
737  return D3D_OK;
738 }
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
GLuint GLuint GLsizei count
Definition: gl.h:1545
enum pres_reg_tables table
#define D3DERR_INVALIDCALL
static enum pres_value_type table_type_from_param_type(D3DXPARAMETER_TYPE type)
Definition: preshader.c:280
struct d3dx_const_param_eval_output * const_set
static unsigned int get_reg_offset(unsigned int table, unsigned int offset)
Definition: preshader.c:296
GLuint index
Definition: glext.h:6031
#define TRACE(s)
Definition: solgame.cpp:4
static unsigned int get_offset_reg(unsigned int table, unsigned int reg_idx)
Definition: preshader.c:301
#define debugstr_a
Definition: kernel32.h:31
pres_reg_tables
GLfloat param
Definition: glext.h:5796
unsigned long DWORD
Definition: ntddk_ex.h:95
#define index(s, c)
Definition: various.h:29
#define D3D_OK
Definition: d3d.h:106
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
unsigned int const_set_count
struct d3dx_parameter * param

Referenced by init_set_constants_param().

◆ parse_pres_arg()

static unsigned int* parse_pres_arg ( unsigned int ptr,
unsigned int  count,
struct d3dx_pres_operand opr 
)
static

Definition at line 442 of file preshader.c.

443 {
444  if (count < 3 || (*ptr && count < 5))
445  {
446  WARN("Byte code buffer ends unexpectedly, count %u.\n", count);
447  return NULL;
448  }
449 
450  if (*ptr)
451  {
452  if (*ptr != 1)
453  {
454  FIXME("Unknown relative addressing flag, word %#x.\n", *ptr);
455  return NULL;
456  }
457  ptr = parse_pres_reg(ptr + 1, &opr->index_reg);
458  if (!ptr)
459  return NULL;
460  }
461  else
462  {
463  opr->index_reg.table = PRES_REGTAB_COUNT;
464  ++ptr;
465  }
466 
467  ptr = parse_pres_reg(ptr, &opr->reg);
468 
469  if (opr->reg.table == PRES_REGTAB_OBCONST)
470  opr->reg.offset /= 4;
471  return ptr;
472 }
static unsigned int * parse_pres_reg(unsigned int *ptr, struct d3dx_pres_reg *reg)
Definition: preshader.c:423
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define WARN(fmt,...)
Definition: debug.h:112
#define FIXME(fmt,...)
Definition: debug.h:111
static PVOID ptr
Definition: dispmode.c:27
struct d3dx_pres_reg reg
Definition: preshader.c:253
struct d3dx_pres_reg index_reg
Definition: preshader.c:254
#define NULL
Definition: types.h:112

Referenced by parse_pres_ins().

◆ parse_pres_ins()

static unsigned int* parse_pres_ins ( unsigned int ptr,
unsigned int  count,
struct d3dx_pres_ins ins 
)
static

Definition at line 474 of file preshader.c.

475 {
476  unsigned int ins_code, ins_raw;
477  unsigned int input_count;
478  unsigned int i;
479 
480  if (count < 2)
481  {
482  WARN("Byte code buffer ends unexpectedly.\n");
483  return NULL;
484  }
485 
486  ins_raw = *ptr++;
487  ins_code = (ins_raw & PRES_OPCODE_MASK) >> PRES_OPCODE_SHIFT;
488  ins->component_count = ins_raw & PRES_NCOMP_MASK;
489  ins->scalar_op = !!(ins_raw & PRES_SCALAR_FLAG);
490 
491  if (ins->component_count < 1 || ins->component_count > 4)
492  {
493  FIXME("Unsupported number of components %u.\n", ins->component_count);
494  return NULL;
495  }
496  input_count = *ptr++;
497  count -= 2;
498  for (i = 0; i < ARRAY_SIZE(pres_op_info); ++i)
499  if (ins_code == pres_op_info[i].opcode && input_count == pres_op_info[i].input_count)
500  break;
501  if (i == ARRAY_SIZE(pres_op_info))
502  {
503  FIXME("Unknown opcode %#x, input_count %u, raw %#x.\n", ins_code, input_count, ins_raw);
504  return NULL;
505  }
506  ins->op = i;
507  if (input_count > ARRAY_SIZE(ins->inputs))
508  {
509  FIXME("Actual input args count %u exceeds inputs array size, instruction %s.\n", input_count,
510  pres_op_info[i].mnem);
511  return NULL;
512  }
513  for (i = 0; i < input_count; ++i)
514  {
515  unsigned int *p;
516 
517  p = parse_pres_arg(ptr, count, &ins->inputs[i]);
518  if (!p)
519  return NULL;
520  count -= p - ptr;
521  ptr = p;
522  }
523  ptr = parse_pres_arg(ptr, count, &ins->output);
524  if (ins->output.index_reg.table != PRES_REGTAB_COUNT)
525  {
526  FIXME("Relative addressing in output register not supported.\n");
527  return NULL;
528  }
529  if (get_reg_offset(ins->output.reg.table, ins->output.reg.offset
530  + (pres_op_info[ins->op].func_all_comps ? 0 : ins->component_count - 1))
531  != get_reg_offset(ins->output.reg.table, ins->output.reg.offset))
532  {
533  FIXME("Instructions outputting multiple registers are not supported.\n");
534  return NULL;
535  }
536  return ptr;
537 }
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define WARN(fmt,...)
Definition: debug.h:112
#define PRES_NCOMP_MASK
Definition: preshader.c:151
static unsigned int * parse_pres_arg(unsigned int *ptr, unsigned int count, struct d3dx_pres_operand *opr)
Definition: preshader.c:442
BOOL scalar_op
Definition: preshader.c:264
static unsigned int get_reg_offset(unsigned int table, unsigned int offset)
Definition: preshader.c:296
enum pres_ops op
Definition: preshader.c:261
#define FIXME(fmt,...)
Definition: debug.h:111
static PVOID ptr
Definition: dispmode.c:27
static const struct op_info pres_op_info[]
Definition: preshader.c:168
unsigned int component_count
Definition: preshader.c:265
#define PRES_SCALAR_FLAG
Definition: preshader.c:150
struct d3dx_pres_operand output
Definition: preshader.c:267
#define PRES_OPCODE_SHIFT
Definition: preshader.c:149
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
#define PRES_OPCODE_MASK
Definition: preshader.c:148
#define ARRAY_SIZE(a)
Definition: main.h:24
#define NULL
Definition: types.h:112
GLfloat GLfloat p
Definition: glext.h:8902
struct d3dx_pres_operand inputs[MAX_INPUTS_COUNT]
Definition: preshader.c:266

Referenced by parse_preshader().

◆ parse_pres_reg()

static unsigned int* parse_pres_reg ( unsigned int ptr,
struct d3dx_pres_reg reg 
)
static

Definition at line 423 of file preshader.c.

424 {
425  static const enum pres_reg_tables reg_table[8] =
426  {
429  };
430 
431  if (*ptr >= ARRAY_SIZE(reg_table) || reg_table[*ptr] == PRES_REGTAB_COUNT)
432  {
433  FIXME("Unsupported register table %#x.\n", *ptr);
434  return NULL;
435  }
436 
437  reg->table = reg_table[*ptr++];
438  reg->offset = *ptr++;
439  return ptr;
440 }
#define FIXME(fmt,...)
Definition: debug.h:111
static PVOID ptr
Definition: dispmode.c:27
pres_reg_tables
static int reg
Definition: i386-dis.c:1283
#define ARRAY_SIZE(a)
Definition: main.h:24
#define NULL
Definition: types.h:112

Referenced by parse_pres_arg().

◆ parse_preshader()

static HRESULT parse_preshader ( struct d3dx_preshader pres,
unsigned int ptr,
unsigned int  count,
struct d3dx_effect effect 
)
static

Definition at line 1113 of file preshader.c.

1114 {
1115  unsigned int *p;
1116  unsigned int i, j, const_count;
1117  double *dconst;
1118  HRESULT hr;
1119  unsigned int saved_word;
1120  unsigned int section_size;
1121 
1122  TRACE("Preshader version %#x.\n", *ptr & 0xffff);
1123 
1124  if (!count)
1125  {
1126  WARN("Unexpected end of byte code buffer.\n");
1127  return D3DXERR_INVALIDDATA;
1128  }
1129 
1130  p = find_bytecode_comment(ptr + 1, count - 1, FOURCC_CLIT, &section_size);
1131  if (p)
1132  {
1133  const_count = *p++;
1134  if (const_count > (section_size - 1) / (sizeof(double) / sizeof(unsigned int)))
1135  {
1136  WARN("Byte code buffer ends unexpectedly.\n");
1137  return D3DXERR_INVALIDDATA;
1138  }
1139  dconst = (double *)p;
1140  }
1141  else
1142  {
1143  const_count = 0;
1144  dconst = NULL;
1145  }
1146  TRACE("%u double constants.\n", const_count);
1147 
1148  p = find_bytecode_comment(ptr + 1, count - 1, FOURCC_FXLC, &section_size);
1149  if (!p)
1150  {
1151  WARN("Could not find preshader code.\n");
1152  return D3D_OK;
1153  }
1154  pres->ins_count = *p++;
1155  --section_size;
1156  if (pres->ins_count > UINT_MAX / sizeof(*pres->ins))
1157  {
1158  WARN("Invalid instruction count %u.\n", pres->ins_count);
1159  return D3DXERR_INVALIDDATA;
1160  }
1161  TRACE("%u instructions.\n", pres->ins_count);
1162  pres->ins = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*pres->ins) * pres->ins_count);
1163  if (!pres->ins)
1164  return E_OUTOFMEMORY;
1165  for (i = 0; i < pres->ins_count; ++i)
1166  {
1167  unsigned int *ptr_next;
1168 
1169  ptr_next = parse_pres_ins(p, section_size, &pres->ins[i]);
1170  if (!ptr_next)
1171  return D3DXERR_INVALIDDATA;
1172  section_size -= ptr_next - p;
1173  p = ptr_next;
1174  }
1175 
1176  pres->inputs.regset2table = pres_regset2table;
1177 
1178  saved_word = *ptr;
1179  *ptr = 0xfffe0000;
1180  hr = get_constants_desc(ptr, &pres->inputs, effect, NULL, 0, NULL);
1181  *ptr = saved_word;
1182  if (FAILED(hr))
1183  return hr;
1184 
1185  if (const_count % get_reg_components(PRES_REGTAB_IMMED))
1186  {
1187  FIXME("const_count %u is not a multiple of %u.\n", const_count,
1189  return D3DXERR_INVALIDDATA;
1190  }
1191  pres->regs.table_sizes[PRES_REGTAB_IMMED] = get_reg_offset(PRES_REGTAB_IMMED, const_count);
1192 
1193  update_table_sizes_consts(pres->regs.table_sizes, &pres->inputs);
1194  for (i = 0; i < pres->ins_count; ++i)
1195  {
1196  for (j = 0; j < pres_op_info[pres->ins[i].op].input_count; ++j)
1197  {
1198  enum pres_reg_tables table;
1199  unsigned int reg_idx;
1200 
1201  if (pres->ins[i].inputs[j].index_reg.table == PRES_REGTAB_COUNT)
1202  {
1203  unsigned int last_component_index = pres->ins[i].scalar_op && !j ? 0
1204  : pres->ins[i].component_count - 1;
1205 
1206  table = pres->ins[i].inputs[j].reg.table;
1207  reg_idx = get_reg_offset(table, pres->ins[i].inputs[j].reg.offset
1208  + last_component_index);
1209  }
1210  else
1211  {
1212  table = pres->ins[i].inputs[j].index_reg.table;
1213  reg_idx = get_reg_offset(table, pres->ins[i].inputs[j].index_reg.offset);
1214  }
1215  if (reg_idx >= pres->regs.table_sizes[table])
1216  {
1217  /* Native accepts these broken preshaders. */
1218  FIXME("Out of bounds register index, i %u, j %u, table %u, reg_idx %u, preshader parsing failed.\n",
1219  i, j, table, reg_idx);
1220  return D3DXERR_INVALIDDATA;
1221  }
1222  }
1223  update_table_size(pres->regs.table_sizes, pres->ins[i].output.reg.table,
1224  get_reg_offset(pres->ins[i].output.reg.table, pres->ins[i].output.reg.offset));
1225  }
1227  return E_OUTOFMEMORY;
1228  regstore_set_values(&pres->regs, PRES_REGTAB_IMMED, dconst, 0, const_count);
1229 
1230  return D3D_OK;
1231 }
HRESULT hr
Definition: shlfolder.c:183
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define WARN(fmt,...)
Definition: debug.h:112
static enum pres_reg_tables pres_regset2table[]
Definition: preshader.c:227
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644
static unsigned int get_reg_offset(unsigned int table, unsigned int offset)
Definition: preshader.c:296
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static void regstore_set_values(struct d3dx_regstore *rs, unsigned int table, const void *data, unsigned int start_offset, unsigned int count)
Definition: preshader.c:337
#define FIXME(fmt,...)
Definition: debug.h:111
static PVOID ptr
Definition: dispmode.c:27
static unsigned int get_reg_components(unsigned int table)
Definition: preshader.c:306
static void update_table_size(unsigned int *table_sizes, unsigned int table, unsigned int max_register)
Definition: preshader.c:1009
static const struct op_info pres_op_info[]
Definition: preshader.c:168
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
#define FOURCC_FXLC
Definition: preshader.c:155
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
LONG HRESULT
Definition: typedefs.h:79
pres_reg_tables
#define FOURCC_CLIT
Definition: preshader.c:154
unsigned int ins_count
static HRESULT get_constants_desc(unsigned int *byte_code, struct d3dx_const_tab *out, struct d3dx_effect *effect, const char **skip_constants, unsigned int skip_constants_count, struct d3dx_preshader *pres)
Definition: preshader.c:862
#define UINT_MAX
Definition: limits.h:41
#define D3D_OK
Definition: d3d.h:106
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static HRESULT regstore_alloc_table(struct d3dx_regstore *rs, unsigned int table)
Definition: preshader.c:313
#define NULL
Definition: types.h:112
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
struct d3dx_pres_ins * ins
static void update_table_sizes_consts(unsigned int *table_sizes, struct d3dx_const_tab *ctab)
Definition: preshader.c:1015
struct d3dx_regstore regs
struct d3dx_const_tab inputs
GLfloat GLfloat p
Definition: glext.h:8902
static unsigned int * parse_pres_ins(unsigned int *ptr, unsigned int count, struct d3dx_pres_ins *ins)
Definition: preshader.c:474
static unsigned int * find_bytecode_comment(unsigned int *ptr, unsigned int count, unsigned int fourcc, unsigned int *size)
Definition: preshader.c:401

Referenced by d3dx_create_param_eval().

◆ pres_acos()

static double pres_acos ( double args,
int  n 
)
static

Definition at line 140 of file preshader.c.

140 {return to_signed_nan(acos(args[0]));}
static double to_signed_nan(double v)
Definition: preshader.c:69
Definition: match.c:390
valarray< _Tp > acos(const valarray< _Tp > &__x)
Definition: _valarray.h:901

◆ pres_add()

static double pres_add ( double args,
int  n 
)
static

Definition at line 85 of file preshader.c.

85 {return args[0] + args[1];}
Definition: match.c:390

◆ pres_asin()

static double pres_asin ( double args,
int  n 
)
static

Definition at line 139 of file preshader.c.

139 {return to_signed_nan(asin(args[0]));}
static double to_signed_nan(double v)
Definition: preshader.c:69
Definition: match.c:390
valarray< _Tp > asin(const valarray< _Tp > &__x)
Definition: _valarray.h:910

◆ pres_atan()

static double pres_atan ( double args,
int  n 
)
static

Definition at line 141 of file preshader.c.

141 {return atan(args[0]);}
Definition: match.c:390
valarray< _Tp > atan(const valarray< _Tp > &__x)
Definition: _valarray.h:919

◆ pres_atan2()

static double pres_atan2 ( double args,
int  n 
)
static

Definition at line 142 of file preshader.c.

142 {return atan2(args[0], args[1]);}
valarray< _Tp > atan2(const valarray< _Tp > &__x, const valarray< _Tp > &__y)
Definition: _valarray.h:928
Definition: match.c:390

◆ pres_bool_from_value()

static void pres_bool_from_value ( void out,
const void in,
unsigned int  count 
)
static

Definition at line 1380 of file preshader.c.

1381 {
1382  unsigned int i;
1383  const DWORD *in_dword = in;
1384  BOOL *out_bool = out;
1385 
1386  for (i = 0; i < count; ++i)
1387  out_bool[i] = !!in_dword[i];
1388 }
GLuint GLuint GLsizei count
Definition: gl.h:1545
unsigned int BOOL
Definition: ntddk_ex.h:94
static FILE * out
Definition: regtests2xml.c:44
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint in
Definition: glext.h:9616
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

Referenced by regstore_set_data().

◆ pres_cmp()

static double pres_cmp ( double args,
int  n 
)
static

Definition at line 115 of file preshader.c.

115 {return args[0] >= 0.0 ? args[1] : args[2];}
Definition: match.c:390

◆ pres_cos()

static double pres_cos ( double args,
int  n 
)
static

Definition at line 117 of file preshader.c.

117 {return cos(args[0]);}
Definition: match.c:390
_STLP_DECLSPEC complex< float > _STLP_CALL cos(const complex< float > &)

◆ pres_div()

static double pres_div ( double args,
int  n 
)
static

Definition at line 146 of file preshader.c.

146 {return 0.0;}

◆ pres_dot()

static double pres_dot ( double args,
int  n 
)
static

Definition at line 87 of file preshader.c.

88 {
89  int i;
90  double sum;
91 
92  sum = 0.0;
93  for (i = 0; i < n; ++i)
94  sum += args[i] * args[i + n];
95  return sum;
96 }
GLdouble n
Definition: glext.h:7729
Definition: match.c:390
static int sum(int x_, int y_)
Definition: ptr2_test.cpp:35
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

Referenced by pres_dotswiz6(), and pres_dotswiz8().

◆ pres_dotswiz6()

static double pres_dotswiz6 ( double args,
int  n 
)
static

Definition at line 98 of file preshader.c.

99 {
100  return pres_dot(args, 3);
101 }
Definition: match.c:390
static double pres_dot(double *args, int n)
Definition: preshader.c:87

◆ pres_dotswiz8()

static double pres_dotswiz8 ( double args,
int  n 
)
static

Definition at line 103 of file preshader.c.

104 {
105  return pres_dot(args, 4);
106 }
Definition: match.c:390
static double pres_dot(double *args, int n)
Definition: preshader.c:87

◆ pres_exp()

static double pres_exp ( double args,
int  n 
)
static

Definition at line 128 of file preshader.c.

128 {return pow(2.0, args[0]);}
Definition: match.c:390
float pow(float __x, int __y)
Definition: _cmath.h:458

◆ pres_float_from_bool()

static void pres_float_from_bool ( void out,
const void in,
unsigned int  count 
)
static

Definition at line 1400 of file preshader.c.

1401 {
1402  unsigned int i;
1403  const BOOL *in_bool = in;
1404  float *out_float = out;
1405 
1406  for (i = 0; i < count; ++i)
1407  out_float[i] = !!in_bool[i];
1408 }
GLuint GLuint GLsizei count
Definition: gl.h:1545
unsigned int BOOL
Definition: ntddk_ex.h:94
static FILE * out
Definition: regtests2xml.c:44
GLuint in
Definition: glext.h:9616
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

Referenced by regstore_set_data().

◆ pres_float_from_int()

static void pres_float_from_int ( void out,
const void in,
unsigned int  count 
)
static

Definition at line 1390 of file preshader.c.

1391 {
1392  unsigned int i;
1393  const int *in_int = in;
1394  float *out_float = out;
1395 
1396  for (i = 0; i < count; ++i)
1397  out_float[i] = in_int[i];
1398 }
GLuint GLuint GLsizei count
Definition: gl.h:1545
static FILE * out
Definition: regtests2xml.c:44
GLuint in
Definition: glext.h:9616
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

Referenced by regstore_set_data().

◆ pres_frc()

static double pres_frc ( double args,
int  n 
)
static

Definition at line 112 of file preshader.c.

112 {return args[0] - floor(args[0]);}
Definition: match.c:390
_Check_return_ _CRTIMP double __cdecl floor(_In_ double x)

◆ pres_ge()

static double pres_ge ( double args,
int  n 
)
static

Definition at line 111 of file preshader.c.

111 {return args[0] >= args[1] ? 1.0 : 0.0;}
Definition: match.c:390

◆ pres_int_from_bool()

static void pres_int_from_bool ( void out,
const void in,
unsigned int  count 
)
static

Definition at line 1410 of file preshader.c.

1411 {
1412  unsigned int i;
1413  const float *in_bool = in;
1414  int *out_int = out;
1415 
1416  for (i = 0; i < count; ++i)
1417  out_int[i] = !!in_bool[i];
1418 }
GLuint GLuint GLsizei count
Definition: gl.h:1545
static FILE * out
Definition: regtests2xml.c:44
GLuint in
Definition: glext.h:9616
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

Referenced by regstore_set_data().

◆ pres_int_from_float()

static void pres_int_from_float ( void out,
const void in,
unsigned int  count 
)
static

Definition at line 1370 of file preshader.c.

1371 {
1372  unsigned int i;
1373  const float *in_float = in;
1374  int *out_int = out;
1375 
1376  for (i = 0; i < count; ++i)
1377  out_int[i] = in_float[i];
1378 }
GLuint GLuint GLsizei count
Definition: gl.h:1545
static FILE * out
Definition: regtests2xml.c:44
GLuint in
Definition: glext.h:9616
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

Referenced by regstore_set_data().

◆ pres_log()

static double pres_log ( double args,
int  n 
)
static

Definition at line 129 of file preshader.c.

130 {
131  double v;
132 
133  v = fabs(args[0]);
134  if (v == 0.0)
135  return 0.0;
136  else
137  return log2(v);
138 }
Definition: match.c:390
_Check_return_ __CRT_INLINE double log2(_In_ double x)
Definition: math.h:273
_Check_return_ _CRT_JIT_INTRINSIC double __cdecl fabs(_In_ double x)
const GLdouble * v
Definition: gl.h:2040

◆ pres_lt()

static double pres_lt ( double args,
int  n 
)
static

Definition at line 110 of file preshader.c.

110 {return args[0] < args[1] ? 1.0 : 0.0;}
Definition: match.c:390

◆ pres_max()

static double pres_max ( double args,
int  n 
)
static

Definition at line 114 of file preshader.c.

114 {return fmax(args[0], args[1]);}
Definition: match.c:390
double __cdecl fmax(double, double)

◆ pres_min()

static double pres_min ( double args,
int  n 
)
static

Definition at line 113 of file preshader.c.

113 {return fmin(args[0], args[1]);}
Definition: match.c:390
double __cdecl fmin(double, double)

◆ pres_mov()

static double pres_mov ( double args,
int  n 
)
static

Definition at line 84 of file preshader.c.

84 {return args[0];}
Definition: match.c:390

◆ pres_mul()

static double pres_mul ( double args,
int  n 
)
static

Definition at line 86 of file preshader.c.

86 {return args[0] * args[1];}
Definition: match.c:390

◆ pres_neg()

static double pres_neg ( double args,
int  n 
)
static

Definition at line 108 of file preshader.c.

108 {return -args[0];}
Definition: match.c:390

◆ pres_rcp()

static double pres_rcp ( double args,
int  n 
)
static

Definition at line 109 of file preshader.c.

109 {return 1.0 / args[0];}
Definition: match.c:390

◆ pres_rsq()

static double pres_rsq ( double args,
int  n 
)
static

Definition at line 118 of file preshader.c.

119 {
120  double v;
121 
122  v = fabs(args[0]);
123  if (v == 0.0)
124  return INFINITY;
125  else
126  return 1.0 / sqrt(v);
127 }
_STLP_DECLSPEC complex< float > _STLP_CALL sqrt(const complex< float > &)
Definition: complex.cpp:188
Definition: match.c:390
_Check_return_ _CRT_JIT_INTRINSIC double __cdecl fabs(_In_ double x)
const GLdouble * v
Definition: gl.h:2040
#define INFINITY
Definition: misc.c:36

◆ pres_sin()

static double pres_sin ( double args,
int  n 
)
static

Definition at line 116 of file preshader.c.

116 {return sin(args[0]);}
Definition: match.c:390
_STLP_DECLSPEC complex< float > _STLP_CALL sin(const complex< float > &)

◆ regstore_alloc_table()

static HRESULT regstore_alloc_table ( struct d3dx_regstore rs,
unsigned int  table 
)
static

Definition at line 313 of file preshader.c.

314 {
315  unsigned int size;
316 
317  size = get_offset_reg(table, rs->table_sizes[table]) * table_info[table].component_size;
318  if (size)
319  {
321  if (!rs->tables[table])
322  return E_OUTOFMEMORY;
323  }
324  return D3D_OK;
325 }
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
unsigned int table_sizes[PRES_REGTAB_COUNT]
static unsigned int get_offset_reg(unsigned int table, unsigned int reg_idx)
Definition: preshader.c:301
GLsizeiptr size
Definition: glext.h:5919
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
static const struct @234 table_info[]
void * tables[PRES_REGTAB_COUNT]
#define D3D_OK
Definition: d3d.h:106
#define HEAP_ZERO_MEMORY
Definition: compat.h:134

Referenced by d3dx_create_param_eval(), and parse_preshader().

◆ regstore_free_tables()

static void regstore_free_tables ( struct d3dx_regstore rs)
static

Definition at line 327 of file preshader.c.

328 {
329  unsigned int i;
330 
331  for (i = 0; i < PRES_REGTAB_COUNT; ++i)
332  {
333  HeapFree(GetProcessHeap(), 0, rs->tables[i]);
334  }
335 }
#define GetProcessHeap()
Definition: compat.h:595
void * tables[PRES_REGTAB_COUNT]
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
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by d3dx_free_preshader().

◆ regstore_get_double()

static double regstore_get_double ( struct d3dx_regstore rs,
unsigned int  table,
unsigned int  offset 
)
static

Definition at line 350 of file preshader.c.

351 {
352  BYTE *p;
353 
354  p = (BYTE *)rs->tables[table] + table_info[table].component_size * offset;
356  {
357  case PRES_VT_FLOAT:
358  return *(float *)p;
359  case PRES_VT_DOUBLE:
360  return *(double *)p;
361  default:
362  FIXME("Unexpected preshader input from table %u.\n", table);
363  return NAN;
364  }
365 }
#define FIXME(fmt,...)
Definition: debug.h:111
switch(r->id)
Definition: btrfs.c:2980
#define NAN
Definition: mesh.c:39
static const struct @234 table_info[]
GLintptr offset
Definition: glext.h:5920
void * tables[PRES_REGTAB_COUNT]
unsigned char BYTE
Definition: xxhash.c:193
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLfloat GLfloat p
Definition: glext.h:8902

Referenced by exec_get_reg_value().

◆ regstore_set_data()

static void regstore_set_data ( struct d3dx_regstore rs,
unsigned int  table,
unsigned int  offset,
const unsigned int in,
unsigned int  count,
enum pres_value_type  param_type 
)
static

Definition at line 1420 of file preshader.c.

1422 {
1423  typedef void (*conv_func)(void *out, const void *in, unsigned int count);
1424  static const conv_func set_const_funcs[PRES_VT_COUNT][PRES_VT_COUNT] =
1425  {
1427  {NULL, NULL, NULL, NULL},
1430  };
1431  enum pres_value_type table_type = table_info[table].type;
1432 
1433  if (param_type == table_type)
1434  {
1436  return;
1437  }
1438 
1439  set_const_funcs[param_type][table_type]((unsigned int *)rs->tables[table] + offset, in, count);
1440 }
static void pres_int_from_float(void *out, const void *in, unsigned int count)
Definition: preshader.c:1370
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644
static void pres_int_from_bool(void *out, const void *in, unsigned int count)
Definition: preshader.c:1410
static void pres_bool_from_value(void *out, const void *in, unsigned int count)
Definition: preshader.c:1380
pres_value_type
Definition: preshader.c:197
static void regstore_set_values(struct d3dx_regstore *rs, unsigned int table, const void *data, unsigned int start_offset, unsigned int count)
Definition: preshader.c:337
static const struct @234 table_info[]
GLintptr offset
Definition: glext.h:5920
static FILE * out
Definition: regtests2xml.c:44
void * tables[PRES_REGTAB_COUNT]
GLuint in
Definition: glext.h:9616
#define NULL
Definition: types.h:112
static void pres_float_from_bool(void *out, const void *in, unsigned int count)
Definition: preshader.c:1400
static void pres_float_from_int(void *out, const void *in, unsigned int count)
Definition: preshader.c:1390

Referenced by set_constants().

◆ regstore_set_double()

static void regstore_set_double ( struct d3dx_regstore rs,
unsigned int  table,
unsigned int  offset,
double  v 
)
static

Definition at line 367 of file preshader.c.

368 {
369  BYTE *p;
370 
371  p = (BYTE *)rs->tables[table] + table_info[table].component_size * offset;
373  {
374  case PRES_VT_FLOAT : *(float *)p = v; break;
375  case PRES_VT_DOUBLE: *(double *)p = v; break;
376  case PRES_VT_INT : *(int *)p = lrint(v); break;
377  case PRES_VT_BOOL : *(BOOL *)p = !!v; break;
378  default:
379  FIXME("Bad type %u.\n", table_info[table].type);
380  break;
381  }
382 }
_Check_return_ __CRT_INLINE long lrint(_In_ double x)
Definition: math.h:267
unsigned int BOOL
Definition: ntddk_ex.h:94
#define FIXME(fmt,...)
Definition: debug.h:111
switch(r->id)
Definition: btrfs.c:2980
static const struct @234 table_info[]
GLintptr offset
Definition: glext.h:5920
void * tables[PRES_REGTAB_COUNT]
unsigned char BYTE
Definition: xxhash.c:193
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLfloat GLfloat p
Definition: glext.h:8902

Referenced by exec_set_arg().

◆ regstore_set_values()

static void regstore_set_values ( struct d3dx_regstore rs,
unsigned int  table,
const void data,
unsigned int  start_offset,
unsigned int  count 
)
static

Definition at line 337 of file preshader.c.

339 {
340  BYTE *dst = rs->tables[table];
341  const BYTE *src = data;
342  unsigned int size;
343 
344  dst += start_offset * table_info[table].component_size;
345  size = count * table_info[table].component_size;
346  assert((src < dst && size <= dst - src) || (src > dst && size <= src - dst));
347  memcpy(dst, src, size);
348 }
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define assert(x)
Definition: debug.h:53
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644
GLsizeiptr size
Definition: glext.h:5919
static const struct @234 table_info[]
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
void * tables[PRES_REGTAB_COUNT]
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum src
Definition: glext.h:6340
unsigned char BYTE
Definition: xxhash.c:193
GLenum GLenum dst
Definition: glext.h:6340

Referenced by parse_preshader(), regstore_set_data(), and set_constants().

◆ set_constants()

static HRESULT set_constants ( struct d3dx_regstore rs,
struct d3dx_const_tab const_tab,
ULONG64  new_update_version,
ID3DXEffectStateManager *  manager,
struct IDirect3DDevice9 *  device,
D3DXPARAMETER_TYPE  type,
BOOL  device_update_all,
BOOL  pres_dirty 
)
static

Definition at line 1483 of file preshader.c.

1486 {
1487  unsigned int const_idx;
1488  unsigned int current_start = 0, current_count = 0;
1489  enum pres_reg_tables current_table = PRES_REGTAB_COUNT;
1490  BOOL update_device = manager || device;
1491  HRESULT hr, result = D3D_OK;
1492  ULONG64 update_version = const_tab->update_version;
1493 
1494  for (const_idx = 0; const_idx < const_tab->const_set_count; ++const_idx)
1495  {
1496  struct d3dx_const_param_eval_output *const_set = &const_tab->const_set[const_idx];
1497  enum pres_reg_tables table = const_set->table;
1498  struct d3dx_parameter *param = const_set->param;
1499  unsigned int element, i, j, start_offset;
1500  struct const_upload_info info;
1501  unsigned int *data;
1502  enum pres_value_type param_type;
1503 
1504  if (!(param && is_param_dirty(param, update_version)))
1505  continue;
1506 
1507  data = param->data;
1508  start_offset = get_offset_reg(table, const_set->register_index);
1509  if (const_set->direct_copy)
1510  {
1511  regstore_set_values(rs, table, data, start_offset,
1512  get_offset_reg(table, const_set->register_count));
1513  continue;
1514  }
1515  param_type = table_type_from_param_type(param->type);
1516  if (const_set->constant_class == D3DXPC_SCALAR || const_set->constant_class == D3DXPC_VECTOR)
1517  {
1518  unsigned int count = max(param->rows, param->columns);
1519 
1520  if (count >= get_reg_components(table))
1521  {
1522  regstore_set_data(rs, table, start_offset, data,
1523  count * const_set->element_count, param_type);
1524  }
1525  else
1526  {
1527  for (element = 0; element < const_set->element_count; ++element)
1528  regstore_set_data(rs, table, start_offset + get_offset_reg(table, element),
1529  &data[element * count], count, param_type);
1530  }
1531  continue;
1532  }
1533  get_const_upload_info(const_set, &info);
1534  for (element = 0; element < const_set->element_count; ++element)
1535  {
1536  unsigned int *out = (unsigned int *)rs->tables[table] + start_offset;
1537 
1538  /* Store reshaped but (possibly) not converted yet data temporarily in the same constants buffer.
1539  * All the supported types of parameters and table values have the same size. */
1540  if (info.transpose)
1541  {
1542  for (i = 0; i < info.major_count; ++i)
1543  for (j = 0; j < info.minor; ++j)
1544  out[i * info.major_stride + j] = data[i + j * info.major];
1545 
1546  for (j = 0; j < info.minor_remainder; ++j)
1547  out[i * info.major_stride + j] = data[i + j * info.major];
1548  }
1549  else
1550  {
1551  for (i = 0; i < info.major_count; ++i)
1552  for (j = 0; j < info.minor; ++j)
1553  out[i * info.major_stride + j] = data[i * info.minor + j];
1554  }
1555  start_offset += get_offset_reg(table, const_set->register_count);
1556  data += param->rows * param->columns;
1557  }
1558  start_offset = get_offset_reg(table, const_set->register_index);
1559  if (table_info[table].type != param_type)
1560  regstore_set_data(rs, table, start_offset, (unsigned int *)rs->tables[table] + start_offset,
1561  get_offset_reg(table, const_set->register_count) * const_set->element_count, param_type);
1562  }
1563  const_tab->update_version = new_update_version;
1564  if (!update_device)
1565  return D3D_OK;
1566 
1567  for (const_idx = 0; const_idx < const_tab->const_set_count; ++const_idx)
1568  {
1569  struct d3dx_const_param_eval_output *const_set = &const_tab->const_set[const_idx];
1570 
1571  if (device_update_all || (const_set->param
1572  ? is_param_dirty(const_set->param, update_version) : pres_dirty))
1573  {
1574  enum pres_reg_tables table = const_set->table;
1575 
1576  if (table == current_table && current_start + current_count == const_set->register_index)
1577  {
1578  current_count += const_set->register_count * const_set->element_count;
1579  }
1580  else
1581  {
1582  if (current_count)
1583  {
1584  if (FAILED(hr = set_constants_device(manager, device, type, current_table,
1585  (DWORD *)rs->tables[current_table]
1586  + get_offset_reg(current_table, current_start), current_start, current_count)))
1587  result = hr;
1588  }
1589  current_table = table;
1590  current_start = const_set->register_index;
1591  current_count = const_set->register_count * const_set->element_count;
1592  }
1593  }
1594  }
1595  if (current_count)
1596  {
1597  if (FAILED(hr = set_constants_device(manager, device, type, current_table,
1598  (DWORD *)rs->tables[current_table]
1599  + get_offset_reg(current_table, current_start), current_start, current_count)))
1600  result = hr;
1601  }
1602  return result;
1603 }
#define max(a, b)
Definition: svc.c:63
HRESULT hr
Definition: shlfolder.c:183
GLuint64EXT * result
Definition: glext.h:11304
GLuint GLuint GLsizei count
Definition: gl.h:1545
enum pres_reg_tables table
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644
static HRESULT set_constants_device(ID3DXEffectStateManager *manager, struct IDirect3DDevice9 *device, D3DXPARAMETER_TYPE type, enum pres_reg_tables table, void *ptr, unsigned int start, unsigned int count)
Definition: preshader.c:1442
if(dx==0 &&dy==0)
Definition: linetemp.h:174
static enum pres_value_type table_type_from_param_type(D3DXPARAMETER_TYPE type)
Definition: preshader.c:280
struct d3dx_const_param_eval_output * const_set
pres_value_type
Definition: preshader.c:197
FxDevice * device
unsigned int BOOL
Definition: ntddk_ex.h:94
Definition: devices.h:37
static void regstore_set_values(struct d3dx_regstore *rs, unsigned int table, const void *data, unsigned int start_offset, unsigned int count)
Definition: preshader.c:337
static unsigned int get_reg_components(unsigned int table)
Definition: preshader.c:306
static void get_const_upload_info(struct d3dx_const_param_eval_output *const_set, struct const_upload_info *info)
Definition: preshader.c:557
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
static unsigned int get_offset_reg(unsigned int table, unsigned int reg_idx)
Definition: preshader.c:301
static const struct @234 table_info[]
LONG HRESULT
Definition: typedefs.h:79
pres_reg_tables
GLfloat param
Definition: glext.h:5796
static void regstore_set_data(struct d3dx_regstore *rs, unsigned int table, unsigned int offset, const unsigned int *in, unsigned int count, enum pres_value_type param_type)
Definition: preshader.c:1420
static FILE * out
Definition: regtests2xml.c:44
#define for
Definition: utility.h:88
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
static BOOL is_param_dirty(struct d3dx_parameter *param, ULONG64 update_version)
unsigned __int64 ULONG64
Definition: imports.h:198
void * tables[PRES_REGTAB_COUNT]
enum D3DXPARAMETER_CLASS constant_class
#define D3D_OK
Definition: d3d.h:106
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
ULONG64 update_version
unsigned int const_set_count
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
struct d3dx_parameter * param

Referenced by d3dx_evaluate_parameter(), and d3dx_param_eval_set_shader_constants().

◆ set_constants_device()

static HRESULT set_constants_device ( ID3DXEffectStateManager *  manager,
struct IDirect3DDevice9 *  device,
D3DXPARAMETER_TYPE  type,
enum pres_reg_tables  table,
void ptr,
unsigned int  start,
unsigned int  count 
)
static

Definition at line 1442 of file preshader.c.

1445 {
1446  if (type == D3DXPT_VERTEXSHADER)
1447  {
1448  switch(table)
1449  {
1450  case PRES_REGTAB_OCONST:
1451  return SET_D3D_STATE_(manager, device, SetVertexShaderConstantF, start, ptr, count);
1452  case PRES_REGTAB_OICONST:
1453  return SET_D3D_STATE_(manager, device, SetVertexShaderConstantI, start, ptr, count);
1454  case PRES_REGTAB_OBCONST:
1455  return SET_D3D_STATE_(manager, device, SetVertexShaderConstantB, start, ptr, count);
1456  default:
1457  FIXME("Unexpected register table %u.\n", table);
1458  return D3DERR_INVALIDCALL;
1459  }
1460  }
1461  else if (type == D3DXPT_PIXELSHADER)
1462  {
1463  switch(table)
1464  {
1465  case PRES_REGTAB_OCONST:
1466  return SET_D3D_STATE_(manager, device, SetPixelShaderConstantF, start, ptr, count);
1467  case PRES_REGTAB_OICONST:
1468  return SET_D3D_STATE_(manager, device, SetPixelShaderConstantI, start, ptr, count);
1469  case PRES_REGTAB_OBCONST:
1470  return SET_D3D_STATE_(manager, device, SetPixelShaderConstantB, start, ptr, count);
1471  default:
1472  FIXME("Unexpected register table %u.\n", table);
1473  return D3DERR_INVALIDCALL;
1474  }
1475  }
1476  else
1477  {
1478  FIXME("Unexpected parameter type %u.\n", type);
1479  return D3DERR_INVALIDCALL;
1480  }
1481 }
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define D3DERR_INVALIDCALL
Definition: devices.h:37
#define FIXME(fmt,...)
Definition: debug.h:111
static PVOID ptr
Definition: dispmode.c:27
GLuint start
Definition: gl.h:1545
#define SET_D3D_STATE_(manager, device, method, args...)
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545

Referenced by set_constants().

◆ table_type_from_param_type()

static enum pres_value_type table_type_from_param_type ( D3DXPARAMETER_TYPE  type)
static

Definition at line 280 of file preshader.c.

281 {
282  switch (type)
283  {
284  case D3DXPT_FLOAT:
285  return PRES_VT_FLOAT;
286  case D3DXPT_INT:
287  return PRES_VT_INT;
288  case D3DXPT_BOOL:
289  return PRES_VT_BOOL;
290  default:
291  FIXME("Unsupported type %u.\n", type);
292  return PRES_VT_COUNT;
293  }
294 }
#define FIXME(fmt,...)
Definition: debug.h:111
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545

Referenced by init_set_constants_param(), merge_const_set_entries(), and set_constants().

◆ to_signed_nan()

static double to_signed_nan ( double  v)
static

Definition at line 69 of file preshader.c.

70 {
71  static const union
72  {
73  ULONG64 ulong64_value;
74  double double_value;
75  }
76  signed_nan =
77  {
78  0xfff8000000000000
79  };
80 
81  return isnan(v) ? signed_nan.double_value : v;
82 }
unsigned __int64 ULONG64
Definition: imports.h:198
int isnan(double x)
const GLdouble * v
Definition: gl.h:2040

Referenced by pres_acos(), and pres_asin().

◆ update_table_size()

static void update_table_size ( unsigned int table_sizes,
unsigned int  table,
unsigned int  max_register 
)
static

Definition at line 1009 of file preshader.c.

1010 {
1011  if (table < PRES_REGTAB_COUNT)
1012  table_sizes[table] = max(table_sizes[table], max_register + 1);
1013 }
#define max(a, b)
Definition: svc.c:63
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644

Referenced by parse_preshader(), and update_table_sizes_consts().

◆ update_table_sizes_consts()

static void update_table_sizes_consts ( unsigned int table_sizes,
struct d3dx_const_tab ctab 
)
static

Definition at line 1015 of file preshader.c.

1016 {
1017  unsigned int i, table, max_register;
1018 
1019  for (i = 0; i < ctab->input_count; ++i)
1020  {
1021  if (!ctab->inputs[i].RegisterCount)
1022  continue;
1023  max_register = ctab->inputs[i].RegisterIndex + ctab->inputs[i].RegisterCount - 1;
1024  table = ctab->regset2table[ctab->inputs[i].RegisterSet];
1025  update_table_size(table_sizes, table, max_register);
1026  }
1027 }
D3DXCONSTANT_DESC * inputs
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644
static void update_table_size(unsigned int *table_sizes, unsigned int table, unsigned int max_register)
Definition: preshader.c:1009
D3DXREGISTER_SET RegisterSet
Definition: d3dx9shader.h:106
unsigned int input_count
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
enum pres_reg_tables * regset2table

Referenced by d3dx_create_param_eval(), and parse_preshader().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( d3dx  )

Variable Documentation

◆ component_size

unsigned int component_size

Definition at line 208 of file preshader.c.

◆ pres_op_info

const struct op_info pres_op_info[]
static
Initial value:
=
{
{0x000, "nop", 0, 0, NULL },
{0x100, "mov", 1, 0, pres_mov},
{0x101, "neg", 1, 0, pres_neg},
{0x103, "rcp", 1, 0, pres_rcp},
{0x104, "frc", 1, 0, pres_frc},
{0x105, "exp", 1, 0, pres_exp},
{0x106, "log", 1, 0, pres_log},
{0x107, "rsq", 1, 0, pres_rsq},
{0x108, "sin", 1, 0, pres_sin},
{0x109, "cos", 1, 0, pres_cos},
{0x10a, "asin", 1, 0, pres_asin},
{0x10b, "acos", 1, 0, pres_acos},
{0x10c, "atan", 1, 0, pres_atan},
{0x200, "min", 2, 0, pres_min},
{0x201, "max", 2, 0, pres_max},
{0x202, "lt", 2, 0, pres_lt },
{0x203, "ge", 2, 0, pres_ge },
{0x204, "add", 2, 0, pres_add},
{0x205, "mul", 2, 0, pres_mul},
{0x206, "atan2", 2, 0, pres_atan2},
{0x208, "div", 2, 0, pres_div},
{0x300, "cmp", 3, 0, pres_cmp},
{0x500, "dot", 2, 1, pres_dot},
{0x70e, "d3ds_dotswiz", 6, 0, pres_dotswiz6},
{0x70e, "d3ds_dotswiz", 8, 0, pres_dotswiz8},
}
static double pres_log(double *args, int n)
Definition: preshader.c:129
static double pres_asin(double *args, int n)
Definition: preshader.c:139
static double pres_dotswiz6(double *args, int n)
Definition: preshader.c:98
static double pres_ge(double *args, int n)
Definition: preshader.c:111
static double pres_add(double *args, int n)
Definition: preshader.c:85
static double pres_exp(double *args, int n)
Definition: preshader.c:128
static double pres_min(double *args, int n)
Definition: preshader.c:113
static double pres_rcp(double *args, int n)
Definition: preshader.c:109
static double pres_acos(double *args, int n)
Definition: preshader.c:140
static double pres_frc(double *args, int n)
Definition: preshader.c:112
static double pres_lt(double *args, int n)
Definition: preshader.c:110
static double pres_neg(double *args, int n)
Definition: preshader.c:108
static double pres_mul(double *args, int n)
Definition: preshader.c:86
static double pres_max(double *args, int n)
Definition: preshader.c:114
static double pres_atan(double *args, int n)
Definition: preshader.c:141
static double pres_atan2(double *args, int n)
Definition: preshader.c:142
static double pres_cmp(double *args, int n)
Definition: preshader.c:115
static double pres_dotswiz8(double *args, int n)
Definition: preshader.c:103
static double pres_rsq(double *args, int n)
Definition: preshader.c:118
#define NULL
Definition: types.h:112
static double pres_cos(double *args, int n)
Definition: preshader.c:117
static double pres_mov(double *args, int n)
Definition: preshader.c:84
static double pres_sin(double *args, int n)
Definition: preshader.c:116
static double pres_dot(double *args, int n)
Definition: preshader.c:87
static double pres_div(double *args, int n)
Definition: preshader.c:146

Definition at line 168 of file preshader.c.

Referenced by dump_ins(), execute_preshader(), parse_pres_ins(), and parse_preshader().

◆ pres_regset2table

◆ shad_regset2table

◆ table_info

const { ... } table_info[]
Initial value:
=
{
{sizeof(double), PRES_VT_DOUBLE},
{sizeof(float), PRES_VT_FLOAT },
{sizeof(float), PRES_VT_FLOAT },
{sizeof(BOOL), PRES_VT_BOOL },
{sizeof(int), PRES_VT_INT, },
{sizeof(float), PRES_VT_FLOAT }
}
#define BOOL
Definition: nt_native.h:43
static const char mbstate_t *static wchar_t const char mbstate_t *static const wchar_t int *static double
Definition: string.c:80
static float(__cdecl *square_half_float)(float x
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31

Referenced by FT_DEFINE_SERVICE(), init_set_constants_param(), regstore_alloc_table(), regstore_get_double(), regstore_set_data(), regstore_set_double(), regstore_set_values(), and set_constants().

◆ table_symbol

const char* table_symbol[]
static
Initial value:
=
{
"imm", "c", "oc", "ob", "oi", "r", "(null)",
}

Definition at line 222 of file preshader.c.

Referenced by dump_arg(), and dump_registers().

◆ type

Definition at line 209 of file preshader.c.

Referenced by d3dx_create_param_eval().