Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • wine/vkd3d
  • stefan/vkd3d
  • cmccarthy/vkd3d
  • giomasce/vkd3d
  • fcasas/vkd3d
  • jactry/vkd3d
  • ReDress/vkd3d
  • mstorsjo/vkd3d
  • huw/vkd3d
  • julliard/vkd3d
  • bshanks/vkd3d
  • zfigura/vkd3d
  • hverbeet/vkd3d
  • DarkShadow44/vkd3d
  • nsivov/vkd3d
  • dhary686/vkd3d
  • Mystral/vkd3d
  • maljaf/vkd3d
  • smcv/vkd3d
  • flibitijibibo/vkd3d
  • q4a/vkd3d
  • jsikorski/vkd3d
  • alesliehughes/vkd3d-alesliehughes
  • vitorhnn/vkd3d
  • agusev/vkd3d
  • etang-cw/vkd3d
  • petrathekat/vkd3d
  • simon.mr995/vkd3d
  • sgwaki/vkd3d
  • jacek/vkd3d
  • fweimer/vkd3d
  • Clara/vkd3d
  • disini/vkd3d
  • antenabr2/vkd3d
  • gilvbp/vkd3d
  • yshui/vkd3d
  • shaunren/vkd3d
  • jennetsaryyewa96/vkd3d
  • Jamesattay/vkd3d
  • zacemmneeto77/vkd3d
  • GermanAizek/vkd3d
  • opespinach/vkd3d
  • ruslanboyka201/vkd3d
  • navi/vkd3d
  • Feifan/vkd3d
  • yashmhmdly172/vkd3d
  • Sec32fun32/vkd3d
  • ritalat/vkd3d
  • ivyl/vkd3d
  • baikaishiuc/vkd3d
  • austin987/vkd3d
  • TornadoCookie/vkd3d
