mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	gl_state: Sync latest version with Citra.
This commit is contained in:
		
							parent
							
								
									a90ab1dec7
								
							
						
					
					
						commit
						6a0902e56d
					
				| @ -33,7 +33,7 @@ OpenGLState::OpenGLState() { | ||||
|     stencil.action_depth_pass = GL_KEEP; | ||||
|     stencil.action_stencil_fail = GL_KEEP; | ||||
| 
 | ||||
|     blend.enabled = false; | ||||
|     blend.enabled = true; | ||||
|     blend.rgb_equation = GL_FUNC_ADD; | ||||
|     blend.a_equation = GL_FUNC_ADD; | ||||
|     blend.src_rgb_func = GL_ONE; | ||||
| @ -68,6 +68,18 @@ OpenGLState::OpenGLState() { | ||||
|     draw.vertex_buffer = 0; | ||||
|     draw.uniform_buffer = 0; | ||||
|     draw.shader_program = 0; | ||||
|     draw.program_pipeline = 0; | ||||
| 
 | ||||
|     scissor.enabled = false; | ||||
|     scissor.x = 0; | ||||
|     scissor.y = 0; | ||||
|     scissor.width = 0; | ||||
|     scissor.height = 0; | ||||
| 
 | ||||
|     viewport.x = 0; | ||||
|     viewport.y = 0; | ||||
|     viewport.width = 0; | ||||
|     viewport.height = 0; | ||||
| 
 | ||||
|     clip_distance = {}; | ||||
| } | ||||
| @ -148,9 +160,6 @@ void OpenGLState::Apply() const { | ||||
|     if (blend.enabled != cur_state.blend.enabled) { | ||||
|         if (blend.enabled) { | ||||
|             glEnable(GL_BLEND); | ||||
| 
 | ||||
|             cur_state.logic_op = GL_COPY; | ||||
|             glLogicOp(cur_state.logic_op); | ||||
|             glDisable(GL_COLOR_LOGIC_OP); | ||||
|         } else { | ||||
|             glDisable(GL_BLEND); | ||||
| @ -196,7 +205,7 @@ void OpenGLState::Apply() const { | ||||
|     // Lighting LUTs
 | ||||
|     if (lighting_lut.texture_buffer != cur_state.lighting_lut.texture_buffer) { | ||||
|         glActiveTexture(TextureUnits::LightingLUT.Enum()); | ||||
|         glBindTexture(GL_TEXTURE_BUFFER, cur_state.lighting_lut.texture_buffer); | ||||
|         glBindTexture(GL_TEXTURE_BUFFER, lighting_lut.texture_buffer); | ||||
|     } | ||||
| 
 | ||||
|     // Fog LUT
 | ||||
| @ -263,6 +272,31 @@ void OpenGLState::Apply() const { | ||||
|         glUseProgram(draw.shader_program); | ||||
|     } | ||||
| 
 | ||||
|     // Program pipeline
 | ||||
|     if (draw.program_pipeline != cur_state.draw.program_pipeline) { | ||||
|         glBindProgramPipeline(draw.program_pipeline); | ||||
|     } | ||||
| 
 | ||||
|     // Scissor test
 | ||||
|     if (scissor.enabled != cur_state.scissor.enabled) { | ||||
|         if (scissor.enabled) { | ||||
|             glEnable(GL_SCISSOR_TEST); | ||||
|         } else { | ||||
|             glDisable(GL_SCISSOR_TEST); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (scissor.x != cur_state.scissor.x || scissor.y != cur_state.scissor.y || | ||||
|         scissor.width != cur_state.scissor.width || scissor.height != cur_state.scissor.height) { | ||||
|         glScissor(scissor.x, scissor.y, scissor.width, scissor.height); | ||||
|     } | ||||
| 
 | ||||
|     if (viewport.x != cur_state.viewport.x || viewport.y != cur_state.viewport.y || | ||||
|         viewport.width != cur_state.viewport.width || | ||||
|         viewport.height != cur_state.viewport.height) { | ||||
|         glViewport(viewport.x, viewport.y, viewport.width, viewport.height); | ||||
|     } | ||||
| 
 | ||||
|     // Clip distance
 | ||||
|     for (size_t i = 0; i < clip_distance.size(); ++i) { | ||||
|         if (clip_distance[i] != cur_state.clip_distance[i]) { | ||||
| @ -277,62 +311,75 @@ void OpenGLState::Apply() const { | ||||
|     cur_state = *this; | ||||
| } | ||||
| 
 | ||||
| void OpenGLState::ResetTexture(GLuint handle) { | ||||
|     for (auto& unit : cur_state.texture_units) { | ||||
| OpenGLState& OpenGLState::ResetTexture(GLuint handle) { | ||||
|     for (auto& unit : texture_units) { | ||||
|         if (unit.texture_2d == handle) { | ||||
|             unit.texture_2d = 0; | ||||
|         } | ||||
|     } | ||||
|     if (cur_state.lighting_lut.texture_buffer == handle) | ||||
|         cur_state.lighting_lut.texture_buffer = 0; | ||||
|     if (cur_state.fog_lut.texture_buffer == handle) | ||||
|         cur_state.fog_lut.texture_buffer = 0; | ||||
|     if (cur_state.proctex_noise_lut.texture_buffer == handle) | ||||
|         cur_state.proctex_noise_lut.texture_buffer = 0; | ||||
|     if (cur_state.proctex_color_map.texture_buffer == handle) | ||||
|         cur_state.proctex_color_map.texture_buffer = 0; | ||||
|     if (cur_state.proctex_alpha_map.texture_buffer == handle) | ||||
|         cur_state.proctex_alpha_map.texture_buffer = 0; | ||||
|     if (cur_state.proctex_lut.texture_buffer == handle) | ||||
|         cur_state.proctex_lut.texture_buffer = 0; | ||||
|     if (cur_state.proctex_diff_lut.texture_buffer == handle) | ||||
|         cur_state.proctex_diff_lut.texture_buffer = 0; | ||||
|     if (lighting_lut.texture_buffer == handle) | ||||
|         lighting_lut.texture_buffer = 0; | ||||
|     if (fog_lut.texture_buffer == handle) | ||||
|         fog_lut.texture_buffer = 0; | ||||
|     if (proctex_noise_lut.texture_buffer == handle) | ||||
|         proctex_noise_lut.texture_buffer = 0; | ||||
|     if (proctex_color_map.texture_buffer == handle) | ||||
|         proctex_color_map.texture_buffer = 0; | ||||
|     if (proctex_alpha_map.texture_buffer == handle) | ||||
|         proctex_alpha_map.texture_buffer = 0; | ||||
|     if (proctex_lut.texture_buffer == handle) | ||||
|         proctex_lut.texture_buffer = 0; | ||||
|     if (proctex_diff_lut.texture_buffer == handle) | ||||
|         proctex_diff_lut.texture_buffer = 0; | ||||
|     return *this; | ||||
| } | ||||
| 
 | ||||
| void OpenGLState::ResetSampler(GLuint handle) { | ||||
|     for (auto& unit : cur_state.texture_units) { | ||||
| OpenGLState& OpenGLState::ResetSampler(GLuint handle) { | ||||
|     for (auto& unit : texture_units) { | ||||
|         if (unit.sampler == handle) { | ||||
|             unit.sampler = 0; | ||||
|         } | ||||
|     } | ||||
|     return *this; | ||||
| } | ||||
| 
 | ||||
| void OpenGLState::ResetProgram(GLuint handle) { | ||||
|     if (cur_state.draw.shader_program == handle) { | ||||
|         cur_state.draw.shader_program = 0; | ||||
| OpenGLState& OpenGLState::ResetProgram(GLuint handle) { | ||||
|     if (draw.shader_program == handle) { | ||||
|         draw.shader_program = 0; | ||||
|     } | ||||
|     return *this; | ||||
| } | ||||
| 
 | ||||
| void OpenGLState::ResetBuffer(GLuint handle) { | ||||
|     if (cur_state.draw.vertex_buffer == handle) { | ||||
|         cur_state.draw.vertex_buffer = 0; | ||||
|     } | ||||
|     if (cur_state.draw.uniform_buffer == handle) { | ||||
|         cur_state.draw.uniform_buffer = 0; | ||||
| OpenGLState& OpenGLState::ResetPipeline(GLuint handle) { | ||||
|     if (draw.program_pipeline == handle) { | ||||
|         draw.program_pipeline = 0; | ||||
|     } | ||||
|     return *this; | ||||
| } | ||||
| 
 | ||||
| void OpenGLState::ResetVertexArray(GLuint handle) { | ||||
|     if (cur_state.draw.vertex_array == handle) { | ||||
|         cur_state.draw.vertex_array = 0; | ||||
| OpenGLState& OpenGLState::ResetBuffer(GLuint handle) { | ||||
|     if (draw.vertex_buffer == handle) { | ||||
|         draw.vertex_buffer = 0; | ||||
|     } | ||||
|     if (draw.uniform_buffer == handle) { | ||||
|         draw.uniform_buffer = 0; | ||||
|     } | ||||
|     return *this; | ||||
| } | ||||
| 
 | ||||
| void OpenGLState::ResetFramebuffer(GLuint handle) { | ||||
|     if (cur_state.draw.read_framebuffer == handle) { | ||||
|         cur_state.draw.read_framebuffer = 0; | ||||
|     } | ||||
|     if (cur_state.draw.draw_framebuffer == handle) { | ||||
|         cur_state.draw.draw_framebuffer = 0; | ||||
| OpenGLState& OpenGLState::ResetVertexArray(GLuint handle) { | ||||
|     if (draw.vertex_array == handle) { | ||||
|         draw.vertex_array = 0; | ||||
|     } | ||||
|     return *this; | ||||
| } | ||||
| 
 | ||||
| OpenGLState& OpenGLState::ResetFramebuffer(GLuint handle) { | ||||
|     if (draw.read_framebuffer == handle) { | ||||
|         draw.read_framebuffer = 0; | ||||
|     } | ||||
|     if (draw.draw_framebuffer == handle) { | ||||
|         draw.draw_framebuffer = 0; | ||||
|     } | ||||
|     return *this; | ||||
| } | ||||
|  | ||||
| @ -122,27 +122,44 @@ public: | ||||
|         GLuint vertex_buffer;    // GL_ARRAY_BUFFER_BINDING
 | ||||
|         GLuint uniform_buffer;   // GL_UNIFORM_BUFFER_BINDING
 | ||||
|         GLuint shader_program;   // GL_CURRENT_PROGRAM
 | ||||
|         GLuint program_pipeline; // GL_PROGRAM_PIPELINE_BINDING
 | ||||
|     } draw; | ||||
| 
 | ||||
|     struct { | ||||
|         bool enabled; // GL_SCISSOR_TEST
 | ||||
|         GLint x; | ||||
|         GLint y; | ||||
|         GLsizei width; | ||||
|         GLsizei height; | ||||
|     } scissor; | ||||
| 
 | ||||
|     struct { | ||||
|         GLint x; | ||||
|         GLint y; | ||||
|         GLsizei width; | ||||
|         GLsizei height; | ||||
|     } viewport; | ||||
| 
 | ||||
|     std::array<bool, 2> clip_distance; // GL_CLIP_DISTANCE
 | ||||
| 
 | ||||
|     OpenGLState(); | ||||
| 
 | ||||
|     /// Get the currently active OpenGL state
 | ||||
|     static const OpenGLState& GetCurState() { | ||||
|     static OpenGLState GetCurState() { | ||||
|         return cur_state; | ||||
|     } | ||||
| 
 | ||||
|     /// Apply this state as the current OpenGL state
 | ||||
|     void Apply() const; | ||||
| 
 | ||||
|     /// Resets and unbinds any references to the given resource in the current OpenGL state
 | ||||
|     static void ResetTexture(GLuint handle); | ||||
|     static void ResetSampler(GLuint handle); | ||||
|     static void ResetProgram(GLuint handle); | ||||
|     static void ResetBuffer(GLuint handle); | ||||
|     static void ResetVertexArray(GLuint handle); | ||||
|     static void ResetFramebuffer(GLuint handle); | ||||
|     /// Resets any references to the given resource
 | ||||
|     OpenGLState& ResetTexture(GLuint handle); | ||||
|     OpenGLState& ResetSampler(GLuint handle); | ||||
|     OpenGLState& ResetProgram(GLuint handle); | ||||
|     OpenGLState& ResetPipeline(GLuint handle); | ||||
|     OpenGLState& ResetBuffer(GLuint handle); | ||||
|     OpenGLState& ResetVertexArray(GLuint handle); | ||||
|     OpenGLState& ResetFramebuffer(GLuint handle); | ||||
| 
 | ||||
| private: | ||||
|     static OpenGLState cur_state; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 bunnei
						bunnei