mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
vkd3d-shader/hlsl: Replace register offsets with index paths in load initializations.
The transform_deref_paths_into_offsets pass turns these index paths back into register offsets. Signed-off-by: Francisco Casas <fcasas@codeweavers.com> Signed-off-by: Giovanni Mascellani <gmascellani@codeweavers.com>
This commit is contained in:
committed by
Alexandre Julliard
parent
a2996c2d59
commit
4fede46c9a
Notes:
Alexandre Julliard
2022-10-18 00:13:00 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Zebediah Figura (@zfigura) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/5
@ -21,6 +21,48 @@
|
||||
#include "hlsl.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/* TODO: remove when no longer needed, only used for transform_deref_paths_into_offsets() */
|
||||
static void replace_deref_path_with_offset(struct hlsl_ctx *ctx, struct hlsl_deref *deref,
|
||||
struct hlsl_ir_node *instr)
|
||||
{
|
||||
struct hlsl_ir_node *offset;
|
||||
struct hlsl_block block;
|
||||
|
||||
if (!deref->var)
|
||||
return;
|
||||
|
||||
if (!(offset = hlsl_new_offset_instr_from_deref(ctx, &block, deref, &instr->loc)))
|
||||
return;
|
||||
list_move_before(&instr->entry, &block.instrs);
|
||||
|
||||
hlsl_cleanup_deref(deref);
|
||||
hlsl_src_from_node(&deref->offset, offset);
|
||||
}
|
||||
|
||||
/* TODO: remove when no longer needed. */
|
||||
static bool transform_deref_paths_into_offsets(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, void *context)
|
||||
{
|
||||
switch(instr->type)
|
||||
{
|
||||
case HLSL_IR_LOAD:
|
||||
replace_deref_path_with_offset(ctx, &hlsl_ir_load(instr)->src, instr);
|
||||
return true;
|
||||
|
||||
case HLSL_IR_STORE:
|
||||
replace_deref_path_with_offset(ctx, &hlsl_ir_store(instr)->lhs, instr);
|
||||
return true;
|
||||
|
||||
case HLSL_IR_RESOURCE_LOAD:
|
||||
replace_deref_path_with_offset(ctx, &hlsl_ir_resource_load(instr)->resource, instr);
|
||||
replace_deref_path_with_offset(ctx, &hlsl_ir_resource_load(instr)->sampler, instr);
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Split uniforms into two variables representing the constant and temp
|
||||
* registers, and copy the former to the latter, so that writes to uniforms
|
||||
* work. */
|
||||
@ -1890,6 +1932,8 @@ int hlsl_emit_bytecode(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry
|
||||
|
||||
list_move_head(&body->instrs, &ctx->static_initializers);
|
||||
|
||||
transform_ir(ctx, transform_deref_paths_into_offsets, body, NULL); /* TODO: move forward, remove when no longer needed */
|
||||
|
||||
LIST_FOR_EACH_ENTRY(var, &ctx->globals->vars, struct hlsl_ir_var, scope_entry)
|
||||
{
|
||||
if (var->modifiers & HLSL_STORAGE_UNIFORM)
|
||||
|
Reference in New Issue
Block a user