mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
vkd3d-shader: Parse buffer declarations.
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Matteo Bruni <mbruni@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
c30ad6ddea
commit
4695690ac8
@ -592,6 +592,22 @@ struct hlsl_ir_function_decl *hlsl_new_func_decl(struct hlsl_ctx *ctx, struct hl
|
||||
return decl;
|
||||
}
|
||||
|
||||
struct hlsl_buffer *hlsl_new_buffer(struct hlsl_ctx *ctx, enum hlsl_buffer_type type, const char *name,
|
||||
const struct hlsl_reg_reservation *reservation, struct vkd3d_shader_location loc)
|
||||
{
|
||||
struct hlsl_buffer *buffer;
|
||||
|
||||
if (!(buffer = hlsl_alloc(ctx, sizeof(*buffer))))
|
||||
return NULL;
|
||||
buffer->type = type;
|
||||
buffer->name = name;
|
||||
if (reservation)
|
||||
buffer->reservation = *reservation;
|
||||
buffer->loc = loc;
|
||||
list_add_tail(&ctx->buffers, &buffer->entry);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static int compare_hlsl_types_rb(const void *key, const struct rb_entry *entry)
|
||||
{
|
||||
const struct hlsl_type *type = RB_ENTRY_VALUE(entry, const struct hlsl_type, scope_entry);
|
||||
@ -1583,12 +1599,14 @@ static bool hlsl_ctx_init(struct hlsl_ctx *ctx, const struct hlsl_profile_info *
|
||||
|
||||
list_init(&ctx->static_initializers);
|
||||
list_init(&ctx->extern_vars);
|
||||
list_init(&ctx->buffers);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void hlsl_ctx_cleanup(struct hlsl_ctx *ctx)
|
||||
{
|
||||
struct hlsl_buffer *buffer, *next_buffer;
|
||||
struct hlsl_scope *scope, *next_scope;
|
||||
struct hlsl_ir_var *var, *next_var;
|
||||
struct hlsl_type *type, *next_type;
|
||||
@ -1611,6 +1629,12 @@ static void hlsl_ctx_cleanup(struct hlsl_ctx *ctx)
|
||||
|
||||
LIST_FOR_EACH_ENTRY_SAFE(type, next_type, &ctx->types, struct hlsl_type, entry)
|
||||
hlsl_free_type(type);
|
||||
|
||||
LIST_FOR_EACH_ENTRY_SAFE(buffer, next_buffer, &ctx->buffers, struct hlsl_buffer, entry)
|
||||
{
|
||||
vkd3d_free((void *)buffer->name);
|
||||
vkd3d_free(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
int hlsl_compile_shader(const struct vkd3d_shader_code *hlsl, const struct vkd3d_shader_compile_info *compile_info,
|
||||
|
@ -417,6 +417,21 @@ struct hlsl_vec4
|
||||
float f[4];
|
||||
};
|
||||
|
||||
enum hlsl_buffer_type
|
||||
{
|
||||
HLSL_BUFFER_CONSTANT,
|
||||
HLSL_BUFFER_TEXTURE,
|
||||
};
|
||||
|
||||
struct hlsl_buffer
|
||||
{
|
||||
struct vkd3d_shader_location loc;
|
||||
enum hlsl_buffer_type type;
|
||||
const char *name;
|
||||
struct hlsl_reg_reservation reservation;
|
||||
struct list entry;
|
||||
};
|
||||
|
||||
struct hlsl_ctx
|
||||
{
|
||||
const struct hlsl_profile_info *profile;
|
||||
@ -435,6 +450,7 @@ struct hlsl_ctx
|
||||
struct list scopes;
|
||||
struct list extern_vars;
|
||||
|
||||
struct list buffers;
|
||||
struct list types;
|
||||
struct rb_tree functions;
|
||||
const struct hlsl_ir_function_decl *cur_function;
|
||||
@ -609,6 +625,8 @@ struct hlsl_type *hlsl_new_array_type(struct hlsl_ctx *ctx, struct hlsl_type *ba
|
||||
unsigned int array_size) DECLSPEC_HIDDEN;
|
||||
struct hlsl_ir_node *hlsl_new_binary_expr(struct hlsl_ctx *ctx, enum hlsl_ir_expr_op op, struct hlsl_ir_node *arg1,
|
||||
struct hlsl_ir_node *arg2) DECLSPEC_HIDDEN;
|
||||
struct hlsl_buffer *hlsl_new_buffer(struct hlsl_ctx *ctx, enum hlsl_buffer_type type, const char *name,
|
||||
const struct hlsl_reg_reservation *reservation, struct vkd3d_shader_location loc) DECLSPEC_HIDDEN;
|
||||
struct hlsl_ir_expr *hlsl_new_cast(struct hlsl_ctx *ctx, struct hlsl_ir_node *node, struct hlsl_type *type,
|
||||
struct vkd3d_shader_location *loc) DECLSPEC_HIDDEN;
|
||||
struct hlsl_ir_expr *hlsl_new_copy(struct hlsl_ctx *ctx, struct hlsl_ir_node *node) DECLSPEC_HIDDEN;
|
||||
|
@ -1561,6 +1561,7 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t
|
||||
struct hlsl_reg_reservation reg_reservation;
|
||||
struct parse_colon_attribute colon_attribute;
|
||||
struct hlsl_semantic semantic;
|
||||
enum hlsl_buffer_type buffer_type;
|
||||
}
|
||||
|
||||
%token KW_BLENDSTATE
|
||||
@ -1711,6 +1712,8 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t
|
||||
|
||||
%type <boolval> boolean
|
||||
|
||||
%type <buffer_type> buffer_type
|
||||
|
||||
%type <colon_attribute> colon_attribute
|
||||
|
||||
%type <function> func_declaration
|
||||
@ -1776,6 +1779,7 @@ hlsl_prog:
|
||||
|
||||
hlsl_add_function(ctx, $2.name, $2.decl, false);
|
||||
}
|
||||
| hlsl_prog buffer_declaration
|
||||
| hlsl_prog declaration_statement
|
||||
{
|
||||
if (!list_empty($2))
|
||||
@ -1785,6 +1789,32 @@ hlsl_prog:
|
||||
| hlsl_prog preproc_directive
|
||||
| hlsl_prog ';'
|
||||
|
||||
buffer_declaration:
|
||||
buffer_type any_identifier colon_attribute '{' declaration_statement_list '}'
|
||||
{
|
||||
struct hlsl_buffer *buffer;
|
||||
|
||||
if ($3.semantic.name)
|
||||
hlsl_error(ctx, @3, VKD3D_SHADER_ERROR_HLSL_INVALID_SEMANTIC, "Semantics are not allowed on buffers.");
|
||||
|
||||
if (!(buffer = hlsl_new_buffer(ctx, $1, $2, &$3.reg_reservation, @2)))
|
||||
YYABORT;
|
||||
}
|
||||
|
||||
buffer_type:
|
||||
KW_CBUFFER
|
||||
{
|
||||
$$ = HLSL_BUFFER_CONSTANT;
|
||||
}
|
||||
| KW_TBUFFER
|
||||
{
|
||||
$$ = HLSL_BUFFER_TEXTURE;
|
||||
}
|
||||
|
||||
declaration_statement_list:
|
||||
declaration_statement
|
||||
| declaration_statement_list declaration_statement
|
||||
|
||||
preproc_directive:
|
||||
PRE_LINE STRING
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user