On Mon, Mar 30, 2020 at 4:54 AM Zebediah Figura z.figura12@gmail.com wrote:
From: Zebediah Figura zfigura@codeweavers.com
Signed-off-by: Zebediah Figura zfigura@codeweavers.com
dlls/d3dcompiler_43/d3dcompiler_private.h | 3 +++ dlls/d3dcompiler_43/hlsl.y | 23 +++++++++++++++++++++++ dlls/d3dcompiler_43/utils.c | 9 +++++++++ 3 files changed, 35 insertions(+)
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h index df45a7082fe..4fdb464a4ef 100644 --- a/dlls/d3dcompiler_43/d3dcompiler_private.h +++ b/dlls/d3dcompiler_43/d3dcompiler_private.h @@ -614,6 +614,7 @@ struct hlsl_type unsigned int modifiers; unsigned int dimx; unsigned int dimy;
- unsigned int reg_size; union { struct list *elements;
I'm not too thrilled to have the size stored in struct hlsl_type. I guess it would be very awkward otherwise though...
@@ -632,6 +633,7 @@ struct hlsl_struct_field const char *name; const char *semantic; DWORD modifiers;
- unsigned int reg_offset;
};
struct source_location @@ -1083,6 +1085,7 @@ struct hlsl_type *new_hlsl_type(const char *name, enum hlsl_type_class type_clas struct hlsl_type *new_array_type(struct hlsl_type *basic_type, unsigned int array_size) DECLSPEC_HIDDEN; struct hlsl_type *clone_hlsl_type(struct hlsl_type *old) DECLSPEC_HIDDEN; struct hlsl_type *get_type(struct hlsl_scope *scope, const char *name, BOOL recursive) DECLSPEC_HIDDEN; +BOOL is_row_major(const struct hlsl_type *type) DECLSPEC_HIDDEN; BOOL find_function(const char *name) DECLSPEC_HIDDEN; unsigned int components_count_type(struct hlsl_type *type) DECLSPEC_HIDDEN; BOOL compare_hlsl_types(const struct hlsl_type *t1, const struct hlsl_type *t2) DECLSPEC_HIDDEN; diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y index 312949c5840..d6c64edcace 100644 --- a/dlls/d3dcompiler_43/hlsl.y +++ b/dlls/d3dcompiler_43/hlsl.y @@ -717,6 +717,15 @@ static BOOL add_struct_field(struct list *fields, struct hlsl_struct_field *fiel return TRUE; }
+BOOL is_row_major(const struct hlsl_type *type) +{
- if (type->modifiers & HLSL_MODIFIER_ROW_MAJOR)
return TRUE;
- if (type->modifiers & HLSL_MODIFIER_COLUMN_MAJOR)
return FALSE;
- return hlsl_ctx.matrix_majority == HLSL_ROW_MAJOR;
+}
static struct hlsl_type *apply_type_modifiers(struct hlsl_type *type, DWORD *modifiers, struct source_location loc) { struct hlsl_type *new_type; @@ -729,6 +738,9 @@ static struct hlsl_type *apply_type_modifiers(struct hlsl_type *type, DWORD *mod
new_type->modifiers = add_modifiers(new_type->modifiers, *modifiers, loc); *modifiers &= ~HLSL_TYPE_MODIFIERS_MASK;
- if (new_type->type == HLSL_CLASS_MATRIX)
return new_type;new_type->reg_size = is_row_major(new_type) ? new_type->dimy : new_type->dimx;
}
I think we should have one of the "majority" modifiers always stored in the hlsl_type for matrices, since it's actually a significant distinction. Notice that the default matrix majority can be changed over the course of a shader via a #pragma.