1
0
Fork 0
forked from suyu/suyu

Merge pull request #422 from bunnei/shader-mov

Shader instructions MOV_C, MOV_R, and several minor GPU things
This commit is contained in:
bunnei 2018-04-29 21:47:42 -04:00 committed by GitHub
commit 225ff1130f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 30 additions and 0 deletions

View file

@ -208,6 +208,16 @@ void Maxwell3D::DrawArrays() {
const bool is_indexed{regs.index_array.count && !regs.vertex_buffer.count}; const bool is_indexed{regs.index_array.count && !regs.vertex_buffer.count};
VideoCore::g_renderer->Rasterizer()->AccelerateDrawBatch(is_indexed); VideoCore::g_renderer->Rasterizer()->AccelerateDrawBatch(is_indexed);
// TODO(bunnei): Below, we reset vertex count so that we can use these registers to determine if
// the game is trying to draw indexed or direct mode. This needs to be verified on HW still -
// it's possible that it is incorrect and that there is some other register used to specify the
// drawing mode.
if (is_indexed) {
regs.index_array.count = 0;
} else {
regs.vertex_buffer.count = 0;
}
} }
void Maxwell3D::ProcessCBBind(Regs::ShaderStage stage) { void Maxwell3D::ProcessCBBind(Regs::ShaderStage stage) {

View file

@ -310,6 +310,7 @@ public:
SHR_C, SHR_C,
SHR_R, SHR_R,
SHR_IMM, SHR_IMM,
FMNMX,
FSETP_C, // Set Predicate FSETP_C, // Set Predicate
FSETP_R, FSETP_R,
FSETP_IMM, FSETP_IMM,
@ -460,6 +461,7 @@ private:
INST("0100110000101---", Id::SHR_C, Type::Arithmetic, "SHR_C"), INST("0100110000101---", Id::SHR_C, Type::Arithmetic, "SHR_C"),
INST("0101110000101---", Id::SHR_R, Type::Arithmetic, "SHR_R"), INST("0101110000101---", Id::SHR_R, Type::Arithmetic, "SHR_R"),
INST("0011100-00101---", Id::SHR_IMM, Type::Arithmetic, "SHR_IMM"), INST("0011100-00101---", Id::SHR_IMM, Type::Arithmetic, "SHR_IMM"),
INST("0101110001100---", Id::FMNMX, Type::Arithmetic, "FMNMX"),
INST("0100110011100---", Id::I2I_C, Type::Conversion, "I2I_C"), INST("0100110011100---", Id::I2I_C, Type::Conversion, "I2I_C"),
INST("0101110011100---", Id::I2I_R, Type::Conversion, "I2I_R"), INST("0101110011100---", Id::I2I_R, Type::Conversion, "I2I_R"),
INST("01110001-1000---", Id::I2I_IMM, Type::Conversion, "I2I_IMM"), INST("01110001-1000---", Id::I2I_IMM, Type::Conversion, "I2I_IMM"),

View file

@ -664,6 +664,12 @@ private:
} }
switch (opcode->GetId()) { switch (opcode->GetId()) {
case OpCode::Id::MOV_C:
case OpCode::Id::MOV_R: {
regs.SetRegisterToFloat(instr.gpr0, 0, op_b, 1, 1);
break;
}
case OpCode::Id::MOV32_IMM: { case OpCode::Id::MOV32_IMM: {
// mov32i doesn't have abs or neg bits. // mov32i doesn't have abs or neg bits.
regs.SetRegisterToFloat(instr.gpr0, 0, GetImmediate32(instr), 1, 1); regs.SetRegisterToFloat(instr.gpr0, 0, GetImmediate32(instr), 1, 1);

View file

@ -36,6 +36,18 @@ inline GLenum VertexType(Maxwell::VertexAttribute attrib) {
return {}; return {};
} }
case Maxwell::VertexAttribute::Type::SignedNorm: {
switch (attrib.size) {
case Maxwell::VertexAttribute::Size::Size_8_8_8_8:
return GL_BYTE;
}
NGLOG_CRITICAL(Render_OpenGL, "Unimplemented vertex size={}", attrib.SizeString());
UNREACHABLE();
return {};
}
case Maxwell::VertexAttribute::Type::Float: case Maxwell::VertexAttribute::Type::Float:
return GL_FLOAT; return GL_FLOAT;
} }