mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 19:26:32 +00:00
[D3DCOMPILER_43] Sync with Wine Staging 1.7.47. CORE-9924
svn path=/trunk/; revision=68531
This commit is contained in:
@@ -567,6 +567,13 @@ static DWORD d3d9_opcode(DWORD bwriter_opcode)
|
||||
}
|
||||
}
|
||||
|
||||
static DWORD d3dsp_register( D3DSHADER_PARAM_REGISTER_TYPE type, DWORD num )
|
||||
{
|
||||
return ((type << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK) |
|
||||
((type << D3DSP_REGTYPE_SHIFT2) & D3DSP_REGTYPE_MASK2) |
|
||||
(num & D3DSP_REGNUM_MASK); /* No shift */
|
||||
}
|
||||
|
||||
/******************************************************
|
||||
* Implementation of the writer functions starts here *
|
||||
******************************************************/
|
||||
@@ -607,10 +614,7 @@ static void write_declarations(struct bc_writer *This,
|
||||
static void write_const(struct constant **consts, int num, DWORD opcode, DWORD reg_type, struct bytecode_buffer *buffer, BOOL len) {
|
||||
int i;
|
||||
DWORD instr_def = opcode;
|
||||
const DWORD reg = (1<<31) |
|
||||
((reg_type << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK) |
|
||||
((reg_type << D3DSP_REGTYPE_SHIFT2) & D3DSP_REGTYPE_MASK2) |
|
||||
D3DSP_WRITEMASK_ALL;
|
||||
const DWORD reg = (1<<31) | d3dsp_register( reg_type, 0 ) | D3DSP_WRITEMASK_ALL;
|
||||
|
||||
if(len) {
|
||||
if(opcode == D3DSIO_DEFB)
|
||||
@@ -845,41 +849,28 @@ static void end(struct bc_writer *This, const struct bwriter_shader *shader, str
|
||||
}
|
||||
|
||||
static DWORD map_vs_output(struct bc_writer *This, DWORD regnum, DWORD mask, DWORD *has_components) {
|
||||
DWORD token = 0;
|
||||
DWORD i;
|
||||
|
||||
*has_components = TRUE;
|
||||
if(regnum == This->oPos_regnum) {
|
||||
token |= (D3DSPR_RASTOUT << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= D3DSRO_POSITION & D3DSP_REGNUM_MASK; /* No shift */
|
||||
return token;
|
||||
return d3dsp_register( D3DSPR_RASTOUT, D3DSRO_POSITION );
|
||||
}
|
||||
if(regnum == This->oFog_regnum && mask == This->oFog_mask) {
|
||||
token |= (D3DSPR_RASTOUT << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= D3DSRO_FOG & D3DSP_REGNUM_MASK; /* No shift */
|
||||
token |= D3DSP_WRITEMASK_ALL;
|
||||
*has_components = FALSE;
|
||||
return token;
|
||||
return d3dsp_register( D3DSPR_RASTOUT, D3DSRO_FOG ) | D3DSP_WRITEMASK_ALL;
|
||||
}
|
||||
if(regnum == This->oPts_regnum && mask == This->oPts_mask) {
|
||||
token |= (D3DSPR_RASTOUT << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= D3DSRO_POINT_SIZE & D3DSP_REGNUM_MASK; /* No shift */
|
||||
token |= D3DSP_WRITEMASK_ALL;
|
||||
*has_components = FALSE;
|
||||
return token;
|
||||
return d3dsp_register( D3DSPR_RASTOUT, D3DSRO_POINT_SIZE ) | D3DSP_WRITEMASK_ALL;
|
||||
}
|
||||
for(i = 0; i < 2; i++) {
|
||||
if(regnum == This->oD_regnum[i]) {
|
||||
token |= (D3DSPR_ATTROUT << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= i & D3DSP_REGNUM_MASK; /* No shift */
|
||||
return token;
|
||||
return d3dsp_register( D3DSPR_ATTROUT, i );
|
||||
}
|
||||
}
|
||||
for(i = 0; i < 8; i++) {
|
||||
if(regnum == This->oT_regnum[i]) {
|
||||
token |= (D3DSPR_TEXCRDOUT << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= i & D3DSP_REGNUM_MASK; /* No shift */
|
||||
return token;
|
||||
return d3dsp_register( D3DSPR_TEXCRDOUT, i );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -918,8 +909,7 @@ static void vs_12_dstreg(struct bc_writer *This, const struct shader_reg *reg,
|
||||
case BWRITERSPR_INPUT:
|
||||
case BWRITERSPR_TEMP:
|
||||
case BWRITERSPR_CONST:
|
||||
token |= (reg->type << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= reg->regnum & D3DSP_REGNUM_MASK; /* No shift */
|
||||
token |= d3dsp_register( reg->type, reg->regnum );
|
||||
has_wmask = TRUE;
|
||||
break;
|
||||
|
||||
@@ -929,8 +919,7 @@ static void vs_12_dstreg(struct bc_writer *This, const struct shader_reg *reg,
|
||||
This->state = E_INVALIDARG;
|
||||
return;
|
||||
}
|
||||
token |= (D3DSPR_ADDR << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= 0 & D3DSP_REGNUM_MASK; /* No shift */
|
||||
token |= d3dsp_register( D3DSPR_ADDR, 0 );
|
||||
has_wmask = TRUE;
|
||||
break;
|
||||
|
||||
@@ -945,9 +934,7 @@ static void vs_12_dstreg(struct bc_writer *This, const struct shader_reg *reg,
|
||||
This->state = E_INVALIDARG;
|
||||
return;
|
||||
}
|
||||
token |= (D3DSPR_PREDICATE << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= (D3DSPR_PREDICATE << D3DSP_REGTYPE_SHIFT2) & D3DSP_REGTYPE_MASK2;
|
||||
token |= 0 & D3DSP_REGNUM_MASK; /* No shift */
|
||||
token |= d3dsp_register( D3DSPR_PREDICATE, 0 );
|
||||
has_wmask = TRUE;
|
||||
break;
|
||||
|
||||
@@ -1011,8 +998,7 @@ static void vs_1_x_srcreg(struct bc_writer *This, const struct shader_reg *reg,
|
||||
case BWRITERSPR_TEMP:
|
||||
case BWRITERSPR_CONST:
|
||||
case BWRITERSPR_ADDR:
|
||||
token |= (reg->type << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= reg->regnum & D3DSP_REGNUM_MASK; /* No shift */
|
||||
token |= d3dsp_register( reg->type, reg->regnum );
|
||||
if(reg->rel_reg) {
|
||||
if(reg->rel_reg->type != BWRITERSPR_ADDR ||
|
||||
reg->rel_reg->regnum != 0 ||
|
||||
@@ -1049,48 +1035,37 @@ static void write_srcregs(struct bc_writer *This, const struct instruction *inst
|
||||
}
|
||||
|
||||
static DWORD map_ps13_temp(struct bc_writer *This, const struct shader_reg *reg) {
|
||||
DWORD token = 0;
|
||||
if(reg->regnum == T0_REG) {
|
||||
token |= (D3DSPR_TEXTURE << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= 0 & D3DSP_REGNUM_MASK; /* No shift */
|
||||
return d3dsp_register( D3DSPR_TEXTURE, 0 );
|
||||
} else if(reg->regnum == T1_REG) {
|
||||
token |= (D3DSPR_TEXTURE << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= 1 & D3DSP_REGNUM_MASK; /* No shift */
|
||||
return d3dsp_register( D3DSPR_TEXTURE, 1 );
|
||||
} else if(reg->regnum == T2_REG) {
|
||||
token |= (D3DSPR_TEXTURE << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= 2 & D3DSP_REGNUM_MASK; /* No shift */
|
||||
return d3dsp_register( D3DSPR_TEXTURE, 2 );
|
||||
} else if(reg->regnum == T3_REG) {
|
||||
token |= (D3DSPR_TEXTURE << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= 3 & D3DSP_REGNUM_MASK; /* No shift */
|
||||
return d3dsp_register( D3DSPR_TEXTURE, 3 );
|
||||
} else {
|
||||
token |= (D3DSPR_TEMP << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= reg->regnum & D3DSP_REGNUM_MASK; /* No shift */
|
||||
return d3dsp_register( D3DSPR_TEMP, reg->regnum );
|
||||
}
|
||||
return token;
|
||||
}
|
||||
|
||||
static DWORD map_ps_input(struct bc_writer *This,
|
||||
const struct shader_reg *reg) {
|
||||
DWORD i, token = 0;
|
||||
DWORD i;
|
||||
/* Map color interpolators */
|
||||
for(i = 0; i < 2; i++) {
|
||||
if(reg->regnum == This->v_regnum[i]) {
|
||||
token |= (D3DSPR_INPUT << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= i & D3DSP_REGNUM_MASK; /* No shift */
|
||||
return token;
|
||||
return d3dsp_register( D3DSPR_INPUT, i );
|
||||
}
|
||||
}
|
||||
for(i = 0; i < 8; i++) {
|
||||
if(reg->regnum == This->t_regnum[i]) {
|
||||
token |= (D3DSPR_TEXTURE << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= i & D3DSP_REGNUM_MASK; /* No shift */
|
||||
return token;
|
||||
return d3dsp_register( D3DSPR_TEXTURE, i );
|
||||
}
|
||||
}
|
||||
|
||||
WARN("Invalid ps 1/2 varying\n");
|
||||
This->state = E_INVALIDARG;
|
||||
return token;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ps_1_0123_srcreg(struct bc_writer *This, const struct shader_reg *reg,
|
||||
@@ -1116,8 +1091,7 @@ static void ps_1_0123_srcreg(struct bc_writer *This, const struct shader_reg *re
|
||||
break;
|
||||
|
||||
case BWRITERSPR_CONST: /* Can be mapped 1:1 */
|
||||
token |= (reg->type << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= reg->regnum & D3DSP_REGNUM_MASK; /* No shift */
|
||||
token |= d3dsp_register( reg->type, reg->regnum );
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -1419,8 +1393,7 @@ static void ps_1_4_srcreg(struct bc_writer *This, const struct shader_reg *reg,
|
||||
/* Can be mapped 1:1 */
|
||||
case BWRITERSPR_TEMP:
|
||||
case BWRITERSPR_CONST:
|
||||
token |= (reg->type << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= reg->regnum & D3DSP_REGNUM_MASK; /* No shift */
|
||||
token |= d3dsp_register( reg->type, reg->regnum );
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -1454,8 +1427,7 @@ static void ps_1_4_dstreg(struct bc_writer *This, const struct shader_reg *reg,
|
||||
|
||||
switch(reg->type) {
|
||||
case BWRITERSPR_TEMP: /* 1:1 mapping */
|
||||
token |= (reg->type << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= reg->regnum & D3DSP_REGNUM_MASK; /* No shift */
|
||||
token |= d3dsp_register( reg->type, reg->regnum );
|
||||
break;
|
||||
|
||||
/* For texkill */
|
||||
@@ -1636,9 +1608,7 @@ static void vs_2_srcreg(struct bc_writer *This,
|
||||
case BWRITERSPR_CONSTBOOL:
|
||||
case BWRITERSPR_LABEL:
|
||||
d3d9reg = d3d9_register(reg->type);
|
||||
token |= (d3d9reg << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= (d3d9reg << D3DSP_REGTYPE_SHIFT2) & D3DSP_REGTYPE_MASK2;
|
||||
token |= reg->regnum & D3DSP_REGNUM_MASK; /* No shift */
|
||||
token |= d3dsp_register( d3d9reg, reg->regnum );
|
||||
break;
|
||||
|
||||
case BWRITERSPR_LOOP:
|
||||
@@ -1647,9 +1617,7 @@ static void vs_2_srcreg(struct bc_writer *This,
|
||||
This->state = E_INVALIDARG;
|
||||
return;
|
||||
}
|
||||
token |= (D3DSPR_LOOP << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= (D3DSPR_LOOP << D3DSP_REGTYPE_SHIFT2) & D3DSP_REGTYPE_MASK2;
|
||||
token |= 0 & D3DSP_REGNUM_MASK; /* No shift */
|
||||
token |= d3dsp_register( D3DSPR_LOOP, 0 );
|
||||
break;
|
||||
|
||||
case BWRITERSPR_PREDICATE:
|
||||
@@ -1663,10 +1631,7 @@ static void vs_2_srcreg(struct bc_writer *This,
|
||||
This->state = E_INVALIDARG;
|
||||
return;
|
||||
}
|
||||
token |= (D3DSPR_PREDICATE << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= (D3DSPR_PREDICATE << D3DSP_REGTYPE_SHIFT2) & D3DSP_REGTYPE_MASK2;
|
||||
token |= 0 & D3DSP_REGNUM_MASK; /* No shift */
|
||||
|
||||
token |= d3dsp_register( D3DSPR_PREDICATE, 0 );
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -1834,10 +1799,7 @@ static void write_samplers(const struct bwriter_shader *shader, struct bytecode_
|
||||
DWORD i;
|
||||
DWORD instr_dcl = D3DSIO_DCL | (2 << D3DSI_INSTLENGTH_SHIFT);
|
||||
DWORD token;
|
||||
const DWORD reg = (1<<31) |
|
||||
((D3DSPR_SAMPLER << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK) |
|
||||
((D3DSPR_SAMPLER << D3DSP_REGTYPE_SHIFT2) & D3DSP_REGTYPE_MASK2) |
|
||||
D3DSP_WRITEMASK_ALL;
|
||||
const DWORD reg = (1<<31) | d3dsp_register( D3DSPR_SAMPLER, 0 ) | D3DSP_WRITEMASK_ALL;
|
||||
|
||||
for(i = 0; i < shader->num_samplers; i++) {
|
||||
/* Write the DCL instruction */
|
||||
@@ -1892,9 +1854,7 @@ static void ps_2_srcreg(struct bc_writer *This,
|
||||
case BWRITERSPR_LABEL:
|
||||
case BWRITERSPR_DEPTHOUT:
|
||||
d3d9reg = d3d9_register(reg->type);
|
||||
token |= (d3d9reg << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= (d3d9reg << D3DSP_REGTYPE_SHIFT2) & D3DSP_REGTYPE_MASK2;
|
||||
token |= reg->regnum & D3DSP_REGNUM_MASK; /* No shift */
|
||||
token |= d3dsp_register( d3d9reg, reg->regnum );
|
||||
break;
|
||||
|
||||
case BWRITERSPR_PREDICATE:
|
||||
@@ -1907,9 +1867,7 @@ static void ps_2_srcreg(struct bc_writer *This,
|
||||
reg->regnum);
|
||||
This->state = E_INVALIDARG;
|
||||
}
|
||||
token |= (D3DSPR_PREDICATE << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= (D3DSPR_PREDICATE << D3DSP_REGTYPE_SHIFT2) & D3DSP_REGTYPE_MASK2;
|
||||
token |= 0 & D3DSP_REGNUM_MASK; /* No shift */
|
||||
token |= d3dsp_register( D3DSPR_PREDICATE, 0 );
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -1942,9 +1900,7 @@ static void ps_2_0_dstreg(struct bc_writer *This,
|
||||
case BWRITERSPR_COLOROUT:
|
||||
case BWRITERSPR_DEPTHOUT:
|
||||
d3d9reg = d3d9_register(reg->type);
|
||||
token |= (d3d9reg << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= (d3d9reg << D3DSP_REGTYPE_SHIFT2) & D3DSP_REGTYPE_MASK2;
|
||||
token |= reg->regnum & D3DSP_REGNUM_MASK; /* No shift */
|
||||
token |= d3dsp_register( d3d9reg, reg->regnum );
|
||||
break;
|
||||
|
||||
case BWRITERSPR_PREDICATE:
|
||||
@@ -1952,9 +1908,7 @@ static void ps_2_0_dstreg(struct bc_writer *This,
|
||||
WARN("Predicate register not supported in ps_2_0\n");
|
||||
This->state = E_INVALIDARG;
|
||||
}
|
||||
token |= (D3DSPR_PREDICATE << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= (D3DSPR_PREDICATE << D3DSP_REGTYPE_SHIFT2) & D3DSP_REGTYPE_MASK2;
|
||||
token |= reg->regnum & D3DSP_REGNUM_MASK; /* No shift */
|
||||
token |= d3dsp_register( D3DSPR_PREDICATE, reg->regnum );
|
||||
break;
|
||||
|
||||
/* texkill uses the input register as a destination parameter */
|
||||
@@ -2109,10 +2063,7 @@ static void sm_3_srcreg(struct bc_writer *This,
|
||||
DWORD d3d9reg;
|
||||
|
||||
d3d9reg = d3d9_register(reg->type);
|
||||
token |= (d3d9reg << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= (d3d9reg << D3DSP_REGTYPE_SHIFT2) & D3DSP_REGTYPE_MASK2;
|
||||
token |= reg->regnum & D3DSP_REGNUM_MASK;
|
||||
|
||||
token |= d3dsp_register( d3d9reg, reg->regnum );
|
||||
token |= d3d9_swizzle(reg->u.swizzle) & D3DVS_SWIZZLE_MASK;
|
||||
token |= d3d9_srcmod(reg->srcmod);
|
||||
|
||||
@@ -2162,12 +2113,8 @@ static void sm_3_dstreg(struct bc_writer *This,
|
||||
}
|
||||
|
||||
d3d9reg = d3d9_register(reg->type);
|
||||
token |= (d3d9reg << D3DSP_REGTYPE_SHIFT) & D3DSP_REGTYPE_MASK;
|
||||
token |= (d3d9reg << D3DSP_REGTYPE_SHIFT2) & D3DSP_REGTYPE_MASK2;
|
||||
token |= reg->regnum & D3DSP_REGNUM_MASK; /* No shift */
|
||||
|
||||
token |= d3dsp_register( d3d9reg, reg->regnum );
|
||||
token |= d3d9_dstmod(mod);
|
||||
|
||||
token |= d3d9_writemask(reg->u.writemask);
|
||||
put_dword(buffer, token);
|
||||
|
||||
|
||||
@@ -750,12 +750,19 @@ struct hlsl_ir_node
|
||||
|
||||
#define HLSL_MODIFIERS_COMPARISON_MASK (HLSL_MODIFIER_ROW_MAJOR | HLSL_MODIFIER_COLUMN_MAJOR)
|
||||
|
||||
struct reg_reservation
|
||||
{
|
||||
enum bwritershader_param_register_type type;
|
||||
DWORD regnum;
|
||||
};
|
||||
|
||||
struct hlsl_ir_var
|
||||
{
|
||||
struct hlsl_ir_node node;
|
||||
const char *name;
|
||||
const char *semantic;
|
||||
unsigned int modifiers;
|
||||
const struct reg_reservation *reg_reservation;
|
||||
struct list scope_entry;
|
||||
|
||||
struct hlsl_var_allocation *allocation;
|
||||
@@ -964,9 +971,16 @@ struct parse_parameter
|
||||
struct hlsl_type *type;
|
||||
const char *name;
|
||||
const char *semantic;
|
||||
const struct reg_reservation *reg_reservation;
|
||||
unsigned int modifiers;
|
||||
};
|
||||
|
||||
struct parse_colon_attribute
|
||||
{
|
||||
const char *semantic;
|
||||
struct reg_reservation *reg_reservation;
|
||||
};
|
||||
|
||||
struct parse_variable_def
|
||||
{
|
||||
struct list entry;
|
||||
@@ -974,7 +988,8 @@ struct parse_variable_def
|
||||
|
||||
char *name;
|
||||
unsigned int array_size;
|
||||
char *semantic;
|
||||
const char *semantic;
|
||||
struct reg_reservation *reg_reservation;
|
||||
struct list *initializer;
|
||||
};
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -155,7 +155,7 @@ extern int hlsl_debug;
|
||||
typedef union YYSTYPE YYSTYPE;
|
||||
union YYSTYPE
|
||||
{
|
||||
#line 866 "hlsl.y" /* yacc.c:1909 */
|
||||
#line 910 "hlsl.y" /* yacc.c:1909 */
|
||||
|
||||
struct hlsl_type *type;
|
||||
INT intval;
|
||||
@@ -172,8 +172,10 @@ union YYSTYPE
|
||||
struct parse_if_body if_body;
|
||||
enum parse_unary_op unary_op;
|
||||
enum parse_assign_op assign_op;
|
||||
struct reg_reservation *reg_reservation;
|
||||
struct parse_colon_attribute colon_attribute;
|
||||
|
||||
#line 177 "hlsl.tab.h" /* yacc.c:1909 */
|
||||
#line 179 "hlsl.tab.h" /* yacc.c:1909 */
|
||||
};
|
||||
# define YYSTYPE_IS_TRIVIAL 1
|
||||
# define YYSTYPE_IS_DECLARED 1
|
||||
|
||||
@@ -597,6 +597,7 @@ static struct list *declare_vars(struct hlsl_type *basic_type, DWORD modifiers,
|
||||
var->name = v->name;
|
||||
var->modifiers = modifiers;
|
||||
var->semantic = v->semantic;
|
||||
var->reg_reservation = v->reg_reservation;
|
||||
debug_dump_decl(type, modifiers, v->name, v->loc.line);
|
||||
|
||||
if (hlsl_ctx.cur_scope == hlsl_ctx.globals)
|
||||
@@ -822,6 +823,7 @@ static BOOL add_func_parameter(struct list *list, struct parse_parameter *param,
|
||||
decl->node.loc = *loc;
|
||||
decl->name = param->name;
|
||||
decl->semantic = param->semantic;
|
||||
decl->reg_reservation = param->reg_reservation;
|
||||
decl->modifiers = param->modifiers;
|
||||
|
||||
if (!add_declaration(hlsl_ctx.cur_scope, decl, FALSE))
|
||||
@@ -833,6 +835,48 @@ static BOOL add_func_parameter(struct list *list, struct parse_parameter *param,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static struct reg_reservation *parse_reg_reservation(const char *reg_string)
|
||||
{
|
||||
struct reg_reservation *reg_res;
|
||||
enum bwritershader_param_register_type type;
|
||||
DWORD regnum = 0;
|
||||
|
||||
switch (reg_string[0])
|
||||
{
|
||||
case 'c':
|
||||
type = BWRITERSPR_CONST;
|
||||
break;
|
||||
case 'i':
|
||||
type = BWRITERSPR_CONSTINT;
|
||||
break;
|
||||
case 'b':
|
||||
type = BWRITERSPR_CONSTBOOL;
|
||||
break;
|
||||
case 's':
|
||||
type = BWRITERSPR_SAMPLER;
|
||||
break;
|
||||
default:
|
||||
FIXME("Unsupported register type.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!sscanf(reg_string + 1, "%u", ®num))
|
||||
{
|
||||
FIXME("Unsupported register reservation syntax.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
reg_res = d3dcompiler_alloc(sizeof(*reg_res));
|
||||
if (!reg_res)
|
||||
{
|
||||
ERR("Out of memory.\n");
|
||||
return NULL;
|
||||
}
|
||||
reg_res->type = type;
|
||||
reg_res->regnum = regnum;
|
||||
return reg_res;
|
||||
}
|
||||
|
||||
static const struct hlsl_ir_function_decl *get_overloaded_func(struct wine_rb_tree *funcs, char *name,
|
||||
struct list *params, BOOL exact_signature)
|
||||
{
|
||||
@@ -879,6 +923,8 @@ static const struct hlsl_ir_function_decl *get_overloaded_func(struct wine_rb_tr
|
||||
struct parse_if_body if_body;
|
||||
enum parse_unary_op unary_op;
|
||||
enum parse_assign_op assign_op;
|
||||
struct reg_reservation *reg_reservation;
|
||||
struct parse_colon_attribute colon_attribute;
|
||||
}
|
||||
|
||||
%token KW_BLENDSTATE
|
||||
@@ -1016,7 +1062,9 @@ static const struct hlsl_ir_function_decl *get_overloaded_func(struct wine_rb_tr
|
||||
%type <function> func_prototype
|
||||
%type <list> fields_list
|
||||
%type <parameter> parameter
|
||||
%type <colon_attribute> colon_attribute
|
||||
%type <name> semantic
|
||||
%type <reg_reservation> register_opt
|
||||
%type <variable_def> variable_def
|
||||
%type <list> variables_def
|
||||
%type <list> variables_def_optional
|
||||
@@ -1097,20 +1145,23 @@ hlsl_prog: /* empty */
|
||||
|
||||
preproc_directive: PRE_LINE STRING
|
||||
{
|
||||
const char **new_array = NULL;
|
||||
|
||||
TRACE("Updating line information to file %s, line %u\n", debugstr_a($2), $1);
|
||||
hlsl_ctx.line_no = $1;
|
||||
if (strcmp($2, hlsl_ctx.source_file))
|
||||
{
|
||||
const char **new_array;
|
||||
|
||||
hlsl_ctx.source_file = $2;
|
||||
new_array = d3dcompiler_realloc(hlsl_ctx.source_files,
|
||||
sizeof(*hlsl_ctx.source_files) * hlsl_ctx.source_files_count + 1);
|
||||
if (new_array)
|
||||
{
|
||||
hlsl_ctx.source_files = new_array;
|
||||
hlsl_ctx.source_files[hlsl_ctx.source_files_count++] = $2;
|
||||
}
|
||||
|
||||
if (new_array)
|
||||
{
|
||||
hlsl_ctx.source_files = new_array;
|
||||
hlsl_ctx.source_files[hlsl_ctx.source_files_count++] = $2;
|
||||
hlsl_ctx.source_file = $2;
|
||||
}
|
||||
else
|
||||
{
|
||||
d3dcompiler_free($2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1221,7 +1272,7 @@ func_declaration: func_prototype compound_statement
|
||||
pop_scope(&hlsl_ctx);
|
||||
}
|
||||
|
||||
func_prototype: var_modifiers type var_identifier '(' parameters ')' semantic
|
||||
func_prototype: var_modifiers type var_identifier '(' parameters ')' colon_attribute
|
||||
{
|
||||
if (get_variable(hlsl_ctx.globals, $3))
|
||||
{
|
||||
@@ -1229,12 +1280,17 @@ func_prototype: var_modifiers type var_identifier '(' parameters ')' s
|
||||
HLSL_LEVEL_ERROR, "redefinition of '%s'\n", $3);
|
||||
return 1;
|
||||
}
|
||||
if ($2->base_type == HLSL_TYPE_VOID && $7)
|
||||
if ($2->base_type == HLSL_TYPE_VOID && $7.semantic)
|
||||
{
|
||||
hlsl_report_message(hlsl_ctx.source_file, @7.first_line, @7.first_column,
|
||||
HLSL_LEVEL_ERROR, "void function with a semantic");
|
||||
}
|
||||
|
||||
if ($7.reg_reservation)
|
||||
{
|
||||
FIXME("Unexpected register reservation for a function.\n");
|
||||
d3dcompiler_free($7.reg_reservation);
|
||||
}
|
||||
$$.decl = new_func_decl($2, $5);
|
||||
if (!$$.decl)
|
||||
{
|
||||
@@ -1242,7 +1298,7 @@ func_prototype: var_modifiers type var_identifier '(' parameters ')' s
|
||||
return -1;
|
||||
}
|
||||
$$.name = $3;
|
||||
$$.decl->semantic = $7;
|
||||
$$.decl->semantic = $7.semantic;
|
||||
set_location(&$$.decl->node.loc, &@3);
|
||||
}
|
||||
|
||||
@@ -1265,15 +1321,42 @@ scope_start: /* Empty */
|
||||
var_identifier: VAR_IDENTIFIER
|
||||
| NEW_IDENTIFIER
|
||||
|
||||
semantic: /* Empty */
|
||||
colon_attribute: /* Empty */
|
||||
{
|
||||
$$ = NULL;
|
||||
$$.semantic = NULL;
|
||||
$$.reg_reservation = NULL;
|
||||
}
|
||||
| ':' any_identifier
|
||||
| semantic
|
||||
{
|
||||
$$.semantic = $1;
|
||||
$$.reg_reservation = NULL;
|
||||
}
|
||||
| register_opt
|
||||
{
|
||||
$$.semantic = NULL;
|
||||
$$.reg_reservation = $1;
|
||||
}
|
||||
|
||||
semantic: ':' any_identifier
|
||||
{
|
||||
$$ = $2;
|
||||
}
|
||||
|
||||
/* FIXME: Writemasks */
|
||||
register_opt: ':' KW_REGISTER '(' any_identifier ')'
|
||||
{
|
||||
$$ = parse_reg_reservation($4);
|
||||
d3dcompiler_free($4);
|
||||
}
|
||||
| ':' KW_REGISTER '(' any_identifier ',' any_identifier ')'
|
||||
{
|
||||
FIXME("Ignoring shader target %s in a register reservation.\n", debugstr_a($4));
|
||||
d3dcompiler_free($4);
|
||||
|
||||
$$ = parse_reg_reservation($6);
|
||||
d3dcompiler_free($6);
|
||||
}
|
||||
|
||||
parameters: scope_start
|
||||
{
|
||||
$$ = d3dcompiler_alloc(sizeof(*$$));
|
||||
@@ -1312,13 +1395,14 @@ param_list: parameter
|
||||
}
|
||||
}
|
||||
|
||||
parameter: input_mods var_modifiers type any_identifier semantic
|
||||
parameter: input_mods var_modifiers type any_identifier colon_attribute
|
||||
{
|
||||
$$.modifiers = $1 ? $1 : HLSL_MODIFIER_IN;
|
||||
$$.modifiers |= $2;
|
||||
$$.type = $3;
|
||||
$$.name = $4;
|
||||
$$.semantic = $5;
|
||||
$$.semantic = $5.semantic;
|
||||
$$.reg_reservation = $5.reg_reservation;
|
||||
}
|
||||
|
||||
input_mods: /* Empty */
|
||||
@@ -1523,22 +1607,24 @@ variables_def: variable_def
|
||||
list_add_tail($$, &$3->entry);
|
||||
}
|
||||
|
||||
variable_def: any_identifier array semantic
|
||||
variable_def: any_identifier array colon_attribute
|
||||
{
|
||||
$$ = d3dcompiler_alloc(sizeof(*$$));
|
||||
set_location(&$$->loc, &@1);
|
||||
$$->name = $1;
|
||||
$$->array_size = $2;
|
||||
$$->semantic = $3;
|
||||
$$->semantic = $3.semantic;
|
||||
$$->reg_reservation = $3.reg_reservation;
|
||||
}
|
||||
| any_identifier array semantic '=' complex_initializer
|
||||
| any_identifier array colon_attribute '=' complex_initializer
|
||||
{
|
||||
TRACE("Declaration with initializer.\n");
|
||||
$$ = d3dcompiler_alloc(sizeof(*$$));
|
||||
set_location(&$$->loc, &@1);
|
||||
$$->name = $1;
|
||||
$$->array_size = $2;
|
||||
$$->semantic = $3;
|
||||
$$->semantic = $3.semantic;
|
||||
$$->reg_reservation = $3.reg_reservation;
|
||||
$$->initializer = $5;
|
||||
}
|
||||
|
||||
|
||||
@@ -797,6 +797,7 @@ void free_declaration(struct hlsl_ir_var *decl)
|
||||
{
|
||||
d3dcompiler_free((void *)decl->name);
|
||||
d3dcompiler_free((void *)decl->semantic);
|
||||
d3dcompiler_free((void *)decl->reg_reservation);
|
||||
d3dcompiler_free(decl);
|
||||
}
|
||||
|
||||
@@ -1579,8 +1580,31 @@ struct hlsl_ir_node *make_assignment(struct hlsl_ir_node *left, enum parse_assig
|
||||
type = left->data_type;
|
||||
else
|
||||
{
|
||||
FIXME("Assignments with writemasks not supported yet.\n");
|
||||
type = NULL;
|
||||
unsigned int dimx = 0;
|
||||
DWORD bitmask;
|
||||
enum hlsl_type_class type_class;
|
||||
|
||||
if (left->data_type->type > HLSL_CLASS_LAST_NUMERIC)
|
||||
{
|
||||
hlsl_report_message(left->loc.file, left->loc.line, left->loc.col, HLSL_LEVEL_ERROR,
|
||||
"writemask on a non scalar/vector/matrix type");
|
||||
d3dcompiler_free(assign);
|
||||
return NULL;
|
||||
}
|
||||
bitmask = writemask & ((1 << left->data_type->dimx) - 1);
|
||||
while (bitmask)
|
||||
{
|
||||
if (bitmask & 1)
|
||||
dimx++;
|
||||
bitmask >>= 1;
|
||||
}
|
||||
if (left->data_type->type == HLSL_CLASS_MATRIX)
|
||||
FIXME("Assignments with writemasks and matrices on lhs are not supported yet.\n");
|
||||
if (dimx == 1)
|
||||
type_class = HLSL_CLASS_SCALAR;
|
||||
else
|
||||
type_class = left->data_type->type;
|
||||
type = new_hlsl_type(NULL, type_class, left->data_type->base_type, dimx, 1);
|
||||
}
|
||||
assign->node.type = HLSL_IR_ASSIGNMENT;
|
||||
assign->node.loc = left->loc;
|
||||
@@ -2440,12 +2464,12 @@ void free_instr(struct hlsl_ir_node *node)
|
||||
}
|
||||
}
|
||||
|
||||
static void free_function_decl(struct hlsl_ir_function_decl *func)
|
||||
static void free_function_decl(struct hlsl_ir_function_decl *decl)
|
||||
{
|
||||
d3dcompiler_free((void *)func->semantic);
|
||||
d3dcompiler_free(func->parameters);
|
||||
free_instr_list(func->body);
|
||||
d3dcompiler_free(func);
|
||||
d3dcompiler_free((void *)decl->semantic);
|
||||
d3dcompiler_free(decl->parameters);
|
||||
free_instr_list(decl->body);
|
||||
d3dcompiler_free(decl);
|
||||
}
|
||||
|
||||
static void free_function_decl_rb(struct wine_rb_entry *entry, void *context)
|
||||
@@ -2457,6 +2481,7 @@ static void free_function(struct hlsl_ir_function *func)
|
||||
{
|
||||
wine_rb_destroy(&func->overloads, free_function_decl_rb, NULL);
|
||||
d3dcompiler_free((void *)func->name);
|
||||
d3dcompiler_free(func);
|
||||
}
|
||||
|
||||
void free_function_rb(struct wine_rb_entry *entry, void *context)
|
||||
@@ -2473,6 +2498,22 @@ void add_function_decl(struct wine_rb_tree *funcs, char *name, struct hlsl_ir_fu
|
||||
if (func_entry)
|
||||
{
|
||||
func = WINE_RB_ENTRY_VALUE(func_entry, struct hlsl_ir_function, entry);
|
||||
if (intrinsic != func->intrinsic)
|
||||
{
|
||||
if (intrinsic)
|
||||
{
|
||||
ERR("Redeclaring a user defined function as an intrinsic.\n");
|
||||
return;
|
||||
}
|
||||
TRACE("Function %s redeclared as a user defined function.\n", debugstr_a(name));
|
||||
func->intrinsic = intrinsic;
|
||||
wine_rb_destroy(&func->overloads, free_function_decl_rb, NULL);
|
||||
if (wine_rb_init(&func->overloads, &hlsl_ir_function_decl_rb_funcs) == -1)
|
||||
{
|
||||
ERR("Failed to initialize function rbtree.\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
decl->func = func;
|
||||
if ((old_entry = wine_rb_get(&func->overloads, decl->parameters)))
|
||||
{
|
||||
|
||||
@@ -24,7 +24,7 @@ The following libraries are shared with Wine.
|
||||
reactos/dll/directx/wine/amstream # Synced to WineStaging-1.7.47
|
||||
reactos/dll/directx/wine/d3d8 # Synced to WineStaging-1.7.47
|
||||
reactos/dll/directx/wine/d3d9 # Synced to WineStaging-1.7.47
|
||||
reactos/dll/directx/wine/d3dcompiler_43 # Synced to WineStaging-1.7.37
|
||||
reactos/dll/directx/wine/d3dcompiler_43 # Synced to WineStaging-1.7.47
|
||||
reactos/dll/directx/wine/d3drm # Synced to WineStaging-1.7.47
|
||||
reactos/dll/directx/wine/d3dx9_24 => 43 # Synced to WineStaging-1.7.37
|
||||
reactos/dll/directx/wine/d3dxof # Synced to WineStaging-1.7.47
|
||||
|
||||
Reference in New Issue
Block a user