Merge pull request #345 from bunnei/blending
renderer_opengl: Implement BlendEquation and BlendFunc.
This commit is contained in:
commit
9dc0d13ba5
6 changed files with 140 additions and 7 deletions
|
@ -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 a new issue