[D3DCOMPILER_43] Sync with Wine Staging 1.7.47. CORE-9924

svn path=/trunk/; revision=68531
This commit is contained in:
Amine Khaldi
2015-07-22 00:32:43 +00:00
parent 763adf51fe
commit 2a02b4e23a
7 changed files with 1226 additions and 1038 deletions
@@ -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
+107 -21
View File
@@ -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", &regnum))
{
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)))
{
+1 -1
View File
@@ -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