forked from eden-emu/eden
reverts 9f4ef30b55
& 44dc152a2b
This commit is contained in:
parent
7db5eb8f08
commit
aa3215db65
8 changed files with 51 additions and 31 deletions
|
@ -6,8 +6,8 @@
|
||||||
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
|
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
|
||||||
#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
|
#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
|
||||||
#include "shader_recompiler/frontend/ir/value.h"
|
#include "shader_recompiler/frontend/ir/value.h"
|
||||||
#include "shader_recompiler/runtime_info.h"
|
|
||||||
#include "shader_recompiler/profile.h"
|
#include "shader_recompiler/profile.h"
|
||||||
|
#include "shader_recompiler/runtime_info.h"
|
||||||
#include "shader_recompiler/shader_info.h"
|
#include "shader_recompiler/shader_info.h"
|
||||||
|
|
||||||
namespace Shader::Backend::GLASM {
|
namespace Shader::Backend::GLASM {
|
||||||
|
@ -404,16 +404,60 @@ void EmitInvocationId(EmitContext& ctx, IR::Inst& inst) {
|
||||||
void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) {
|
void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) {
|
||||||
switch (ctx.stage) {
|
switch (ctx.stage) {
|
||||||
case Stage::TessellationControl:
|
case Stage::TessellationControl:
|
||||||
|
ctx.Add("SHL.U {}.x,primitive.vertexcount,16;", inst);
|
||||||
|
break;
|
||||||
case Stage::TessellationEval:
|
case Stage::TessellationEval:
|
||||||
ctx.Add("SHL.U {}.x,primitive.vertexcount,16;", inst);
|
ctx.Add("SHL.U {}.x,primitive.vertexcount,16;", inst);
|
||||||
break;
|
break;
|
||||||
case Stage::Geometry:
|
case Stage::Fragment:
|
||||||
ctx.Add("SHL.U {}.x,{},16;", inst,
|
// Return sample mask in upper 16 bits
|
||||||
InputTopologyVertices::vertices(ctx.runtime_info.input_topology));
|
ctx.Add("SHL.U {}.x,fragment.samplemask,16;", inst);
|
||||||
|
break;
|
||||||
|
case Stage::Geometry: {
|
||||||
|
// Return vertex count in upper 16 bits based on input topology
|
||||||
|
// Using a lookup table approach for vertex counts
|
||||||
|
const std::array<u32, 5> vertex_counts = {
|
||||||
|
1, // Points
|
||||||
|
2, // Lines
|
||||||
|
4, // LinesAdjacency
|
||||||
|
3, // Triangles
|
||||||
|
6 // TrianglesAdjacency
|
||||||
|
};
|
||||||
|
|
||||||
|
// Map the input topology to an index in our lookup table
|
||||||
|
u32 topology_index = 0;
|
||||||
|
switch (ctx.runtime_info.input_topology) {
|
||||||
|
case Shader::InputTopology::Lines:
|
||||||
|
topology_index = 1;
|
||||||
|
break;
|
||||||
|
case Shader::InputTopology::LinesAdjacency:
|
||||||
|
topology_index = 2;
|
||||||
|
break;
|
||||||
|
case Shader::InputTopology::Triangles:
|
||||||
|
topology_index = 3;
|
||||||
|
break;
|
||||||
|
case Shader::InputTopology::TrianglesAdjacency:
|
||||||
|
topology_index = 4;
|
||||||
|
break;
|
||||||
|
case Shader::InputTopology::Points:
|
||||||
|
default:
|
||||||
|
topology_index = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the vertex count from the lookup table and shift it
|
||||||
|
const u32 result = vertex_counts[topology_index] << 16;
|
||||||
|
ctx.Add("MOV.S {}.x,0x{:x};", inst, result);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Stage::Compute:
|
||||||
|
// Return standard format (0x00ff0000)
|
||||||
|
ctx.Add("MOV.S {}.x,0x00ff0000;", inst);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
LOG_WARNING(Shader, "(STUBBED) called");
|
// Return standard format (0x00ff0000)
|
||||||
ctx.Add("MOV.S {}.x,0x00ff0000;", inst);
|
ctx.Add("MOV.S {}.x,0x00ff0000;", inst);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -425,14 +469,6 @@ void EmitIsHelperInvocation(EmitContext& ctx, IR::Inst& inst) {
|
||||||
ctx.Add("MOV.S {}.x,fragment.helperthread.x;", inst);
|
ctx.Add("MOV.S {}.x,fragment.helperthread.x;", inst);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitSR_WScaleFactorXY(EmitContext& ctx, IR::Inst& inst) {
|
|
||||||
LOG_WARNING(Shader, "(STUBBED) called");
|
|
||||||
}
|
|
||||||
|
|
||||||
void EmitSR_WScaleFactorZ(EmitContext& ctx, IR::Inst& inst) {
|
|
||||||
LOG_WARNING(Shader, "(STUBBED) called");
|
|
||||||
}
|
|
||||||
|
|
||||||
void EmitYDirection(EmitContext& ctx, IR::Inst& inst) {
|
void EmitYDirection(EmitContext& ctx, IR::Inst& inst) {
|
||||||
ctx.uses_y_direction = true;
|
ctx.uses_y_direction = true;
|
||||||
ctx.Add("MOV.F {}.x,y_direction[0].w;", inst);
|
ctx.Add("MOV.F {}.x,y_direction[0].w;", inst);
|
||||||
|
|
|
@ -72,8 +72,6 @@ void EmitInvocationId(EmitContext& ctx, IR::Inst& inst);
|
||||||
void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst);
|
void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst);
|
||||||
void EmitSampleId(EmitContext& ctx, IR::Inst& inst);
|
void EmitSampleId(EmitContext& ctx, IR::Inst& inst);
|
||||||
void EmitIsHelperInvocation(EmitContext& ctx, IR::Inst& inst);
|
void EmitIsHelperInvocation(EmitContext& ctx, IR::Inst& inst);
|
||||||
void EmitSR_WScaleFactorXY(EmitContext& ctx, IR::Inst& inst);
|
|
||||||
void EmitSR_WScaleFactorZ(EmitContext& ctx, IR::Inst& inst);
|
|
||||||
void EmitYDirection(EmitContext& ctx, IR::Inst& inst);
|
void EmitYDirection(EmitContext& ctx, IR::Inst& inst);
|
||||||
void EmitResolutionDownFactor(EmitContext& ctx, IR::Inst& inst);
|
void EmitResolutionDownFactor(EmitContext& ctx, IR::Inst& inst);
|
||||||
void EmitRenderArea(EmitContext& ctx, IR::Inst& inst);
|
void EmitRenderArea(EmitContext& ctx, IR::Inst& inst);
|
||||||
|
|
|
@ -86,8 +86,6 @@ void EmitInvocationId(EmitContext& ctx, IR::Inst& inst);
|
||||||
void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst);
|
void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst);
|
||||||
void EmitSampleId(EmitContext& ctx, IR::Inst& inst);
|
void EmitSampleId(EmitContext& ctx, IR::Inst& inst);
|
||||||
void EmitIsHelperInvocation(EmitContext& ctx, IR::Inst& inst);
|
void EmitIsHelperInvocation(EmitContext& ctx, IR::Inst& inst);
|
||||||
void EmitSR_WScaleFactorXY(EmitContext& ctx, IR::Inst& inst);
|
|
||||||
void EmitSR_WScaleFactorZ(EmitContext& ctx, IR::Inst& inst);
|
|
||||||
void EmitYDirection(EmitContext& ctx, IR::Inst& inst);
|
void EmitYDirection(EmitContext& ctx, IR::Inst& inst);
|
||||||
void EmitResolutionDownFactor(EmitContext& ctx, IR::Inst& inst);
|
void EmitResolutionDownFactor(EmitContext& ctx, IR::Inst& inst);
|
||||||
void EmitRenderArea(EmitContext& ctx, IR::Inst& inst);
|
void EmitRenderArea(EmitContext& ctx, IR::Inst& inst);
|
||||||
|
|
|
@ -75,8 +75,6 @@ Id EmitInvocationId(EmitContext& ctx);
|
||||||
Id EmitInvocationInfo(EmitContext& ctx);
|
Id EmitInvocationInfo(EmitContext& ctx);
|
||||||
Id EmitSampleId(EmitContext& ctx);
|
Id EmitSampleId(EmitContext& ctx);
|
||||||
Id EmitIsHelperInvocation(EmitContext& ctx);
|
Id EmitIsHelperInvocation(EmitContext& ctx);
|
||||||
Id EmitSR_WScaleFactorXY(EmitContext& ctx);
|
|
||||||
Id EmitSR_WScaleFactorZ(EmitContext& ctx);
|
|
||||||
Id EmitYDirection(EmitContext& ctx);
|
Id EmitYDirection(EmitContext& ctx);
|
||||||
Id EmitResolutionDownFactor(EmitContext& ctx);
|
Id EmitResolutionDownFactor(EmitContext& ctx);
|
||||||
Id EmitRenderArea(EmitContext& ctx);
|
Id EmitRenderArea(EmitContext& ctx);
|
||||||
|
|
|
@ -102,8 +102,6 @@ public:
|
||||||
[[nodiscard]] U32 InvocationInfo();
|
[[nodiscard]] U32 InvocationInfo();
|
||||||
[[nodiscard]] U32 SampleId();
|
[[nodiscard]] U32 SampleId();
|
||||||
[[nodiscard]] U1 IsHelperInvocation();
|
[[nodiscard]] U1 IsHelperInvocation();
|
||||||
[[nodiscard]] U32 SR_WScaleFactorXY();
|
|
||||||
[[nodiscard]] U32 SR_WScaleFactorZ();
|
|
||||||
[[nodiscard]] F32 YDirection();
|
[[nodiscard]] F32 YDirection();
|
||||||
|
|
||||||
[[nodiscard]] F32 ResolutionDownFactor();
|
[[nodiscard]] F32 ResolutionDownFactor();
|
||||||
|
|
|
@ -62,8 +62,6 @@ OPCODE(InvocationId, U32,
|
||||||
OPCODE(InvocationInfo, U32, )
|
OPCODE(InvocationInfo, U32, )
|
||||||
OPCODE(SampleId, U32, )
|
OPCODE(SampleId, U32, )
|
||||||
OPCODE(IsHelperInvocation, U1, )
|
OPCODE(IsHelperInvocation, U1, )
|
||||||
OPCODE(SR_WScaleFactorXY, U32, )
|
|
||||||
OPCODE(SR_WScaleFactorZ, U32, )
|
|
||||||
OPCODE(YDirection, F32, )
|
OPCODE(YDirection, F32, )
|
||||||
OPCODE(ResolutionDownFactor, F32, )
|
OPCODE(ResolutionDownFactor, F32, )
|
||||||
OPCODE(RenderArea, F32x4, )
|
OPCODE(RenderArea, F32x4, )
|
||||||
|
|
|
@ -139,10 +139,10 @@ enum class SpecialRegister : u64 {
|
||||||
return ir.WorkgroupIdZ();
|
return ir.WorkgroupIdZ();
|
||||||
case SpecialRegister::SR_WSCALEFACTOR_XY:
|
case SpecialRegister::SR_WSCALEFACTOR_XY:
|
||||||
LOG_WARNING(Shader, "(STUBBED) SR_WSCALEFACTOR_XY");
|
LOG_WARNING(Shader, "(STUBBED) SR_WSCALEFACTOR_XY");
|
||||||
return ir.SR_WScaleFactorXY();
|
return ir.Imm32(Common::BitCast<u32>(1.0f));
|
||||||
case SpecialRegister::SR_WSCALEFACTOR_Z:
|
case SpecialRegister::SR_WSCALEFACTOR_Z:
|
||||||
LOG_WARNING(Shader, "(STUBBED) SR_WSCALEFACTOR_Z");
|
LOG_WARNING(Shader, "(STUBBED) SR_WSCALEFACTOR_Z");
|
||||||
return ir.SR_WScaleFactorZ();
|
return ir.Imm32(Common::BitCast<u32>(1.0f));
|
||||||
case SpecialRegister::SR_LANEID:
|
case SpecialRegister::SR_LANEID:
|
||||||
return ir.LaneId();
|
return ir.LaneId();
|
||||||
case SpecialRegister::SR_EQMASK:
|
case SpecialRegister::SR_EQMASK:
|
||||||
|
|
|
@ -15,12 +15,6 @@ namespace Tegra {
|
||||||
|
|
||||||
constexpr u32 MacroRegistersStart = 0xE00;
|
constexpr u32 MacroRegistersStart = 0xE00;
|
||||||
constexpr u32 ComputeInline = 0x6D;
|
constexpr u32 ComputeInline = 0x6D;
|
||||||
//start on PR#76 of Eden this is a unused variable in android (need to investigate)
|
|
||||||
|
|
||||||
// Dummy function that uses ComputeInline
|
|
||||||
constexpr void UseComputeInline() {
|
|
||||||
static_cast<void>(ComputeInline); // Suppress unused variable error
|
|
||||||
}
|
|
||||||
|
|
||||||
DmaPusher::DmaPusher(Core::System& system_, GPU& gpu_, MemoryManager& memory_manager_,
|
DmaPusher::DmaPusher(Core::System& system_, GPU& gpu_, MemoryManager& memory_manager_,
|
||||||
Control::ChannelState& channel_state_)
|
Control::ChannelState& channel_state_)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue