summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl/gl_rasterizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp84
1 files changed, 25 insertions, 59 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 41a58598b..9951d8178 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -178,19 +178,6 @@ std::pair<u8*, GLintptr> RasterizerOpenGL::SetupVertexArrays(u8* array_ptr,
return {array_ptr, buffer_offset};
}
-static GLShader::ProgramCode GetShaderProgramCode(Maxwell::ShaderProgram program) {
- auto& gpu = Core::System::GetInstance().GPU().Maxwell3D();
-
- // Fetch program code from memory
- GLShader::ProgramCode program_code(GLShader::MAX_PROGRAM_CODE_LENGTH);
- auto& shader_config = gpu.regs.shader_config[static_cast<size_t>(program)];
- const u64 gpu_address{gpu.regs.code_address.CodeAddress() + shader_config.offset};
- const boost::optional<VAddr> cpu_address{gpu.memory_manager.GpuToCpuAddress(gpu_address)};
- Memory::ReadBlock(*cpu_address, program_code.data(), program_code.size() * sizeof(u64));
-
- return program_code;
-}
-
std::pair<u8*, GLintptr> RasterizerOpenGL::SetupShaders(u8* buffer_ptr, GLintptr buffer_offset) {
auto& gpu = Core::System::GetInstance().GPU().Maxwell3D();
@@ -224,31 +211,17 @@ std::pair<u8*, GLintptr> RasterizerOpenGL::SetupShaders(u8* buffer_ptr, GLintptr
buffer_ptr += sizeof(ubo);
buffer_offset += sizeof(ubo);
- GLShader::ShaderSetup setup{GetShaderProgramCode(program)};
- GLShader::ShaderEntries shader_resources;
+ const Tegra::GPUVAddr addr{gpu.regs.code_address.CodeAddress() + shader_config.offset};
+ Shader shader{shader_cache.GetStageProgram(program)};
switch (program) {
- case Maxwell::ShaderProgram::VertexA: {
- // VertexB is always enabled, so when VertexA is enabled, we have two vertex shaders.
- // Conventional HW does not support this, so we combine VertexA and VertexB into one
- // stage here.
- setup.SetProgramB(GetShaderProgramCode(Maxwell::ShaderProgram::VertexB));
- GLShader::MaxwellVSConfig vs_config{setup};
- shader_resources =
- shader_program_manager->UseProgrammableVertexShader(vs_config, setup);
- break;
- }
-
+ case Maxwell::ShaderProgram::VertexA:
case Maxwell::ShaderProgram::VertexB: {
- GLShader::MaxwellVSConfig vs_config{setup};
- shader_resources =
- shader_program_manager->UseProgrammableVertexShader(vs_config, setup);
+ shader_program_manager->UseProgrammableVertexShader(shader->GetProgramHandle());
break;
}
case Maxwell::ShaderProgram::Fragment: {
- GLShader::MaxwellFSConfig fs_config{setup};
- shader_resources =
- shader_program_manager->UseProgrammableFragmentShader(fs_config, setup);
+ shader_program_manager->UseProgrammableFragmentShader(shader->GetProgramHandle());
break;
}
default:
@@ -257,18 +230,14 @@ std::pair<u8*, GLintptr> RasterizerOpenGL::SetupShaders(u8* buffer_ptr, GLintptr
UNREACHABLE();
}
- GLuint gl_stage_program = shader_program_manager->GetCurrentProgramStage(
- static_cast<Maxwell::ShaderStage>(stage));
-
// Configure the const buffers for this shader stage.
- std::tie(buffer_ptr, buffer_offset, current_constbuffer_bindpoint) = SetupConstBuffers(
- buffer_ptr, buffer_offset, static_cast<Maxwell::ShaderStage>(stage), gl_stage_program,
- current_constbuffer_bindpoint, shader_resources.const_buffer_entries);
+ std::tie(buffer_ptr, buffer_offset, current_constbuffer_bindpoint) =
+ SetupConstBuffers(buffer_ptr, buffer_offset, static_cast<Maxwell::ShaderStage>(stage),
+ shader, current_constbuffer_bindpoint);
// Configure the textures for this shader stage.
- current_texture_bindpoint =
- SetupTextures(static_cast<Maxwell::ShaderStage>(stage), gl_stage_program,
- current_texture_bindpoint, shader_resources.texture_samplers);
+ current_texture_bindpoint = SetupTextures(static_cast<Maxwell::ShaderStage>(stage), shader,
+ current_texture_bindpoint);
// When VertexA is enabled, we have dual vertex shaders
if (program == Maxwell::ShaderProgram::VertexA) {
@@ -580,6 +549,7 @@ void RasterizerOpenGL::FlushRegion(Tegra::GPUVAddr addr, u64 size) {
void RasterizerOpenGL::InvalidateRegion(Tegra::GPUVAddr addr, u64 size) {
MICROPROFILE_SCOPE(OpenGL_CacheManagement);
res_cache.InvalidateRegion(addr, size);
+ shader_cache.InvalidateRegion(addr, size);
}
void RasterizerOpenGL::FlushAndInvalidateRegion(Tegra::GPUVAddr addr, u64 size) {
@@ -669,15 +639,17 @@ void RasterizerOpenGL::SamplerInfo::SyncWithConfig(const Tegra::Texture::TSCEntr
}
}
-std::tuple<u8*, GLintptr, u32> RasterizerOpenGL::SetupConstBuffers(
- u8* buffer_ptr, GLintptr buffer_offset, Maxwell::ShaderStage stage, GLuint program,
- u32 current_bindpoint, const std::vector<GLShader::ConstBufferEntry>& entries) {
+std::tuple<u8*, GLintptr, u32> RasterizerOpenGL::SetupConstBuffers(u8* buffer_ptr,
+ GLintptr buffer_offset,
+ Maxwell::ShaderStage stage,
+ Shader& shader,
+ u32 current_bindpoint) {
const auto& gpu = Core::System::GetInstance().GPU();
const auto& maxwell3d = gpu.Maxwell3D();
-
- // Upload only the enabled buffers from the 16 constbuffers of each shader stage
const auto& shader_stage = maxwell3d.state.shader_stages[static_cast<size_t>(stage)];
+ const auto& entries = shader->GetShaderEntries().const_buffer_entries;
+ // Upload only the enabled buffers from the 16 constbuffers of each shader stage
for (u32 bindpoint = 0; bindpoint < entries.size(); ++bindpoint) {
const auto& used_buffer = entries[bindpoint];
const auto& buffer = shader_stage.const_buffers[used_buffer.GetIndex()];
@@ -716,12 +688,9 @@ std::tuple<u8*, GLintptr, u32> RasterizerOpenGL::SetupConstBuffers(
stream_buffer.GetHandle(), const_buffer_offset, size);
// Now configure the bindpoint of the buffer inside the shader
- const std::string buffer_name = used_buffer.GetName();
- const GLuint index =
- glGetProgramResourceIndex(program, GL_UNIFORM_BLOCK, buffer_name.c_str());
- if (index != GL_INVALID_INDEX) {
- glUniformBlockBinding(program, index, current_bindpoint + bindpoint);
- }
+ glUniformBlockBinding(shader->GetProgramHandle(),
+ shader->GetProgramResourceIndex(used_buffer.GetName()),
+ current_bindpoint + bindpoint);
}
state.Apply();
@@ -729,10 +698,10 @@ std::tuple<u8*, GLintptr, u32> RasterizerOpenGL::SetupConstBuffers(
return {buffer_ptr, buffer_offset, current_bindpoint + static_cast<u32>(entries.size())};
}
-u32 RasterizerOpenGL::SetupTextures(Maxwell::ShaderStage stage, GLuint program, u32 current_unit,
- const std::vector<GLShader::SamplerEntry>& entries) {
+u32 RasterizerOpenGL::SetupTextures(Maxwell::ShaderStage stage, Shader& shader, u32 current_unit) {
const auto& gpu = Core::System::GetInstance().GPU();
const auto& maxwell3d = gpu.Maxwell3D();
+ const auto& entries = shader->GetShaderEntries().texture_samplers;
ASSERT_MSG(current_unit + entries.size() <= std::size(state.texture_units),
"Exceeded the number of active textures.");
@@ -742,12 +711,9 @@ u32 RasterizerOpenGL::SetupTextures(Maxwell::ShaderStage stage, GLuint program,
u32 current_bindpoint = current_unit + bindpoint;
// Bind the uniform to the sampler.
- GLint uniform = glGetUniformLocation(program, entry.GetName().c_str());
- if (uniform == -1) {
- continue;
- }
- glProgramUniform1i(program, uniform, current_bindpoint);
+ glProgramUniform1i(shader->GetProgramHandle(), shader->GetUniformLocation(entry.GetName()),
+ current_bindpoint);
const auto texture = maxwell3d.GetStageTexture(entry.GetStage(), entry.GetOffset());