d3dcompiler: Distinguish between scalars, vectors and matrices.
This commit is contained in:
parent
a8839cd1de
commit
9d9dae0cdb
|
@ -614,6 +614,17 @@ void SlDeleteShader(struct bwriter_shader *shader) DECLSPEC_HIDDEN;
|
||||||
* DEALINGS IN THE SOFTWARE.
|
* DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
enum hlsl_type_class
|
||||||
|
{
|
||||||
|
HLSL_CLASS_SCALAR,
|
||||||
|
HLSL_CLASS_VECTOR,
|
||||||
|
HLSL_CLASS_MATRIX,
|
||||||
|
HLSL_CLASS_LAST_NUMERIC = HLSL_CLASS_MATRIX,
|
||||||
|
HLSL_CLASS_STRUCT,
|
||||||
|
HLSL_CLASS_ARRAY,
|
||||||
|
HLSL_CLASS_OBJECT,
|
||||||
|
};
|
||||||
|
|
||||||
enum hlsl_base_type
|
enum hlsl_base_type
|
||||||
{
|
{
|
||||||
HLSL_TYPE_FLOAT,
|
HLSL_TYPE_FLOAT,
|
||||||
|
@ -628,8 +639,6 @@ enum hlsl_base_type
|
||||||
HLSL_TYPE_PIXELSHADER,
|
HLSL_TYPE_PIXELSHADER,
|
||||||
HLSL_TYPE_VERTEXSHADER,
|
HLSL_TYPE_VERTEXSHADER,
|
||||||
HLSL_TYPE_STRING,
|
HLSL_TYPE_STRING,
|
||||||
HLSL_TYPE_STRUCT,
|
|
||||||
HLSL_TYPE_ARRAY,
|
|
||||||
HLSL_TYPE_VOID,
|
HLSL_TYPE_VOID,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -643,6 +652,7 @@ struct hlsl_type
|
||||||
{
|
{
|
||||||
struct list entry;
|
struct list entry;
|
||||||
struct list scope_entry;
|
struct list scope_entry;
|
||||||
|
enum hlsl_type_class type;
|
||||||
enum hlsl_base_type base_type;
|
enum hlsl_base_type base_type;
|
||||||
const char *name;
|
const char *name;
|
||||||
unsigned int modifiers;
|
unsigned int modifiers;
|
||||||
|
@ -737,7 +747,8 @@ void hlsl_message(const char *fmt, ...) PRINTF_ATTR(1,2) DECLSPEC_HIDDEN;
|
||||||
BOOL add_declaration(struct hlsl_scope *scope, struct hlsl_ir_var *decl, BOOL local_var) DECLSPEC_HIDDEN;
|
BOOL add_declaration(struct hlsl_scope *scope, struct hlsl_ir_var *decl, BOOL local_var) DECLSPEC_HIDDEN;
|
||||||
struct hlsl_ir_var *get_variable(struct hlsl_scope *scope, const char *name) DECLSPEC_HIDDEN;
|
struct hlsl_ir_var *get_variable(struct hlsl_scope *scope, const char *name) DECLSPEC_HIDDEN;
|
||||||
void free_declaration(struct hlsl_ir_var *decl) DECLSPEC_HIDDEN;
|
void free_declaration(struct hlsl_ir_var *decl) DECLSPEC_HIDDEN;
|
||||||
struct hlsl_type *new_hlsl_type(const char *name, enum hlsl_base_type base_type, unsigned dimx, unsigned dimy) DECLSPEC_HIDDEN;
|
struct hlsl_type *new_hlsl_type(const char *name, enum hlsl_type_class type_class,
|
||||||
|
enum hlsl_base_type base_type, unsigned dimx, unsigned dimy) DECLSPEC_HIDDEN;
|
||||||
struct hlsl_type *new_array_type(struct hlsl_type *basic_type, unsigned int array_size) DECLSPEC_HIDDEN;
|
struct hlsl_type *new_array_type(struct hlsl_type *basic_type, unsigned int array_size) DECLSPEC_HIDDEN;
|
||||||
struct hlsl_type *get_type(struct hlsl_scope *scope, const char *name, BOOL recursive) DECLSPEC_HIDDEN;
|
struct hlsl_type *get_type(struct hlsl_scope *scope, const char *name, BOOL recursive) DECLSPEC_HIDDEN;
|
||||||
BOOL find_function(const char *name) DECLSPEC_HIDDEN;
|
BOOL find_function(const char *name) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -240,7 +240,7 @@ type: base_type
|
||||||
|
|
||||||
base_type: KW_VOID
|
base_type: KW_VOID
|
||||||
{
|
{
|
||||||
$$ = new_hlsl_type("void", HLSL_TYPE_VOID, 1, 1);
|
$$ = new_hlsl_type("void", HLSL_CLASS_SCALAR, HLSL_TYPE_VOID, 1, 1);
|
||||||
}
|
}
|
||||||
| TYPE_IDENTIFIER
|
| TYPE_IDENTIFIER
|
||||||
{
|
{
|
||||||
|
@ -257,9 +257,9 @@ base_type: KW_VOID
|
||||||
|
|
||||||
TRACE("Struct type %s.\n", $2);
|
TRACE("Struct type %s.\n", $2);
|
||||||
type = get_type(hlsl_ctx.cur_scope, $2, TRUE);
|
type = get_type(hlsl_ctx.cur_scope, $2, TRUE);
|
||||||
if (type->base_type != HLSL_TYPE_STRUCT)
|
if (type->type != HLSL_CLASS_STRUCT)
|
||||||
{
|
{
|
||||||
hlsl_message("Line %u: Redefining %s as a structure.\n",
|
hlsl_message("Line %u: redefining %s as a structure.\n",
|
||||||
hlsl_ctx.line_no, $2);
|
hlsl_ctx.line_no, $2);
|
||||||
set_parse_status(&hlsl_ctx.status, PARSE_ERR);
|
set_parse_status(&hlsl_ctx.status, PARSE_ERR);
|
||||||
}
|
}
|
||||||
|
|
|
@ -804,7 +804,8 @@ void free_declaration(struct hlsl_ir_var *decl)
|
||||||
d3dcompiler_free(decl);
|
d3dcompiler_free(decl);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct hlsl_type *new_hlsl_type(const char *name, enum hlsl_base_type base_type, unsigned dimx, unsigned dimy)
|
struct hlsl_type *new_hlsl_type(const char *name, enum hlsl_type_class type_class,
|
||||||
|
enum hlsl_base_type base_type, unsigned dimx, unsigned dimy)
|
||||||
{
|
{
|
||||||
struct hlsl_type *type;
|
struct hlsl_type *type;
|
||||||
|
|
||||||
|
@ -815,6 +816,7 @@ struct hlsl_type *new_hlsl_type(const char *name, enum hlsl_base_type base_type,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
type->name = name;
|
type->name = name;
|
||||||
|
type->type = type_class;
|
||||||
type->base_type = base_type;
|
type->base_type = base_type;
|
||||||
type->dimx = dimx;
|
type->dimx = dimx;
|
||||||
type->dimy = dimy;
|
type->dimy = dimy;
|
||||||
|
@ -879,8 +881,6 @@ const char *debug_base_type(const struct hlsl_type *type)
|
||||||
case HLSL_TYPE_INT: name = "int"; break;
|
case HLSL_TYPE_INT: name = "int"; break;
|
||||||
case HLSL_TYPE_UINT: name = "uint"; break;
|
case HLSL_TYPE_UINT: name = "uint"; break;
|
||||||
case HLSL_TYPE_BOOL: name = "bool"; break;
|
case HLSL_TYPE_BOOL: name = "bool"; break;
|
||||||
case HLSL_TYPE_STRUCT: name = "struct"; break;
|
|
||||||
case HLSL_TYPE_ARRAY: name = "array"; break;
|
|
||||||
default:
|
default:
|
||||||
FIXME("Unhandled case %u\n", type->base_type);
|
FIXME("Unhandled case %u\n", type->base_type);
|
||||||
}
|
}
|
||||||
|
@ -894,15 +894,18 @@ const char *debug_hlsl_type(const struct hlsl_type *type)
|
||||||
if (type->name)
|
if (type->name)
|
||||||
return debugstr_a(type->name);
|
return debugstr_a(type->name);
|
||||||
|
|
||||||
if (type->base_type == HLSL_TYPE_STRUCT)
|
if (type->type == HLSL_CLASS_STRUCT)
|
||||||
name = "<anonymous struct>";
|
name = "<anonymous struct>";
|
||||||
else
|
else
|
||||||
name = debug_base_type(type);
|
name = debug_base_type(type);
|
||||||
if (type->dimx == 1 && type->dimy == 1)
|
|
||||||
|
if (type->type == HLSL_CLASS_SCALAR)
|
||||||
return wine_dbg_sprintf("%s", name);
|
return wine_dbg_sprintf("%s", name);
|
||||||
if (type->dimy == 1)
|
if (type->type == HLSL_CLASS_VECTOR)
|
||||||
return wine_dbg_sprintf("vector<%s, %u>", name, type->dimx);
|
return wine_dbg_sprintf("vector<%s, %u>", name, type->dimx);
|
||||||
return wine_dbg_sprintf("matrix<%s, %u, %u>", name, type->dimx, type->dimy);
|
if (type->type == HLSL_CLASS_MATRIX)
|
||||||
|
return wine_dbg_sprintf("matrix<%s, %u, %u>", name, type->dimx, type->dimy);
|
||||||
|
return "unexpected_type";
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *debug_node_type(enum hlsl_ir_node_type type)
|
const char *debug_node_type(enum hlsl_ir_node_type type)
|
||||||
|
@ -924,7 +927,7 @@ void free_hlsl_type(struct hlsl_type *type)
|
||||||
struct hlsl_struct_field *field, *next_field;
|
struct hlsl_struct_field *field, *next_field;
|
||||||
|
|
||||||
d3dcompiler_free((void *)type->name);
|
d3dcompiler_free((void *)type->name);
|
||||||
if (type->base_type == HLSL_TYPE_STRUCT)
|
if (type->type == HLSL_CLASS_STRUCT)
|
||||||
{
|
{
|
||||||
LIST_FOR_EACH_ENTRY_SAFE(field, next_field, type->e.elements, struct hlsl_struct_field, entry)
|
LIST_FOR_EACH_ENTRY_SAFE(field, next_field, type->e.elements, struct hlsl_struct_field, entry)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue