|
|
|
@ -2,21 +2,29 @@ |
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#include <glad/glad.h>
|
|
|
|
|
|
|
|
#include "common/common_types.h"
|
|
|
|
#include "video_core/engines/maxwell_3d.h"
|
|
|
|
#include "video_core/renderer_opengl/gl_shader_manager.h"
|
|
|
|
|
|
|
|
namespace OpenGL::GLShader { |
|
|
|
|
|
|
|
using Tegra::Engines::Maxwell3D; |
|
|
|
ProgramManager::ProgramManager() = default; |
|
|
|
|
|
|
|
ProgramManager::~ProgramManager() = default; |
|
|
|
|
|
|
|
void ProgramManager::Create() { |
|
|
|
pipeline.Create(); |
|
|
|
graphics_pipeline.Create(); |
|
|
|
glBindProgramPipeline(graphics_pipeline.handle); |
|
|
|
} |
|
|
|
|
|
|
|
void ProgramManager::Update() { |
|
|
|
void ProgramManager::BindGraphicsPipeline() { |
|
|
|
if (!is_graphics_bound) { |
|
|
|
is_graphics_bound = true; |
|
|
|
glUseProgram(0); |
|
|
|
} |
|
|
|
|
|
|
|
// Avoid updating the pipeline when values have no changed
|
|
|
|
if (old_state == current_state) { |
|
|
|
return; |
|
|
|
@ -25,16 +33,21 @@ void ProgramManager::Update() { |
|
|
|
// Workaround for AMD bug
|
|
|
|
static constexpr GLenum all_used_stages{GL_VERTEX_SHADER_BIT | GL_GEOMETRY_SHADER_BIT | |
|
|
|
GL_FRAGMENT_SHADER_BIT}; |
|
|
|
glUseProgramStages(pipeline.handle, all_used_stages, 0); |
|
|
|
|
|
|
|
glUseProgramStages(pipeline.handle, GL_VERTEX_SHADER_BIT, current_state.vertex_shader); |
|
|
|
glUseProgramStages(pipeline.handle, GL_GEOMETRY_SHADER_BIT, current_state.geometry_shader); |
|
|
|
glUseProgramStages(pipeline.handle, GL_FRAGMENT_SHADER_BIT, current_state.fragment_shader); |
|
|
|
const GLuint handle = graphics_pipeline.handle; |
|
|
|
glUseProgramStages(handle, all_used_stages, 0); |
|
|
|
glUseProgramStages(handle, GL_VERTEX_SHADER_BIT, current_state.vertex_shader); |
|
|
|
glUseProgramStages(handle, GL_GEOMETRY_SHADER_BIT, current_state.geometry_shader); |
|
|
|
glUseProgramStages(handle, GL_FRAGMENT_SHADER_BIT, current_state.fragment_shader); |
|
|
|
|
|
|
|
old_state = current_state; |
|
|
|
} |
|
|
|
|
|
|
|
void MaxwellUniformData::SetFromRegs(const Maxwell3D& maxwell) { |
|
|
|
void ProgramManager::BindComputeShader(GLuint program) { |
|
|
|
is_graphics_bound = false; |
|
|
|
glUseProgram(program); |
|
|
|
} |
|
|
|
|
|
|
|
void MaxwellUniformData::SetFromRegs(const Tegra::Engines::Maxwell3D& maxwell) { |
|
|
|
const auto& regs = maxwell.regs; |
|
|
|
|
|
|
|
// Y_NEGATE controls what value S2R returns for the Y_DIRECTION system value.
|
|
|
|
|