mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	Merge pull request #345 from bunnei/blending
renderer_opengl: Implement BlendEquation and BlendFunc.
This commit is contained in:
		
						commit
						9dc0d13ba5
					
				| @ -74,8 +74,6 @@ void Maxwell3D::WriteReg(u32 method, u32 value, u32 remaining_params) { | |||||||
| 
 | 
 | ||||||
|     regs.reg_array[method] = value; |     regs.reg_array[method] = value; | ||||||
| 
 | 
 | ||||||
| #define MAXWELL3D_REG_INDEX(field_name) (offsetof(Regs, field_name) / sizeof(u32)) |  | ||||||
| 
 |  | ||||||
|     switch (method) { |     switch (method) { | ||||||
|     case MAXWELL3D_REG_INDEX(code_address.code_address_high): |     case MAXWELL3D_REG_INDEX(code_address.code_address_high): | ||||||
|     case MAXWELL3D_REG_INDEX(code_address.code_address_low): { |     case MAXWELL3D_REG_INDEX(code_address.code_address_low): { | ||||||
| @ -136,7 +134,7 @@ void Maxwell3D::WriteReg(u32 method, u32 value, u32 remaining_params) { | |||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| #undef MAXWELL3D_REG_INDEX |     VideoCore::g_renderer->Rasterizer()->NotifyMaxwellRegisterChanged(method); | ||||||
| 
 | 
 | ||||||
|     if (debug_context) { |     if (debug_context) { | ||||||
|         debug_context->OnEvent(Tegra::DebugContext::Event::MaxwellCommandProcessed, nullptr); |         debug_context->OnEvent(Tegra::DebugContext::Event::MaxwellCommandProcessed, nullptr); | ||||||
|  | |||||||
| @ -20,6 +20,9 @@ | |||||||
| namespace Tegra { | namespace Tegra { | ||||||
| namespace Engines { | namespace Engines { | ||||||
| 
 | 
 | ||||||
|  | #define MAXWELL3D_REG_INDEX(field_name)                                                            \ | ||||||
|  |     (offsetof(Tegra::Engines::Maxwell3D::Regs, field_name) / sizeof(u32)) | ||||||
|  | 
 | ||||||
| class Maxwell3D final { | class Maxwell3D final { | ||||||
| public: | public: | ||||||
|     explicit Maxwell3D(MemoryManager& memory_manager); |     explicit Maxwell3D(MemoryManager& memory_manager); | ||||||
| @ -254,6 +257,46 @@ public: | |||||||
|             UnsignedInt = 0x2, |             UnsignedInt = 0x2, | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|  |         struct Blend { | ||||||
|  |             enum class Equation : u32 { | ||||||
|  |                 Add = 1, | ||||||
|  |                 Subtract = 2, | ||||||
|  |                 ReverseSubtract = 3, | ||||||
|  |                 Min = 4, | ||||||
|  |                 Max = 5, | ||||||
|  |             }; | ||||||
|  | 
 | ||||||
|  |             enum class Factor : u32 { | ||||||
|  |                 Zero = 0x1, | ||||||
|  |                 One = 0x2, | ||||||
|  |                 SourceColor = 0x3, | ||||||
|  |                 OneMinusSourceColor = 0x4, | ||||||
|  |                 SourceAlpha = 0x5, | ||||||
|  |                 OneMinusSourceAlpha = 0x6, | ||||||
|  |                 DestAlpha = 0x7, | ||||||
|  |                 OneMinusDestAlpha = 0x8, | ||||||
|  |                 DestColor = 0x9, | ||||||
|  |                 OneMinusDestColor = 0xa, | ||||||
|  |                 SourceAlphaSaturate = 0xb, | ||||||
|  |                 Source1Color = 0x10, | ||||||
|  |                 OneMinusSource1Color = 0x11, | ||||||
|  |                 Source1Alpha = 0x12, | ||||||
|  |                 OneMinusSource1Alpha = 0x13, | ||||||
|  |                 ConstantColor = 0x61, | ||||||
|  |                 OneMinusConstantColor = 0x62, | ||||||
|  |                 ConstantAlpha = 0x63, | ||||||
|  |                 OneMinusConstantAlpha = 0x64, | ||||||
|  |             }; | ||||||
|  | 
 | ||||||
|  |             u32 separate_alpha; | ||||||
|  |             Equation equation_rgb; | ||||||
|  |             Factor factor_source_rgb; | ||||||
|  |             Factor factor_dest_rgb; | ||||||
|  |             Equation equation_a; | ||||||
|  |             Factor factor_source_a; | ||||||
|  |             Factor factor_dest_a; | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|         union { |         union { | ||||||
|             struct { |             struct { | ||||||
|                 INSERT_PADDING_WORDS(0x200); |                 INSERT_PADDING_WORDS(0x200); | ||||||
| @ -451,7 +494,9 @@ public: | |||||||
|                     } |                     } | ||||||
|                 } vertex_array[NumVertexArrays]; |                 } vertex_array[NumVertexArrays]; | ||||||
| 
 | 
 | ||||||
|                 INSERT_PADDING_WORDS(0x40); |                 Blend blend; | ||||||
|  | 
 | ||||||
|  |                 INSERT_PADDING_WORDS(0x39); | ||||||
| 
 | 
 | ||||||
|                 struct { |                 struct { | ||||||
|                     u32 limit_high; |                     u32 limit_high; | ||||||
| @ -616,6 +661,7 @@ ASSERT_REG_POSITION(draw, 0x585); | |||||||
| ASSERT_REG_POSITION(index_array, 0x5F2); | ASSERT_REG_POSITION(index_array, 0x5F2); | ||||||
| ASSERT_REG_POSITION(query, 0x6C0); | ASSERT_REG_POSITION(query, 0x6C0); | ||||||
| ASSERT_REG_POSITION(vertex_array[0], 0x700); | ASSERT_REG_POSITION(vertex_array[0], 0x700); | ||||||
|  | ASSERT_REG_POSITION(blend, 0x780); | ||||||
| ASSERT_REG_POSITION(vertex_array_limit[0], 0x7C0); | ASSERT_REG_POSITION(vertex_array_limit[0], 0x7C0); | ||||||
| ASSERT_REG_POSITION(shader_config[0], 0x800); | ASSERT_REG_POSITION(shader_config[0], 0x800); | ||||||
| ASSERT_REG_POSITION(const_buffer, 0x8E0); | ASSERT_REG_POSITION(const_buffer, 0x8E0); | ||||||
|  | |||||||
| @ -19,7 +19,7 @@ public: | |||||||
|     virtual void DrawArrays() = 0; |     virtual void DrawArrays() = 0; | ||||||
| 
 | 
 | ||||||
|     /// Notify rasterizer that the specified Maxwell register has been changed
 |     /// Notify rasterizer that the specified Maxwell register has been changed
 | ||||||
|     virtual void NotifyMaxwellRegisterChanged(u32 id) = 0; |     virtual void NotifyMaxwellRegisterChanged(u32 method) = 0; | ||||||
| 
 | 
 | ||||||
|     /// Notify rasterizer that all caches should be flushed to Switch memory
 |     /// Notify rasterizer that all caches should be flushed to Switch memory
 | ||||||
|     virtual void FlushAll() = 0; |     virtual void FlushAll() = 0; | ||||||
|  | |||||||
| @ -446,7 +446,32 @@ void RasterizerOpenGL::BindTextures() { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RasterizerOpenGL::NotifyMaxwellRegisterChanged(u32 id) {} | void RasterizerOpenGL::NotifyMaxwellRegisterChanged(u32 method) { | ||||||
|  |     const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs; | ||||||
|  |     switch (method) { | ||||||
|  |     case MAXWELL3D_REG_INDEX(blend.separate_alpha): | ||||||
|  |         ASSERT_MSG(false, "unimplemented"); | ||||||
|  |         break; | ||||||
|  |     case MAXWELL3D_REG_INDEX(blend.equation_rgb): | ||||||
|  |         state.blend.rgb_equation = MaxwellToGL::BlendEquation(regs.blend.equation_rgb); | ||||||
|  |         break; | ||||||
|  |     case MAXWELL3D_REG_INDEX(blend.factor_source_rgb): | ||||||
|  |         state.blend.src_rgb_func = MaxwellToGL::BlendFunc(regs.blend.factor_source_rgb); | ||||||
|  |         break; | ||||||
|  |     case MAXWELL3D_REG_INDEX(blend.factor_dest_rgb): | ||||||
|  |         state.blend.dst_rgb_func = MaxwellToGL::BlendFunc(regs.blend.factor_dest_rgb); | ||||||
|  |         break; | ||||||
|  |     case MAXWELL3D_REG_INDEX(blend.equation_a): | ||||||
|  |         state.blend.a_equation = MaxwellToGL::BlendEquation(regs.blend.equation_a); | ||||||
|  |         break; | ||||||
|  |     case MAXWELL3D_REG_INDEX(blend.factor_source_a): | ||||||
|  |         state.blend.src_a_func = MaxwellToGL::BlendFunc(regs.blend.factor_source_a); | ||||||
|  |         break; | ||||||
|  |     case MAXWELL3D_REG_INDEX(blend.factor_dest_a): | ||||||
|  |         state.blend.dst_a_func = MaxwellToGL::BlendFunc(regs.blend.factor_dest_a); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| void RasterizerOpenGL::FlushAll() { | void RasterizerOpenGL::FlushAll() { | ||||||
|     MICROPROFILE_SCOPE(OpenGL_CacheManagement); |     MICROPROFILE_SCOPE(OpenGL_CacheManagement); | ||||||
|  | |||||||
| @ -32,7 +32,7 @@ public: | |||||||
|     ~RasterizerOpenGL() override; |     ~RasterizerOpenGL() override; | ||||||
| 
 | 
 | ||||||
|     void DrawArrays() override; |     void DrawArrays() override; | ||||||
|     void NotifyMaxwellRegisterChanged(u32 id) override; |     void NotifyMaxwellRegisterChanged(u32 method) override; | ||||||
|     void FlushAll() override; |     void FlushAll() override; | ||||||
|     void FlushRegion(VAddr addr, u64 size) override; |     void FlushRegion(VAddr addr, u64 size) override; | ||||||
|     void InvalidateRegion(VAddr addr, u64 size) override; |     void InvalidateRegion(VAddr addr, u64 size) override; | ||||||
|  | |||||||
| @ -102,4 +102,68 @@ inline GLenum WrapMode(Tegra::Texture::WrapMode wrap_mode) { | |||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | inline GLenum BlendEquation(Maxwell::Blend::Equation equation) { | ||||||
|  |     switch (equation) { | ||||||
|  |     case Maxwell::Blend::Equation::Add: | ||||||
|  |         return GL_FUNC_ADD; | ||||||
|  |     case Maxwell::Blend::Equation::Subtract: | ||||||
|  |         return GL_FUNC_SUBTRACT; | ||||||
|  |     case Maxwell::Blend::Equation::ReverseSubtract: | ||||||
|  |         return GL_FUNC_REVERSE_SUBTRACT; | ||||||
|  |     case Maxwell::Blend::Equation::Min: | ||||||
|  |         return GL_MIN; | ||||||
|  |     case Maxwell::Blend::Equation::Max: | ||||||
|  |         return GL_MAX; | ||||||
|  |     } | ||||||
|  |     NGLOG_CRITICAL(Render_OpenGL, "Unimplemented blend equation={}", static_cast<u32>(equation)); | ||||||
|  |     UNREACHABLE(); | ||||||
|  |     return {}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | inline GLenum BlendFunc(Maxwell::Blend::Factor factor) { | ||||||
|  |     switch (factor) { | ||||||
|  |     case Maxwell::Blend::Factor::Zero: | ||||||
|  |         return GL_ZERO; | ||||||
|  |     case Maxwell::Blend::Factor::One: | ||||||
|  |         return GL_ONE; | ||||||
|  |     case Maxwell::Blend::Factor::SourceColor: | ||||||
|  |         return GL_SRC_COLOR; | ||||||
|  |     case Maxwell::Blend::Factor::OneMinusSourceColor: | ||||||
|  |         return GL_ONE_MINUS_SRC_COLOR; | ||||||
|  |     case Maxwell::Blend::Factor::SourceAlpha: | ||||||
|  |         return GL_SRC_ALPHA; | ||||||
|  |     case Maxwell::Blend::Factor::OneMinusSourceAlpha: | ||||||
|  |         return GL_ONE_MINUS_SRC_ALPHA; | ||||||
|  |     case Maxwell::Blend::Factor::DestAlpha: | ||||||
|  |         return GL_DST_ALPHA; | ||||||
|  |     case Maxwell::Blend::Factor::OneMinusDestAlpha: | ||||||
|  |         return GL_ONE_MINUS_DST_ALPHA; | ||||||
|  |     case Maxwell::Blend::Factor::DestColor: | ||||||
|  |         return GL_DST_COLOR; | ||||||
|  |     case Maxwell::Blend::Factor::OneMinusDestColor: | ||||||
|  |         return GL_ONE_MINUS_DST_COLOR; | ||||||
|  |     case Maxwell::Blend::Factor::SourceAlphaSaturate: | ||||||
|  |         return GL_SRC_ALPHA_SATURATE; | ||||||
|  |     case Maxwell::Blend::Factor::Source1Color: | ||||||
|  |         return GL_SRC1_COLOR; | ||||||
|  |     case Maxwell::Blend::Factor::OneMinusSource1Color: | ||||||
|  |         return GL_ONE_MINUS_SRC1_COLOR; | ||||||
|  |     case Maxwell::Blend::Factor::Source1Alpha: | ||||||
|  |         return GL_SRC1_ALPHA; | ||||||
|  |     case Maxwell::Blend::Factor::OneMinusSource1Alpha: | ||||||
|  |         return GL_ONE_MINUS_SRC1_ALPHA; | ||||||
|  |     case Maxwell::Blend::Factor::ConstantColor: | ||||||
|  |         return GL_CONSTANT_COLOR; | ||||||
|  |     case Maxwell::Blend::Factor::OneMinusConstantColor: | ||||||
|  |         return GL_ONE_MINUS_CONSTANT_COLOR; | ||||||
|  |     case Maxwell::Blend::Factor::ConstantAlpha: | ||||||
|  |         return GL_CONSTANT_ALPHA; | ||||||
|  |     case Maxwell::Blend::Factor::OneMinusConstantAlpha: | ||||||
|  |         return GL_ONE_MINUS_CONSTANT_ALPHA; | ||||||
|  |     } | ||||||
|  |     NGLOG_CRITICAL(Render_OpenGL, "Unimplemented blend factor={}", static_cast<u32>(factor)); | ||||||
|  |     UNREACHABLE(); | ||||||
|  |     return {}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } // namespace MaxwellToGL
 | } // namespace MaxwellToGL
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 bunnei
						bunnei