Browse Source
Merge pull request #1406 from ReinUsesLisp/multibind-samplers
gl_state: Pack sampler bindings into a single ARB_multi_bind
pull/15/merge
bunnei
7 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with
25 additions and
8 deletions
-
src/video_core/engines/maxwell_3d.h
-
src/video_core/renderer_opengl/gl_rasterizer.h
-
src/video_core/renderer_opengl/gl_shader_manager.h
-
src/video_core/renderer_opengl/gl_state.cpp
-
src/video_core/renderer_opengl/gl_state.h
|
|
|
@ -41,6 +41,7 @@ public: |
|
|
|
static constexpr std::size_t NumCBData = 16; |
|
|
|
static constexpr std::size_t NumVertexArrays = 32; |
|
|
|
static constexpr std::size_t NumVertexAttributes = 32; |
|
|
|
static constexpr std::size_t NumTextureSamplers = 32; |
|
|
|
static constexpr std::size_t MaxShaderProgram = 6; |
|
|
|
static constexpr std::size_t MaxShaderStage = 5; |
|
|
|
// Maximum number of const buffers per shader stage. |
|
|
|
|
|
|
|
@ -184,7 +184,7 @@ private: |
|
|
|
OGLVertexArray> |
|
|
|
vertex_array_cache; |
|
|
|
|
|
|
|
std::array<SamplerInfo, GLShader::NumTextureSamplers> texture_samplers; |
|
|
|
std::array<SamplerInfo, Tegra::Engines::Maxwell3D::Regs::NumTextureSamplers> texture_samplers; |
|
|
|
|
|
|
|
static constexpr std::size_t STREAM_BUFFER_SIZE = 128 * 1024 * 1024; |
|
|
|
OGLBufferCache buffer_cache; |
|
|
|
|
|
|
|
@ -11,9 +11,6 @@ |
|
|
|
|
|
|
|
namespace OpenGL::GLShader { |
|
|
|
|
|
|
|
/// Number of OpenGL texture samplers that can be used in the fragment shader |
|
|
|
static constexpr std::size_t NumTextureSamplers = 32; |
|
|
|
|
|
|
|
using Tegra::Engines::Maxwell3D; |
|
|
|
|
|
|
|
/// Uniform structure for the Uniform Buffer Object, all vectors must be 16-byte aligned |
|
|
|
|
|
|
|
@ -205,9 +205,6 @@ void OpenGLState::Apply() const { |
|
|
|
glActiveTexture(TextureUnits::MaxwellTexture(static_cast<int>(i)).Enum()); |
|
|
|
glBindTexture(texture_unit.target, texture_unit.texture); |
|
|
|
} |
|
|
|
if (texture_unit.sampler != cur_state_texture_unit.sampler) { |
|
|
|
glBindSampler(static_cast<GLuint>(i), texture_unit.sampler); |
|
|
|
} |
|
|
|
// Update the texture swizzle
|
|
|
|
if (texture_unit.swizzle.r != cur_state_texture_unit.swizzle.r || |
|
|
|
texture_unit.swizzle.g != cur_state_texture_unit.swizzle.g || |
|
|
|
@ -219,6 +216,27 @@ void OpenGLState::Apply() const { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Samplers
|
|
|
|
{ |
|
|
|
bool has_delta{}; |
|
|
|
std::size_t first{}, last{}; |
|
|
|
std::array<GLuint, Tegra::Engines::Maxwell3D::Regs::NumTextureSamplers> samplers; |
|
|
|
for (std::size_t i = 0; i < std::size(samplers); ++i) { |
|
|
|
samplers[i] = texture_units[i].sampler; |
|
|
|
if (samplers[i] != cur_state.texture_units[i].sampler) { |
|
|
|
if (!has_delta) { |
|
|
|
first = i; |
|
|
|
has_delta = true; |
|
|
|
} |
|
|
|
last = i; |
|
|
|
} |
|
|
|
} |
|
|
|
if (has_delta) { |
|
|
|
glBindSamplers(static_cast<GLuint>(first), static_cast<GLsizei>(last - first + 1), |
|
|
|
samplers.data()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Framebuffer
|
|
|
|
if (draw.read_framebuffer != cur_state.draw.read_framebuffer) { |
|
|
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, draw.read_framebuffer); |
|
|
|
|
|
|
|
@ -6,6 +6,7 @@ |
|
|
|
|
|
|
|
#include <array> |
|
|
|
#include <glad/glad.h> |
|
|
|
#include "video_core/engines/maxwell_3d.h" |
|
|
|
|
|
|
|
namespace OpenGL { |
|
|
|
|
|
|
|
@ -114,7 +115,7 @@ public: |
|
|
|
target = GL_TEXTURE_2D; |
|
|
|
} |
|
|
|
}; |
|
|
|
std::array<TextureUnit, 32> texture_units; |
|
|
|
std::array<TextureUnit, Tegra::Engines::Maxwell3D::Regs::NumTextureSamplers> texture_units; |
|
|
|
|
|
|
|
struct { |
|
|
|
GLuint read_framebuffer; // GL_READ_FRAMEBUFFER_BINDING |
|
|
|
|