mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Merge pull request #1786 from JayFoxRox/blend-equation
OpenGL: Support blend equation
This commit is contained in:
		
						commit
						e5599ed300
					
				
					 4 changed files with 31 additions and 0 deletions
				
			
		|  | @ -947,6 +947,8 @@ void RasterizerOpenGL::SyncBlendEnabled() { | ||||||
| 
 | 
 | ||||||
| void RasterizerOpenGL::SyncBlendFuncs() { | void RasterizerOpenGL::SyncBlendFuncs() { | ||||||
|     const auto& regs = Pica::g_state.regs; |     const auto& regs = Pica::g_state.regs; | ||||||
|  |     state.blend.rgb_equation = PicaToGL::BlendEquation(regs.output_merger.alpha_blending.blend_equation_rgb); | ||||||
|  |     state.blend.a_equation = PicaToGL::BlendEquation(regs.output_merger.alpha_blending.blend_equation_a); | ||||||
|     state.blend.src_rgb_func = PicaToGL::BlendFunc(regs.output_merger.alpha_blending.factor_source_rgb); |     state.blend.src_rgb_func = PicaToGL::BlendFunc(regs.output_merger.alpha_blending.factor_source_rgb); | ||||||
|     state.blend.dst_rgb_func = PicaToGL::BlendFunc(regs.output_merger.alpha_blending.factor_dest_rgb); |     state.blend.dst_rgb_func = PicaToGL::BlendFunc(regs.output_merger.alpha_blending.factor_dest_rgb); | ||||||
|     state.blend.src_a_func = PicaToGL::BlendFunc(regs.output_merger.alpha_blending.factor_source_a); |     state.blend.src_a_func = PicaToGL::BlendFunc(regs.output_merger.alpha_blending.factor_source_a); | ||||||
|  |  | ||||||
|  | @ -36,6 +36,8 @@ OpenGLState::OpenGLState() { | ||||||
|     stencil.action_stencil_fail = GL_KEEP; |     stencil.action_stencil_fail = GL_KEEP; | ||||||
| 
 | 
 | ||||||
|     blend.enabled = false; |     blend.enabled = false; | ||||||
|  |     blend.rgb_equation = GL_FUNC_ADD; | ||||||
|  |     blend.a_equation = GL_FUNC_ADD; | ||||||
|     blend.src_rgb_func = GL_ONE; |     blend.src_rgb_func = GL_ONE; | ||||||
|     blend.dst_rgb_func = GL_ZERO; |     blend.dst_rgb_func = GL_ZERO; | ||||||
|     blend.src_a_func = GL_ONE; |     blend.src_a_func = GL_ONE; | ||||||
|  | @ -165,6 +167,11 @@ void OpenGLState::Apply() const { | ||||||
|                             blend.src_a_func, blend.dst_a_func); |                             blend.src_a_func, blend.dst_a_func); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     if (blend.rgb_equation != cur_state.blend.rgb_equation || | ||||||
|  |             blend.a_equation != cur_state.blend.a_equation) { | ||||||
|  |         glBlendEquationSeparate(blend.rgb_equation, blend.a_equation); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     if (logic_op != cur_state.logic_op) { |     if (logic_op != cur_state.logic_op) { | ||||||
|         glLogicOp(logic_op); |         glLogicOp(logic_op); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -40,6 +40,8 @@ public: | ||||||
| 
 | 
 | ||||||
|     struct { |     struct { | ||||||
|         bool enabled; // GL_BLEND
 |         bool enabled; // GL_BLEND
 | ||||||
|  |         GLenum rgb_equation; // GL_BLEND_EQUATION_RGB
 | ||||||
|  |         GLenum a_equation; // GL_BLEND_EQUATION_ALPHA
 | ||||||
|         GLenum src_rgb_func; // GL_BLEND_SRC_RGB
 |         GLenum src_rgb_func; // GL_BLEND_SRC_RGB
 | ||||||
|         GLenum dst_rgb_func; // GL_BLEND_DST_RGB
 |         GLenum dst_rgb_func; // GL_BLEND_DST_RGB
 | ||||||
|         GLenum src_a_func; // GL_BLEND_SRC_ALPHA
 |         GLenum src_a_func; // GL_BLEND_SRC_ALPHA
 | ||||||
|  |  | ||||||
|  | @ -78,6 +78,26 @@ inline GLenum WrapMode(Pica::Regs::TextureConfig::WrapMode mode) { | ||||||
|     return gl_mode; |     return gl_mode; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | inline GLenum BlendEquation(Pica::Regs::BlendEquation equation) { | ||||||
|  |     static const GLenum blend_equation_table[] = { | ||||||
|  |         GL_FUNC_ADD,              // BlendEquation::Add
 | ||||||
|  |         GL_FUNC_SUBTRACT,         // BlendEquation::Subtract
 | ||||||
|  |         GL_FUNC_REVERSE_SUBTRACT, // BlendEquation::ReverseSubtract
 | ||||||
|  |         GL_MIN,                   // BlendEquation::Min
 | ||||||
|  |         GL_MAX,                   // BlendEquation::Max
 | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     // Range check table for input
 | ||||||
|  |     if (static_cast<size_t>(equation) >= ARRAY_SIZE(blend_equation_table)) { | ||||||
|  |         LOG_CRITICAL(Render_OpenGL, "Unknown blend equation %d", equation); | ||||||
|  |         UNREACHABLE(); | ||||||
|  | 
 | ||||||
|  |         return GL_FUNC_ADD; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return blend_equation_table[(unsigned)equation]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| inline GLenum BlendFunc(Pica::Regs::BlendFactor factor) { | inline GLenum BlendFunc(Pica::Regs::BlendFactor factor) { | ||||||
|     static const GLenum blend_func_table[] = { |     static const GLenum blend_func_table[] = { | ||||||
|         GL_ZERO,                     // BlendFactor::Zero
 |         GL_ZERO,                     // BlendFactor::Zero
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue