forked from eden-emu/eden
		
	gl_state: Remove blend state tracking
This commit is contained in:
		
							parent
							
								
									ca3cf56db5
								
							
						
					
					
						commit
						0b17608266
					
				
					 5 changed files with 28 additions and 104 deletions
				
			
		|  | @ -442,7 +442,9 @@ void RasterizerOpenGL::Clear() { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // TODO: Signal state tracker about these changes
 |     // TODO: Signal state tracker about these changes
 | ||||||
|  |     // TODO(Rodrigo): Find out if these changes affect clearing
 | ||||||
|     glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE); |     glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE); | ||||||
|  |     glDisablei(GL_BLEND, 0); | ||||||
| 
 | 
 | ||||||
|     UNIMPLEMENTED_IF(regs.clear_flags.viewport); |     UNIMPLEMENTED_IF(regs.clear_flags.viewport); | ||||||
| 
 | 
 | ||||||
|  | @ -1049,37 +1051,34 @@ void RasterizerOpenGL::SyncBlendState() { | ||||||
| 
 | 
 | ||||||
|     glBlendColor(regs.blend_color.r, regs.blend_color.g, regs.blend_color.b, regs.blend_color.a); |     glBlendColor(regs.blend_color.r, regs.blend_color.g, regs.blend_color.b, regs.blend_color.a); | ||||||
| 
 | 
 | ||||||
|     state.independant_blend.enabled = regs.independent_blend_enable; |     if (!regs.independent_blend_enable) { | ||||||
|     if (!state.independant_blend.enabled) { |  | ||||||
|         auto& blend = state.blend[0]; |  | ||||||
|         const auto& src = regs.blend; |         const auto& src = regs.blend; | ||||||
|         blend.enabled = src.enable[0] != 0; |         oglEnable(GL_BLEND, src.enable[0]); | ||||||
|         if (blend.enabled) { |         if (!src.enable[0]) { | ||||||
|             blend.rgb_equation = MaxwellToGL::BlendEquation(src.equation_rgb); |             return; | ||||||
|             blend.src_rgb_func = MaxwellToGL::BlendFunc(src.factor_source_rgb); |  | ||||||
|             blend.dst_rgb_func = MaxwellToGL::BlendFunc(src.factor_dest_rgb); |  | ||||||
|             blend.a_equation = MaxwellToGL::BlendEquation(src.equation_a); |  | ||||||
|             blend.src_a_func = MaxwellToGL::BlendFunc(src.factor_source_a); |  | ||||||
|             blend.dst_a_func = MaxwellToGL::BlendFunc(src.factor_dest_a); |  | ||||||
|         } |  | ||||||
|         for (std::size_t i = 1; i < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets; i++) { |  | ||||||
|             state.blend[i].enabled = false; |  | ||||||
|         } |         } | ||||||
|  |         glBlendFuncSeparate(MaxwellToGL::BlendFunc(src.factor_source_rgb), | ||||||
|  |                             MaxwellToGL::BlendFunc(src.factor_dest_rgb), | ||||||
|  |                             MaxwellToGL::BlendFunc(src.factor_source_a), | ||||||
|  |                             MaxwellToGL::BlendFunc(src.factor_dest_a)); | ||||||
|  |         glBlendEquationSeparate(MaxwellToGL::BlendEquation(src.equation_rgb), | ||||||
|  |                                 MaxwellToGL::BlendEquation(src.equation_a)); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     for (std::size_t i = 0; i < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets; i++) { |     for (std::size_t i = 0; i < Maxwell::NumRenderTargets; ++i) { | ||||||
|         auto& blend = state.blend[i]; |         oglEnablei(GL_BLEND, regs.blend.enable[i], static_cast<GLuint>(i)); | ||||||
|         const auto& src = regs.independent_blend[i]; |         if (!regs.blend.enable[i]) { | ||||||
|         blend.enabled = regs.blend.enable[i] != 0; |  | ||||||
|         if (!blend.enabled) |  | ||||||
|             continue; |             continue; | ||||||
|         blend.rgb_equation = MaxwellToGL::BlendEquation(src.equation_rgb); |         } | ||||||
|         blend.src_rgb_func = MaxwellToGL::BlendFunc(src.factor_source_rgb); |         const auto& src = regs.independent_blend[i]; | ||||||
|         blend.dst_rgb_func = MaxwellToGL::BlendFunc(src.factor_dest_rgb); |         glBlendFuncSeparatei(static_cast<GLuint>(i), MaxwellToGL::BlendFunc(src.factor_source_rgb), | ||||||
|         blend.a_equation = MaxwellToGL::BlendEquation(src.equation_a); |                              MaxwellToGL::BlendFunc(src.factor_dest_rgb), | ||||||
|         blend.src_a_func = MaxwellToGL::BlendFunc(src.factor_source_a); |                              MaxwellToGL::BlendFunc(src.factor_source_a), | ||||||
|         blend.dst_a_func = MaxwellToGL::BlendFunc(src.factor_dest_a); |                              MaxwellToGL::BlendFunc(src.factor_dest_a)); | ||||||
|  |         glBlendEquationSeparatei(static_cast<GLuint>(i), | ||||||
|  |                                  MaxwellToGL::BlendEquation(src.equation_rgb), | ||||||
|  |                                  MaxwellToGL::BlendEquation(src.equation_a)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -106,66 +106,6 @@ void OpenGLState::ApplyProgramPipeline() { | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void OpenGLState::ApplyGlobalBlending() { |  | ||||||
|     const Blend& updated = blend[0]; |  | ||||||
|     Blend& current = cur_state.blend[0]; |  | ||||||
| 
 |  | ||||||
|     Enable(GL_BLEND, current.enabled, updated.enabled); |  | ||||||
| 
 |  | ||||||
|     if (current.src_rgb_func != updated.src_rgb_func || |  | ||||||
|         current.dst_rgb_func != updated.dst_rgb_func || current.src_a_func != updated.src_a_func || |  | ||||||
|         current.dst_a_func != updated.dst_a_func) { |  | ||||||
|         current.src_rgb_func = updated.src_rgb_func; |  | ||||||
|         current.dst_rgb_func = updated.dst_rgb_func; |  | ||||||
|         current.src_a_func = updated.src_a_func; |  | ||||||
|         current.dst_a_func = updated.dst_a_func; |  | ||||||
|         glBlendFuncSeparate(updated.src_rgb_func, updated.dst_rgb_func, updated.src_a_func, |  | ||||||
|                             updated.dst_a_func); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (current.rgb_equation != updated.rgb_equation || current.a_equation != updated.a_equation) { |  | ||||||
|         current.rgb_equation = updated.rgb_equation; |  | ||||||
|         current.a_equation = updated.a_equation; |  | ||||||
|         glBlendEquationSeparate(updated.rgb_equation, updated.a_equation); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void OpenGLState::ApplyTargetBlending(std::size_t target, bool force) { |  | ||||||
|     const Blend& updated = blend[target]; |  | ||||||
|     Blend& current = cur_state.blend[target]; |  | ||||||
| 
 |  | ||||||
|     if (current.enabled != updated.enabled || force) { |  | ||||||
|         current.enabled = updated.enabled; |  | ||||||
|         Enable(GL_BLEND, static_cast<GLuint>(target), updated.enabled); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (UpdateTie(std::tie(current.src_rgb_func, current.dst_rgb_func, current.src_a_func, |  | ||||||
|                            current.dst_a_func), |  | ||||||
|                   std::tie(updated.src_rgb_func, updated.dst_rgb_func, updated.src_a_func, |  | ||||||
|                            updated.dst_a_func))) { |  | ||||||
|         glBlendFuncSeparatei(static_cast<GLuint>(target), updated.src_rgb_func, |  | ||||||
|                              updated.dst_rgb_func, updated.src_a_func, updated.dst_a_func); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (UpdateTie(std::tie(current.rgb_equation, current.a_equation), |  | ||||||
|                   std::tie(updated.rgb_equation, updated.a_equation))) { |  | ||||||
|         glBlendEquationSeparatei(static_cast<GLuint>(target), updated.rgb_equation, |  | ||||||
|                                  updated.a_equation); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void OpenGLState::ApplyBlending() { |  | ||||||
|     if (independant_blend.enabled) { |  | ||||||
|         const bool force = independant_blend.enabled != cur_state.independant_blend.enabled; |  | ||||||
|         for (std::size_t target = 0; target < Maxwell::NumRenderTargets; ++target) { |  | ||||||
|             ApplyTargetBlending(target, force); |  | ||||||
|         } |  | ||||||
|     } else { |  | ||||||
|         ApplyGlobalBlending(); |  | ||||||
|     } |  | ||||||
|     cur_state.independant_blend.enabled = independant_blend.enabled; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void OpenGLState::ApplyRenderBuffer() { | void OpenGLState::ApplyRenderBuffer() { | ||||||
|     if (cur_state.renderbuffer != renderbuffer) { |     if (cur_state.renderbuffer != renderbuffer) { | ||||||
|         cur_state.renderbuffer = renderbuffer; |         cur_state.renderbuffer = renderbuffer; | ||||||
|  | @ -206,7 +146,6 @@ void OpenGLState::Apply() { | ||||||
|     ApplyFramebufferState(); |     ApplyFramebufferState(); | ||||||
|     ApplyShaderProgram(); |     ApplyShaderProgram(); | ||||||
|     ApplyProgramPipeline(); |     ApplyProgramPipeline(); | ||||||
|     ApplyBlending(); |  | ||||||
|     ApplyTextures(); |     ApplyTextures(); | ||||||
|     ApplySamplers(); |     ApplySamplers(); | ||||||
|     ApplyImages(); |     ApplyImages(); | ||||||
|  |  | ||||||
|  | @ -13,21 +13,6 @@ namespace OpenGL { | ||||||
| 
 | 
 | ||||||
| class OpenGLState { | class OpenGLState { | ||||||
| public: | public: | ||||||
|     struct Blend { |  | ||||||
|         bool enabled = false;              // GL_BLEND
 |  | ||||||
|         GLenum rgb_equation = GL_FUNC_ADD; // GL_BLEND_EQUATION_RGB
 |  | ||||||
|         GLenum a_equation = GL_FUNC_ADD;   // GL_BLEND_EQUATION_ALPHA
 |  | ||||||
|         GLenum src_rgb_func = GL_ONE;      // GL_BLEND_SRC_RGB
 |  | ||||||
|         GLenum dst_rgb_func = GL_ZERO;     // GL_BLEND_DST_RGB
 |  | ||||||
|         GLenum src_a_func = GL_ONE;        // GL_BLEND_SRC_ALPHA
 |  | ||||||
|         GLenum dst_a_func = GL_ZERO;       // GL_BLEND_DST_ALPHA
 |  | ||||||
|     }; |  | ||||||
|     std::array<Blend, Tegra::Engines::Maxwell3D::Regs::NumRenderTargets> blend; |  | ||||||
| 
 |  | ||||||
|     struct { |  | ||||||
|         bool enabled = false; |  | ||||||
|     } independant_blend; |  | ||||||
| 
 |  | ||||||
|     static constexpr std::size_t NumSamplers = 32 * 5; |     static constexpr std::size_t NumSamplers = 32 * 5; | ||||||
|     static constexpr std::size_t NumImages = 8 * 5; |     static constexpr std::size_t NumImages = 8 * 5; | ||||||
|     std::array<GLuint, NumSamplers> textures = {}; |     std::array<GLuint, NumSamplers> textures = {}; | ||||||
|  | @ -56,9 +41,6 @@ public: | ||||||
|     void ApplyFramebufferState(); |     void ApplyFramebufferState(); | ||||||
|     void ApplyShaderProgram(); |     void ApplyShaderProgram(); | ||||||
|     void ApplyProgramPipeline(); |     void ApplyProgramPipeline(); | ||||||
|     void ApplyTargetBlending(std::size_t target, bool force); |  | ||||||
|     void ApplyGlobalBlending(); |  | ||||||
|     void ApplyBlending(); |  | ||||||
|     void ApplyTextures(); |     void ApplyTextures(); | ||||||
|     void ApplySamplers(); |     void ApplySamplers(); | ||||||
|     void ApplyImages(); |     void ApplyImages(); | ||||||
|  |  | ||||||
|  | @ -537,8 +537,11 @@ void TextureCacheOpenGL::ImageBlit(View& src_view, View& dst_view, | ||||||
|         glDisable(GL_FRAMEBUFFER_SRGB); |         glDisable(GL_FRAMEBUFFER_SRGB); | ||||||
|     } |     } | ||||||
|     // TODO(Rodrigo): Find out if rasterizer discard affects blits
 |     // TODO(Rodrigo): Find out if rasterizer discard affects blits
 | ||||||
|  |     // TODO(Rodrigo): Find out if blending affects blits
 | ||||||
|  |     // TODO(Rodrigo): Find out if clip control affects blits
 | ||||||
|     glDisable(GL_RASTERIZER_DISCARD); |     glDisable(GL_RASTERIZER_DISCARD); | ||||||
|     glDisablei(GL_SCISSOR_TEST, 0); |     glDisablei(GL_SCISSOR_TEST, 0); | ||||||
|  |     glDisablei(GL_BLEND, 0); | ||||||
|     glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE); |     glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE); | ||||||
| 
 | 
 | ||||||
|     u32 buffers{}; |     u32 buffers{}; | ||||||
|  |  | ||||||
|  | @ -582,6 +582,7 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) { | ||||||
|     glDisable(GL_STENCIL_TEST); |     glDisable(GL_STENCIL_TEST); | ||||||
|     glDisable(GL_POLYGON_OFFSET_FILL); |     glDisable(GL_POLYGON_OFFSET_FILL); | ||||||
|     glDisable(GL_RASTERIZER_DISCARD); |     glDisable(GL_RASTERIZER_DISCARD); | ||||||
|  |     glDisablei(GL_BLEND, 0); | ||||||
|     glDisablei(GL_SCISSOR_TEST, 0); |     glDisablei(GL_SCISSOR_TEST, 0); | ||||||
|     glCullFace(GL_BACK); |     glCullFace(GL_BACK); | ||||||
|     glFrontFace(GL_CW); |     glFrontFace(GL_CW); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 ReinUsesLisp
						ReinUsesLisp