mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-30 15:39:02 -05:00 
			
		
		
		
	Merge pull request #1406 from ReinUsesLisp/multibind-samplers
gl_state: Pack sampler bindings into a single ARB_multi_bind
This commit is contained in:
		| @@ -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. | ||||||
|   | |||||||
| @@ -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; | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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); | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei