mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-04 16:32:39 +00:00
Merge remote-tracking branch 'upstream/main'
This commit is contained in:
commit
e4f3e931f7
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
@ -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());
|
||||||
|
Loading…
Reference in New Issue
Block a user