|
@@ -246,29 +246,6 @@ DrawParameters RasterizerOpenGL::SetupDraw() {
|
|
|
DrawParameters params{};
|
|
DrawParameters params{};
|
|
|
params.current_instance = gpu.state.current_instance;
|
|
params.current_instance = gpu.state.current_instance;
|
|
|
|
|
|
|
|
- if (regs.draw.topology == Maxwell::PrimitiveTopology::Quads) {
|
|
|
|
|
- MICROPROFILE_SCOPE(OpenGL_PrimitiveAssembly);
|
|
|
|
|
-
|
|
|
|
|
- params.use_indexed = true;
|
|
|
|
|
- params.primitive_mode = GL_TRIANGLES;
|
|
|
|
|
-
|
|
|
|
|
- if (is_indexed) {
|
|
|
|
|
- params.index_format = MaxwellToGL::IndexFormat(regs.index_array.format);
|
|
|
|
|
- params.count = (regs.index_array.count / 4) * 6;
|
|
|
|
|
- params.index_buffer_offset = primitive_assembler.MakeQuadIndexed(
|
|
|
|
|
- regs.index_array.IndexStart(), regs.index_array.FormatSizeInBytes(),
|
|
|
|
|
- regs.index_array.count);
|
|
|
|
|
- params.base_vertex = static_cast<GLint>(regs.vb_element_base);
|
|
|
|
|
- } else {
|
|
|
|
|
- // MakeQuadArray always generates u32 indexes
|
|
|
|
|
- params.index_format = GL_UNSIGNED_INT;
|
|
|
|
|
- params.count = (regs.vertex_buffer.count / 4) * 6;
|
|
|
|
|
- params.index_buffer_offset = primitive_assembler.MakeQuadArray(
|
|
|
|
|
- regs.vertex_buffer.first, regs.vertex_buffer.count);
|
|
|
|
|
- }
|
|
|
|
|
- return params;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
params.use_indexed = is_indexed;
|
|
params.use_indexed = is_indexed;
|
|
|
params.primitive_mode = MaxwellToGL::PrimitiveTopology(regs.draw.topology);
|
|
params.primitive_mode = MaxwellToGL::PrimitiveTopology(regs.draw.topology);
|
|
|
|
|
|
|
@@ -686,30 +663,19 @@ void RasterizerOpenGL::DrawArrays() {
|
|
|
SyncCullMode();
|
|
SyncCullMode();
|
|
|
SyncPrimitiveRestart();
|
|
SyncPrimitiveRestart();
|
|
|
SyncScissorTest(state);
|
|
SyncScissorTest(state);
|
|
|
- // Alpha Testing is synced on shaders.
|
|
|
|
|
SyncTransformFeedback();
|
|
SyncTransformFeedback();
|
|
|
SyncPointState();
|
|
SyncPointState();
|
|
|
- CheckAlphaTests();
|
|
|
|
|
SyncPolygonOffset();
|
|
SyncPolygonOffset();
|
|
|
- // TODO(bunnei): Sync framebuffer_scale uniform here
|
|
|
|
|
- // TODO(bunnei): Sync scissorbox uniform(s) here
|
|
|
|
|
|
|
+ SyncAlphaTest();
|
|
|
|
|
|
|
|
// Draw the vertex batch
|
|
// Draw the vertex batch
|
|
|
const bool is_indexed = accelerate_draw == AccelDraw::Indexed;
|
|
const bool is_indexed = accelerate_draw == AccelDraw::Indexed;
|
|
|
|
|
|
|
|
std::size_t buffer_size = CalculateVertexArraysSize();
|
|
std::size_t buffer_size = CalculateVertexArraysSize();
|
|
|
|
|
|
|
|
- // Add space for index buffer (keeping in mind non-core primitives)
|
|
|
|
|
- switch (regs.draw.topology) {
|
|
|
|
|
- case Maxwell::PrimitiveTopology::Quads:
|
|
|
|
|
- buffer_size = Common::AlignUp(buffer_size, 4) +
|
|
|
|
|
- primitive_assembler.CalculateQuadSize(regs.vertex_buffer.count);
|
|
|
|
|
- break;
|
|
|
|
|
- default:
|
|
|
|
|
- if (is_indexed) {
|
|
|
|
|
- buffer_size = Common::AlignUp(buffer_size, 4) + CalculateIndexBufferSize();
|
|
|
|
|
- }
|
|
|
|
|
- break;
|
|
|
|
|
|
|
+ // Add space for index buffer
|
|
|
|
|
+ if (is_indexed) {
|
|
|
|
|
+ buffer_size = Common::AlignUp(buffer_size, 4) + CalculateIndexBufferSize();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Uniform space for the 5 shader stages
|
|
// Uniform space for the 5 shader stages
|
|
@@ -1152,10 +1118,17 @@ void RasterizerOpenGL::SyncPolygonOffset() {
|
|
|
state.polygon_offset.clamp = regs.polygon_offset_clamp;
|
|
state.polygon_offset.clamp = regs.polygon_offset_clamp;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void RasterizerOpenGL::CheckAlphaTests() {
|
|
|
|
|
|
|
+void RasterizerOpenGL::SyncAlphaTest() {
|
|
|
const auto& regs = system.GPU().Maxwell3D().regs;
|
|
const auto& regs = system.GPU().Maxwell3D().regs;
|
|
|
UNIMPLEMENTED_IF_MSG(regs.alpha_test_enabled != 0 && regs.rt_control.count > 1,
|
|
UNIMPLEMENTED_IF_MSG(regs.alpha_test_enabled != 0 && regs.rt_control.count > 1,
|
|
|
"Alpha Testing is enabled with more than one rendertarget");
|
|
"Alpha Testing is enabled with more than one rendertarget");
|
|
|
|
|
+
|
|
|
|
|
+ state.alpha_test.enabled = regs.alpha_test_enabled;
|
|
|
|
|
+ if (!state.alpha_test.enabled) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ state.alpha_test.func = MaxwellToGL::ComparisonOp(regs.alpha_test_func);
|
|
|
|
|
+ state.alpha_test.ref = regs.alpha_test_ref;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
} // namespace OpenGL
|
|
} // namespace OpenGL
|