52 results
Show changes
Commits on Source (4)
...@@ -3541,6 +3541,51 @@ static bool lower_ternary(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, stru ...@@ -3541,6 +3541,51 @@ static bool lower_ternary(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, stru
return true; return true;
} }
static bool lower_resource_load_bias(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, void *context)
{
struct hlsl_ir_node *swizzle, *store;
struct hlsl_ir_resource_load *load;
struct hlsl_ir_load *tmp_load;
struct hlsl_ir_var *tmp_var;
struct hlsl_deref deref;
if (instr->type != HLSL_IR_RESOURCE_LOAD)
return false;
load = hlsl_ir_resource_load(instr);
if (load->load_type != HLSL_RESOURCE_SAMPLE_LOD
&& load->load_type != HLSL_RESOURCE_SAMPLE_LOD_BIAS)
return false;
if (!load->lod.node)
return false;
if (!(tmp_var = hlsl_new_synthetic_var(ctx, "coords-with-lod",
hlsl_get_vector_type(ctx, HLSL_TYPE_FLOAT, 4), &instr->loc)))
return false;
if (!(swizzle = hlsl_new_swizzle(ctx, HLSL_SWIZZLE(X, X, X, X), 4, load->lod.node, &load->lod.node->loc)))
return false;
list_add_before(&instr->entry, &swizzle->entry);
if (!(store = hlsl_new_simple_store(ctx, tmp_var, swizzle)))
return false;
list_add_before(&instr->entry, &store->entry);
hlsl_init_simple_deref_from_var(&deref, tmp_var);
if (!(store = hlsl_new_store_index(ctx, &deref, NULL, load->coords.node, 0, &instr->loc)))
return false;
list_add_before(&instr->entry, &store->entry);
if (!(tmp_load = hlsl_new_var_load(ctx, tmp_var, &instr->loc)))
return false;
list_add_before(&instr->entry, &tmp_load->node.entry);
hlsl_src_remove(&load->coords);
hlsl_src_from_node(&load->coords, &tmp_load->node);
hlsl_src_remove(&load->lod);
return true;
}
static bool lower_comparison_operators(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, static bool lower_comparison_operators(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr,
struct hlsl_block *block) struct hlsl_block *block)
{ {
...@@ -11059,13 +11104,14 @@ static void process_entry_function(struct hlsl_ctx *ctx, ...@@ -11059,13 +11104,14 @@ static void process_entry_function(struct hlsl_ctx *ctx,
append_output_var_copy(ctx, entry_func, entry_func->return_var); append_output_var_copy(ctx, entry_func, entry_func->return_var);
} }
if (profile->major_version >= 4) if (hlsl_version_ge(ctx, 4, 0))
{ {
hlsl_transform_ir(ctx, lower_discard_neg, body, NULL); hlsl_transform_ir(ctx, lower_discard_neg, body, NULL);
} }
else else
{ {
hlsl_transform_ir(ctx, lower_discard_nz, body, NULL); hlsl_transform_ir(ctx, lower_discard_nz, body, NULL);
hlsl_transform_ir(ctx, lower_resource_load_bias, body, NULL);
} }
loop_unrolling_execute(ctx, body); loop_unrolling_execute(ctx, body);
......
...@@ -703,7 +703,56 @@ static enum vkd3d_result vsir_program_lower_sm1_sincos(struct vsir_program *prog ...@@ -703,7 +703,56 @@ static enum vkd3d_result vsir_program_lower_sm1_sincos(struct vsir_program *prog
return VKD3D_OK; return VKD3D_OK;
} }
static enum vkd3d_result vsir_program_lower_tex(struct vsir_program *program, struct vkd3d_shader_instruction *tex) static enum vkd3d_result vsir_program_lower_texldp(struct vsir_program *program,
struct vkd3d_shader_instruction *tex, unsigned int *tmp_idx)
{
struct vkd3d_shader_instruction_array *instructions = &program->instructions;
struct vkd3d_shader_location *location = &tex->location;
struct vkd3d_shader_instruction *div_ins, *tex_ins;
size_t pos = tex - instructions->elements;
unsigned int w_comp;
w_comp = vsir_swizzle_get_component(tex->src[0].swizzle, 3);
if (!shader_instruction_array_insert_at(instructions, pos + 1, 2))
return VKD3D_ERROR_OUT_OF_MEMORY;
if (*tmp_idx == ~0u)
*tmp_idx = program->temp_count++;
div_ins = &instructions->elements[pos + 1];
tex_ins = &instructions->elements[pos + 2];
if (!vsir_instruction_init_with_params(program, div_ins, location, VKD3DSIH_DIV, 1, 2))
return VKD3D_ERROR_OUT_OF_MEMORY;
vsir_dst_param_init(&div_ins->dst[0], VKD3DSPR_TEMP, VKD3D_DATA_FLOAT, 1);
div_ins->dst[0].reg.dimension = VSIR_DIMENSION_VEC4;
div_ins->dst[0].reg.idx[0].offset = *tmp_idx;
div_ins->dst[0].write_mask = VKD3DSP_WRITEMASK_ALL;
div_ins->src[0] = tex->src[0];
div_ins->src[1] = tex->src[0];
div_ins->src[1].swizzle = vkd3d_shader_create_swizzle(w_comp, w_comp, w_comp, w_comp);
if (!vsir_instruction_init_with_params(program, tex_ins, location, VKD3DSIH_TEX, 1, 2))
return VKD3D_ERROR_OUT_OF_MEMORY;
tex_ins->dst[0] = tex->dst[0];
tex_ins->src[0].reg = div_ins->dst[0].reg;
tex_ins->src[0].swizzle = VKD3D_SHADER_NO_SWIZZLE;
tex_ins->src[1] = tex->src[1];
vkd3d_shader_instruction_make_nop(tex);
return VKD3D_OK;
}
static enum vkd3d_result vsir_program_lower_tex(struct vsir_program *program,
struct vkd3d_shader_instruction *tex, struct vkd3d_shader_message_context *message_context)
{ {
unsigned int idx = tex->src[1].reg.idx[0].offset; unsigned int idx = tex->src[1].reg.idx[0].offset;
struct vkd3d_shader_src_param *srcs; struct vkd3d_shader_src_param *srcs;
...@@ -711,16 +760,34 @@ static enum vkd3d_result vsir_program_lower_tex(struct vsir_program *program, st ...@@ -711,16 +760,34 @@ static enum vkd3d_result vsir_program_lower_tex(struct vsir_program *program, st
VKD3D_ASSERT(tex->src[1].reg.idx_count == 1); VKD3D_ASSERT(tex->src[1].reg.idx_count == 1);
VKD3D_ASSERT(!tex->src[1].reg.idx[0].rel_addr); VKD3D_ASSERT(!tex->src[1].reg.idx[0].rel_addr);
if (!(srcs = shader_src_param_allocator_get(&program->instructions.src_params, 3))) if (!(srcs = shader_src_param_allocator_get(&program->instructions.src_params, 4)))
return VKD3D_ERROR_OUT_OF_MEMORY; return VKD3D_ERROR_OUT_OF_MEMORY;
srcs[0] = tex->src[0]; srcs[0] = tex->src[0];
vsir_src_param_init_resource(&srcs[1], idx, idx); vsir_src_param_init_resource(&srcs[1], idx, idx);
vsir_src_param_init_sampler(&srcs[2], idx, idx); vsir_src_param_init_sampler(&srcs[2], idx, idx);
tex->opcode = VKD3DSIH_SAMPLE; if (!tex->flags)
tex->src = srcs; {
tex->src_count = 3; tex->opcode = VKD3DSIH_SAMPLE;
tex->src = srcs;
tex->src_count = 3;
}
else if (tex->flags == VKD3DSI_TEXLD_BIAS)
{
tex->opcode = VKD3DSIH_SAMPLE_B;
tex->src = srcs;
tex->src_count = 4;
srcs[3] = tex->src[0];
srcs[3].swizzle = VKD3D_SHADER_SWIZZLE(W, W, W, W);
}
else
{
vkd3d_shader_error(message_context, &tex->location,
VKD3D_SHADER_ERROR_VSIR_NOT_IMPLEMENTED, "Unhandled tex flags %#x.", tex->flags);
return VKD3D_ERROR_NOT_IMPLEMENTED;
}
return VKD3D_OK; return VKD3D_OK;
} }
...@@ -885,8 +952,16 @@ static enum vkd3d_result vsir_program_lower_instructions(struct vsir_program *pr ...@@ -885,8 +952,16 @@ static enum vkd3d_result vsir_program_lower_instructions(struct vsir_program *pr
break; break;
case VKD3DSIH_TEX: case VKD3DSIH_TEX:
if ((ret = vsir_program_lower_tex(program, ins)) < 0) if (ins->flags == VKD3DSI_TEXLD_PROJECT)
return ret; {
if ((ret = vsir_program_lower_texldp(program, ins, &tmp_idx)) < 0)
return ret;
}
else
{
if ((ret = vsir_program_lower_tex(program, ins, message_context)) < 0)
return ret;
}
break; break;
case VKD3DSIH_TEXLDD: case VKD3DSIH_TEXLDD:
......
...@@ -37,11 +37,11 @@ probe (0, 0) rgba (10.0, 0.0, 10.0, 0.0) ...@@ -37,11 +37,11 @@ probe (0, 0) rgba (10.0, 0.0, 10.0, 0.0)
uniform 0 float4 7.5 0.0 0.0 0.0 uniform 0 float4 7.5 0.0 0.0 0.0
todo(msl) draw quad todo(msl) draw quad
todo(sm<4) probe (0, 0) rgba(4.0, 0.0, 10.0, 0.0) probe (0, 0) rgba(4.0, 0.0, 10.0, 0.0)
uniform 0 float4 8.5 0.0 0.0 0.0 uniform 0 float4 8.5 0.0 0.0 0.0
todo(msl) draw quad todo(msl) draw quad
todo(sm<4) probe (0, 0) rgba(0.0, 0.0, 10.0, 0.0) probe (0, 0) rgba(0.0, 0.0, 10.0, 0.0)
[require] [require]
shader model >= 3.0 shader model >= 3.0
...@@ -65,8 +65,8 @@ probe (0, 0) rgba (10.0, 0.0, 10.0, 0.0) ...@@ -65,8 +65,8 @@ probe (0, 0) rgba (10.0, 0.0, 10.0, 0.0)
uniform 0 float4 7.5 0.0 0.0 0.0 uniform 0 float4 7.5 0.0 0.0 0.0
todo(msl) draw quad todo(msl) draw quad
todo(sm<4) probe (0,0) rgba (4.0, 0.0, 10.0, 0.0) probe (0,0) rgba(4.0, 0.0, 10.0, 0.0)
uniform 0 float4 8.5 0.0 0.0 0.0 uniform 0 float4 8.5 0.0 0.0 0.0
todo(msl) draw quad todo(msl) draw quad
todo(sm<4) probe (0,0) rgba (0.0, 0.0, 10.0, 0.0) probe (0,0) rgba(0.0, 0.0, 10.0, 0.0)
...@@ -69,6 +69,34 @@ float4 main() : sv_target ...@@ -69,6 +69,34 @@ float4 main() : sv_target
return tex1D(s, 0.0); return tex1D(s, 0.0);
} }
[srv 0]
size (2d, 3, 3)
0.0 0.0 0.0 1.0 1.0 0.0 0.0 1.0 2.0 0.0 0.0 1.0
0.0 1.0 0.0 1.0 1.0 1.0 0.0 1.0 2.0 1.0 0.0 1.0
0.0 2.0 0.0 1.0 1.0 2.0 0.0 1.0 2.0 2.0 0.0 1.0
[pixel shader fail(sm>=6)]
sampler s;
float4 f;
float4 main() : sv_target
{
return tex2Dproj(s, f);
}
[test]
uniform 0 float4 50.0 50.0 42.0 100
todo(msl) draw quad
probe (0, 0) rgba(1.0, 1.0, 0, 1.0)
uniform 0 float4 0.075 0.025 -42.0 0.1
todo(msl) draw quad
probe (0, 0) rgba(1.75, 0.25, 0, 1.0)
uniform 0 float4 0.5 1.5 0.0 2.0
todo(msl) draw quad
probe (0, 0) rgba(0.25, 1.75, 0, 1.0)
uniform 0 float4 1.0 1.0 0.0 0.0
todo(msl) draw quad
probe (0, 0) rgba(2.0, 2.0, 0, 1.0)
[sampler 0] [sampler 0]
filter linear linear linear filter linear linear linear
......