1
1
Fork 0
forked from suyu/suyu

Merge pull request #1406 from ReinUsesLisp/multibind-samplers

gl_state: Pack sampler bindings into a single ARB_multi_bind
This commit is contained in:
bunnei 2018-09-29 10:55:45 -04:00 committed by GitHub
commit 8d8366b602
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 25 additions and 8 deletions

View file

@ -41,6 +41,7 @@ public:
static constexpr std::size_t NumCBData = 16; static constexpr std::size_t NumCBData = 16;
static constexpr std::size_t NumVertexArrays = 32; static constexpr std::size_t NumVertexArrays = 32;
static constexpr std::size_t NumVertexAttributes = 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 MaxShaderProgram = 6;
static constexpr std::size_t MaxShaderStage = 5; static constexpr std::size_t MaxShaderStage = 5;
// Maximum number of const buffers per shader stage. // Maximum number of const buffers per shader stage.

View file

@ -184,7 +184,7 @@ private:
OGLVertexArray> OGLVertexArray>
vertex_array_cache; 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; static constexpr std::size_t STREAM_BUFFER_SIZE = 128 * 1024 * 1024;
OGLBufferCache buffer_cache; OGLBufferCache buffer_cache;

View file

@ -11,9 +11,6 @@
namespace OpenGL::GLShader { 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; using Tegra::Engines::Maxwell3D;
/// Uniform structure for the Uniform Buffer Object, all vectors must be 16-byte aligned /// Uniform structure for the Uniform Buffer Object, all vectors must be 16-byte aligned

View file

@ -205,9 +205,6 @@ void OpenGLState::Apply() const {
glActiveTexture(TextureUnits::MaxwellTexture(static_cast<int>(i)).Enum()); glActiveTexture(TextureUnits::MaxwellTexture(static_cast<int>(i)).Enum());
glBindTexture(texture_unit.target, texture_unit.texture); 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 // Update the texture swizzle
if (texture_unit.swizzle.r != cur_state_texture_unit.swizzle.r || if (texture_unit.swizzle.r != cur_state_texture_unit.swizzle.r ||
texture_unit.swizzle.g != cur_state_texture_unit.swizzle.g || 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 // Framebuffer
if (draw.read_framebuffer != cur_state.draw.read_framebuffer) { if (draw.read_framebuffer != cur_state.draw.read_framebuffer) {
glBindFramebuffer(GL_READ_FRAMEBUFFER, draw.read_framebuffer); glBindFramebuffer(GL_READ_FRAMEBUFFER, draw.read_framebuffer);

View file

@ -6,6 +6,7 @@
#include <array> #include <array>
#include <glad/glad.h> #include <glad/glad.h>
#include "video_core/engines/maxwell_3d.h"
namespace OpenGL { namespace OpenGL {
@ -114,7 +115,7 @@ public:
target = GL_TEXTURE_2D; target = GL_TEXTURE_2D;
} }
}; };
std::array<TextureUnit, 32> texture_units; std::array<TextureUnit, Tegra::Engines::Maxwell3D::Regs::NumTextureSamplers> texture_units;
struct { struct {
GLuint read_framebuffer; // GL_READ_FRAMEBUFFER_BINDING GLuint read_framebuffer; // GL_READ_FRAMEBUFFER_BINDING