Merge remote-tracking branch 'upstream/main'

This commit is contained in:
rainmakerv2 2024-11-30 06:14:14 +08:00
commit e4f3e931f7
4 changed files with 10 additions and 8 deletions

View File

@ -158,13 +158,12 @@ void Translator::DS_WRITE(int bit_size, bool is_signed, bool is_pair, bool strid
void Translator::DS_SWIZZLE_B32(const GcnInst& inst) { void Translator::DS_SWIZZLE_B32(const GcnInst& inst) {
const u8 offset0 = inst.control.ds.offset0; const u8 offset0 = inst.control.ds.offset0;
const u8 offset1 = inst.control.ds.offset1; const u8 offset1 = inst.control.ds.offset1;
const IR::U32 src{GetSrc(inst.src[1])}; const IR::U32 src{GetSrc(inst.src[0])};
// ASSERT(offset1 & 0x80); // ASSERT(offset1 & 0x80);
const IR::U32 lane_id = ir.LaneId(); const IR::U32 lane_id = ir.LaneId();
const IR::U32 id_in_group = ir.BitwiseAnd(lane_id, ir.Imm32(0b11)); const IR::U32 id_in_group = ir.BitwiseAnd(lane_id, ir.Imm32(0b11));
const IR::U32 base = ir.ShiftLeftLogical(id_in_group, ir.Imm32(1)); const IR::U32 base = ir.ShiftLeftLogical(id_in_group, ir.Imm32(1));
const IR::U32 index = const IR::U32 index = ir.BitFieldExtract(ir.Imm32(offset0), base, ir.Imm32(2));
ir.IAdd(lane_id, ir.BitFieldExtract(ir.Imm32(offset0), base, ir.Imm32(2)));
SetDst(inst.dst[0], ir.QuadShuffle(src, index)); SetDst(inst.dst[0], ir.QuadShuffle(src, index));
} }

View File

@ -17,6 +17,7 @@
#include "shader_recompiler/ir/type.h" #include "shader_recompiler/ir/type.h"
#include "shader_recompiler/params.h" #include "shader_recompiler/params.h"
#include "shader_recompiler/runtime_info.h" #include "shader_recompiler/runtime_info.h"
#include "video_core/amdgpu/liverpool.h"
#include "video_core/amdgpu/resource.h" #include "video_core/amdgpu/resource.h"
namespace Shader { namespace Shader {
@ -251,10 +252,10 @@ struct Info {
bnd.user_data += ud_mask.NumRegs(); bnd.user_data += ud_mask.NumRegs();
} }
[[nodiscard]] std::pair<u32, u32> GetDrawOffsets() const { [[nodiscard]] std::pair<u32, u32> GetDrawOffsets(const AmdGpu::Liverpool::Regs& regs) const {
u32 vertex_offset = 0; u32 vertex_offset = regs.index_offset;
u32 instance_offset = 0; u32 instance_offset = 0;
if (vertex_offset_sgpr != -1) { if (vertex_offset == 0 && vertex_offset_sgpr != -1) {
vertex_offset = user_data[vertex_offset_sgpr]; vertex_offset = user_data[vertex_offset_sgpr];
} }
if (instance_offset_sgpr != -1) { if (instance_offset_sgpr != -1) {

View File

@ -1111,7 +1111,8 @@ struct Liverpool {
INSERT_PADDING_WORDS(2); INSERT_PADDING_WORDS(2);
std::array<ViewportScissor, NumViewports> viewport_scissors; std::array<ViewportScissor, NumViewports> viewport_scissors;
std::array<ViewportDepth, NumViewports> viewport_depths; std::array<ViewportDepth, NumViewports> viewport_depths;
INSERT_PADDING_WORDS(0xA103 - 0xA0D4); INSERT_PADDING_WORDS(0xA102 - 0xA0D4);
u32 index_offset;
u32 primitive_restart_index; u32 primitive_restart_index;
INSERT_PADDING_WORDS(1); INSERT_PADDING_WORDS(1);
BlendConstants blend_constants; BlendConstants blend_constants;
@ -1380,6 +1381,7 @@ static_assert(GFX6_3D_REG_INDEX(color_target_mask) == 0xA08E);
static_assert(GFX6_3D_REG_INDEX(color_shader_mask) == 0xA08F); static_assert(GFX6_3D_REG_INDEX(color_shader_mask) == 0xA08F);
static_assert(GFX6_3D_REG_INDEX(generic_scissor) == 0xA090); static_assert(GFX6_3D_REG_INDEX(generic_scissor) == 0xA090);
static_assert(GFX6_3D_REG_INDEX(viewport_scissors) == 0xA094); static_assert(GFX6_3D_REG_INDEX(viewport_scissors) == 0xA094);
static_assert(GFX6_3D_REG_INDEX(index_offset) == 0xA102);
static_assert(GFX6_3D_REG_INDEX(primitive_restart_index) == 0xA103); static_assert(GFX6_3D_REG_INDEX(primitive_restart_index) == 0xA103);
static_assert(GFX6_3D_REG_INDEX(stencil_control) == 0xA10B); static_assert(GFX6_3D_REG_INDEX(stencil_control) == 0xA10B);
static_assert(GFX6_3D_REG_INDEX(viewports) == 0xA10F); static_assert(GFX6_3D_REG_INDEX(viewports) == 0xA10F);

View File

@ -200,7 +200,7 @@ void Rasterizer::Draw(bool is_indexed, u32 index_offset) {
BeginRendering(*pipeline, state); BeginRendering(*pipeline, state);
UpdateDynamicState(*pipeline); UpdateDynamicState(*pipeline);
const auto [vertex_offset, instance_offset] = vs_info.GetDrawOffsets(); const auto [vertex_offset, instance_offset] = vs_info.GetDrawOffsets(regs);
const auto cmdbuf = scheduler.CommandBuffer(); const auto cmdbuf = scheduler.CommandBuffer();
cmdbuf.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline->Handle()); cmdbuf.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline->Handle());