opengl: remove hw geometry shader related stuff

This commit is contained in:
Weiyi Wang
2019-08-18 20:07:50 -04:00
parent 1cf75e55c2
commit dd3ba7bd21
8 changed files with 32 additions and 283 deletions

View File

@@ -104,8 +104,6 @@ RasterizerOpenGL::RasterizerOpenGL(Frontend::EmuWindow& window)
glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &uniform_buffer_alignment);
uniform_size_aligned_vs =
Common::AlignUp<std::size_t>(sizeof(VSUniformData), uniform_buffer_alignment);
uniform_size_aligned_gs =
Common::AlignUp<std::size_t>(sizeof(GSUniformData), uniform_buffer_alignment);
uniform_size_aligned_fs =
Common::AlignUp<std::size_t>(sizeof(UniformData), uniform_buffer_alignment);
@@ -392,8 +390,7 @@ bool RasterizerOpenGL::SetupGeometryShader() {
shader_program_manager->UseFixedGeometryShader(gs_config);
return true;
} else {
PicaGSConfig gs_config(regs, Pica::g_state.gs);
return shader_program_manager->UseProgrammableGeometryShader(gs_config, Pica::g_state.gs);
LOG_ERROR(Render_OpenGL, "Accelerate draw doesn't support geometry shader");
}
}
@@ -417,42 +414,24 @@ bool RasterizerOpenGL::AccelerateDrawBatch(bool is_indexed) {
return Draw(true, is_indexed);
}
static GLenum GetCurrentPrimitiveMode(bool use_gs) {
static GLenum GetCurrentPrimitiveMode() {
const auto& regs = Pica::g_state.regs;
if (use_gs) {
switch ((regs.gs.max_input_attribute_index + 1) /
(regs.pipeline.vs_outmap_total_minus_1_a + 1)) {
case 1:
return GL_POINTS;
case 2:
return GL_LINES;
case 4:
return GL_LINES_ADJACENCY;
case 3:
return GL_TRIANGLES;
case 6:
return GL_TRIANGLES_ADJACENCY;
default:
UNREACHABLE();
}
} else {
switch (regs.pipeline.triangle_topology) {
case Pica::PipelineRegs::TriangleTopology::Shader:
case Pica::PipelineRegs::TriangleTopology::List:
return GL_TRIANGLES;
case Pica::PipelineRegs::TriangleTopology::Fan:
return GL_TRIANGLE_FAN;
case Pica::PipelineRegs::TriangleTopology::Strip:
return GL_TRIANGLE_STRIP;
default:
UNREACHABLE();
}
switch (regs.pipeline.triangle_topology) {
case Pica::PipelineRegs::TriangleTopology::Shader:
case Pica::PipelineRegs::TriangleTopology::List:
return GL_TRIANGLES;
case Pica::PipelineRegs::TriangleTopology::Fan:
return GL_TRIANGLE_FAN;
case Pica::PipelineRegs::TriangleTopology::Strip:
return GL_TRIANGLE_STRIP;
default:
UNREACHABLE();
}
}
bool RasterizerOpenGL::AccelerateDrawBatchInternal(bool is_indexed, bool use_gs) {
bool RasterizerOpenGL::AccelerateDrawBatchInternal(bool is_indexed) {
const auto& regs = Pica::g_state.regs;
GLenum primitive_mode = GetCurrentPrimitiveMode(use_gs);
GLenum primitive_mode = GetCurrentPrimitiveMode();
auto [vs_input_index_min, vs_input_index_max, vs_input_size] = AnalyzeVertexArray(is_indexed);
@@ -787,8 +766,7 @@ bool RasterizerOpenGL::Draw(bool accelerate, bool is_indexed) {
SyncAndUploadLUTs();
// Sync the uniform data
const bool use_gs = regs.pipeline.use_gs == Pica::PipelineRegs::UseGS::Yes;
UploadUniforms(accelerate, use_gs);
UploadUniforms(accelerate);
// Viewport can have negative offsets or larger
// dimensions than our framebuffer sub-rect.
@@ -804,7 +782,7 @@ bool RasterizerOpenGL::Draw(bool accelerate, bool is_indexed) {
// Draw the vertex batch
bool succeeded = true;
if (accelerate) {
succeeded = AccelerateDrawBatchInternal(is_indexed, use_gs);
succeeded = AccelerateDrawBatchInternal(is_indexed);
} else {
state.draw.vertex_array = sw_vao.handle;
state.draw.vertex_buffer = vertex_buffer.GetHandle();
@@ -2119,21 +2097,19 @@ void RasterizerOpenGL::SyncAndUploadLUTs() {
texture_buffer.Unmap(bytes_used);
}
void RasterizerOpenGL::UploadUniforms(bool accelerate_draw, bool use_gs) {
void RasterizerOpenGL::UploadUniforms(bool accelerate_draw) {
// glBindBufferRange below also changes the generic buffer binding point, so we sync the state
// first
state.draw.uniform_buffer = uniform_buffer.GetHandle();
state.Apply();
bool sync_vs = accelerate_draw;
bool sync_gs = accelerate_draw && use_gs;
bool sync_fs = uniform_block_data.dirty;
if (!sync_vs && !sync_gs && !sync_fs)
if (!sync_vs && !sync_fs)
return;
std::size_t uniform_size =
uniform_size_aligned_vs + uniform_size_aligned_gs + uniform_size_aligned_fs;
std::size_t uniform_size = uniform_size_aligned_vs + uniform_size_aligned_fs;
std::size_t used_bytes = 0;
u8* uniforms;
GLintptr offset;
@@ -2150,15 +2126,6 @@ void RasterizerOpenGL::UploadUniforms(bool accelerate_draw, bool use_gs) {
used_bytes += uniform_size_aligned_vs;
}
if (sync_gs) {
GSUniformData gs_uniforms;
gs_uniforms.uniforms.SetFromRegs(Pica::g_state.regs.gs, Pica::g_state.gs);
std::memcpy(uniforms + used_bytes, &gs_uniforms, sizeof(gs_uniforms));
glBindBufferRange(GL_UNIFORM_BUFFER, static_cast<GLuint>(UniformBindings::GS),
uniform_buffer.GetHandle(), offset + used_bytes, sizeof(GSUniformData));
used_bytes += uniform_size_aligned_gs;
}
if (sync_fs || invalidate) {
std::memcpy(uniforms + used_bytes, &uniform_block_data.data, sizeof(UniformData));
glBindBufferRange(GL_UNIFORM_BUFFER, static_cast<GLuint>(UniformBindings::Common),