From be9e952bdc33b6763618ee66046ce84c0ff18a34 Mon Sep 17 00:00:00 2001 From: wwylele Date: Fri, 16 Jun 2017 16:16:28 +0300 Subject: [PATCH] gl_rasterizer: manage texture ids in one place --- .../renderer_opengl/gl_rasterizer.cpp | 47 ++++++++++--------- src/video_core/renderer_opengl/gl_state.cpp | 16 +++---- src/video_core/renderer_opengl/gl_state.h | 23 +++++++++ 3 files changed, 55 insertions(+), 31 deletions(-) diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index c73e1d6e2..c018afbcc 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -102,7 +102,7 @@ RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) { glBufferData(GL_TEXTURE_BUFFER, sizeof(GLfloat) * 2 * 256 * Pica::LightingRegs::NumLightingSampler, nullptr, GL_DYNAMIC_DRAW); - glActiveTexture(GL_TEXTURE15); + glActiveTexture(TextureUnits::LightingLUT.Enum()); glTexBuffer(GL_TEXTURE_BUFFER, GL_RG32F, lighting_lut_buffer.handle); // Setup the LUT for the fog @@ -112,7 +112,7 @@ RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) { } state.Apply(); - glActiveTexture(GL_TEXTURE9); + glActiveTexture(TextureUnits::FogLUT.Enum()); glTexImage1D(GL_TEXTURE_1D, 0, GL_R32UI, 128, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, nullptr); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -121,7 +121,7 @@ RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) { proctex_noise_lut.Create(); state.proctex_noise_lut.texture_1d = proctex_noise_lut.handle; state.Apply(); - glActiveTexture(GL_TEXTURE10); + glActiveTexture(TextureUnits::ProcTexNoiseLUT.Enum()); glTexImage1D(GL_TEXTURE_1D, 0, GL_RG32F, 128, 0, GL_RG, GL_FLOAT, nullptr); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -130,7 +130,7 @@ RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) { proctex_color_map.Create(); state.proctex_color_map.texture_1d = proctex_color_map.handle; state.Apply(); - glActiveTexture(GL_TEXTURE11); + glActiveTexture(TextureUnits::ProcTexColorMap.Enum()); glTexImage1D(GL_TEXTURE_1D, 0, GL_RG32F, 128, 0, GL_RG, GL_FLOAT, nullptr); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -139,7 +139,7 @@ RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) { proctex_alpha_map.Create(); state.proctex_alpha_map.texture_1d = proctex_alpha_map.handle; state.Apply(); - glActiveTexture(GL_TEXTURE12); + glActiveTexture(TextureUnits::ProcTexAlphaMap.Enum()); glTexImage1D(GL_TEXTURE_1D, 0, GL_RG32F, 128, 0, GL_RG, GL_FLOAT, nullptr); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -148,7 +148,7 @@ RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) { proctex_lut.Create(); state.proctex_lut.texture_1d = proctex_lut.handle; state.Apply(); - glActiveTexture(GL_TEXTURE13); + glActiveTexture(TextureUnits::ProcTexLUT.Enum()); glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA32F, 256, 0, GL_RGBA, GL_FLOAT, nullptr); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -157,7 +157,7 @@ RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) { proctex_diff_lut.Create(); state.proctex_diff_lut.texture_1d = proctex_diff_lut.handle; state.Apply(); - glActiveTexture(GL_TEXTURE14); + glActiveTexture(TextureUnits::ProcTexDiffLUT.Enum()); glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA32F, 256, 0, GL_RGBA, GL_FLOAT, nullptr); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -1185,55 +1185,55 @@ void RasterizerOpenGL::SetShader() { // Set the texture samplers to correspond to different texture units GLuint uniform_tex = glGetUniformLocation(shader->shader.handle, "tex[0]"); if (uniform_tex != -1) { - glUniform1i(uniform_tex, 0); + glUniform1i(uniform_tex, TextureUnits::PicaTexture(0).id); } uniform_tex = glGetUniformLocation(shader->shader.handle, "tex[1]"); if (uniform_tex != -1) { - glUniform1i(uniform_tex, 1); + glUniform1i(uniform_tex, TextureUnits::PicaTexture(1).id); } uniform_tex = glGetUniformLocation(shader->shader.handle, "tex[2]"); if (uniform_tex != -1) { - glUniform1i(uniform_tex, 2); + glUniform1i(uniform_tex, TextureUnits::PicaTexture(2).id); } // Set the texture samplers to correspond to different lookup table texture units GLuint uniform_lut = glGetUniformLocation(shader->shader.handle, "lighting_lut"); if (uniform_lut != -1) { - glUniform1i(uniform_lut, 15); + glUniform1i(uniform_lut, TextureUnits::LightingLUT.id); } GLuint uniform_fog_lut = glGetUniformLocation(shader->shader.handle, "fog_lut"); if (uniform_fog_lut != -1) { - glUniform1i(uniform_fog_lut, 9); + glUniform1i(uniform_fog_lut, TextureUnits::FogLUT.id); } GLuint uniform_proctex_noise_lut = glGetUniformLocation(shader->shader.handle, "proctex_noise_lut"); if (uniform_proctex_noise_lut != -1) { - glUniform1i(uniform_proctex_noise_lut, 10); + glUniform1i(uniform_proctex_noise_lut, TextureUnits::ProcTexNoiseLUT.id); } GLuint uniform_proctex_color_map = glGetUniformLocation(shader->shader.handle, "proctex_color_map"); if (uniform_proctex_color_map != -1) { - glUniform1i(uniform_proctex_color_map, 11); + glUniform1i(uniform_proctex_color_map, TextureUnits::ProcTexColorMap.id); } GLuint uniform_proctex_alpha_map = glGetUniformLocation(shader->shader.handle, "proctex_alpha_map"); if (uniform_proctex_alpha_map != -1) { - glUniform1i(uniform_proctex_alpha_map, 12); + glUniform1i(uniform_proctex_alpha_map, TextureUnits::ProcTexAlphaMap.id); } GLuint uniform_proctex_lut = glGetUniformLocation(shader->shader.handle, "proctex_lut"); if (uniform_proctex_lut != -1) { - glUniform1i(uniform_proctex_lut, 13); + glUniform1i(uniform_proctex_lut, TextureUnits::ProcTexLUT.id); } GLuint uniform_proctex_diff_lut = glGetUniformLocation(shader->shader.handle, "proctex_diff_lut"); if (uniform_proctex_diff_lut != -1) { - glUniform1i(uniform_proctex_diff_lut, 14); + glUniform1i(uniform_proctex_diff_lut, TextureUnits::ProcTexDiffLUT.id); } current_shader = shader_cache.emplace(config, std::move(shader)).first->second.get(); @@ -1363,7 +1363,7 @@ void RasterizerOpenGL::SyncFogLUT() { if (new_data != fog_lut_data) { fog_lut_data = new_data; - glActiveTexture(GL_TEXTURE9); + glActiveTexture(TextureUnits::FogLUT.Enum()); glTexSubImage1D(GL_TEXTURE_1D, 0, 0, 128, GL_RED_INTEGER, GL_UNSIGNED_INT, fog_lut_data.data()); } @@ -1402,17 +1402,18 @@ static void SyncProcTexValueLUT(const std::array +namespace TextureUnits { + +struct TextureUnit { + GLint id; + constexpr GLenum Enum() const { + return static_cast(GL_TEXTURE0 + id); + } +}; + +constexpr TextureUnit PicaTexture(int unit) { + return TextureUnit{unit}; +} + +constexpr TextureUnit LightingLUT{3}; +constexpr TextureUnit FogLUT{4}; +constexpr TextureUnit ProcTexNoiseLUT{5}; +constexpr TextureUnit ProcTexColorMap{6}; +constexpr TextureUnit ProcTexAlphaMap{7}; +constexpr TextureUnit ProcTexLUT{8}; +constexpr TextureUnit ProcTexDiffLUT{9}; + +} // namespace TextureUnits + class OpenGLState { public: struct {