summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl
diff options
context:
space:
mode:
authorYuri Kunde Schlesner <yuriks@yuriks.net>2017-01-28 05:51:59 +0100
committerYuri Kunde Schlesner <yuriks@yuriks.net>2017-02-04 22:59:09 +0100
commit9017093f58fb08b85cfb842f305efa667d62cecb (patch)
tree98a1e77b197a562a8f13565e62f2e8bb9220ff94 /src/video_core/renderer_opengl
parentVideoCore: Split rasterizer regs from Regs struct (diff)
downloadyuzu-9017093f58fb08b85cfb842f305efa667d62cecb.tar
yuzu-9017093f58fb08b85cfb842f305efa667d62cecb.tar.gz
yuzu-9017093f58fb08b85cfb842f305efa667d62cecb.tar.bz2
yuzu-9017093f58fb08b85cfb842f305efa667d62cecb.tar.lz
yuzu-9017093f58fb08b85cfb842f305efa667d62cecb.tar.xz
yuzu-9017093f58fb08b85cfb842f305efa667d62cecb.tar.zst
yuzu-9017093f58fb08b85cfb842f305efa667d62cecb.zip
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp129
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h25
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.cpp4
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.h4
-rw-r--r--src/video_core/renderer_opengl/gl_shader_gen.cpp10
-rw-r--r--src/video_core/renderer_opengl/pica_to_gl.h4
6 files changed, 91 insertions, 85 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index c4061c005..f7eaa17e2 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -26,13 +26,15 @@ MICROPROFILE_DEFINE(OpenGL_Drawing, "OpenGL", "Drawing", MP_RGB(128, 128, 192));
MICROPROFILE_DEFINE(OpenGL_Blits, "OpenGL", "Blits", MP_RGB(100, 100, 255));
MICROPROFILE_DEFINE(OpenGL_CacheManagement, "OpenGL", "Cache Mgmt", MP_RGB(100, 255, 100));
-static bool IsPassThroughTevStage(const Pica::Regs::TevStageConfig& stage) {
- return (stage.color_op == Pica::Regs::TevStageConfig::Operation::Replace &&
- stage.alpha_op == Pica::Regs::TevStageConfig::Operation::Replace &&
- stage.color_source1 == Pica::Regs::TevStageConfig::Source::Previous &&
- stage.alpha_source1 == Pica::Regs::TevStageConfig::Source::Previous &&
- stage.color_modifier1 == Pica::Regs::TevStageConfig::ColorModifier::SourceColor &&
- stage.alpha_modifier1 == Pica::Regs::TevStageConfig::AlphaModifier::SourceAlpha &&
+static bool IsPassThroughTevStage(const Pica::TexturingRegs::TevStageConfig& stage) {
+ using TevStageConfig = Pica::TexturingRegs::TevStageConfig;
+
+ return (stage.color_op == TevStageConfig::Operation::Replace &&
+ stage.alpha_op == TevStageConfig::Operation::Replace &&
+ stage.color_source1 == TevStageConfig::Source::Previous &&
+ stage.alpha_source1 == TevStageConfig::Source::Previous &&
+ stage.color_modifier1 == TevStageConfig::ColorModifier::SourceColor &&
+ stage.alpha_modifier1 == TevStageConfig::AlphaModifier::SourceAlpha &&
stage.GetColorMultiplier() == 1 && stage.GetAlphaMultiplier() == 1);
}
@@ -242,7 +244,7 @@ void RasterizerOpenGL::DrawTriangles() {
}
// Sync and bind the texture surfaces
- const auto pica_textures = regs.GetTextures();
+ const auto pica_textures = regs.texturing.GetTextures();
for (unsigned texture_index = 0; texture_index < pica_textures.size(); ++texture_index) {
const auto& texture = pica_textures[texture_index];
@@ -348,17 +350,17 @@ void RasterizerOpenGL::NotifyPicaRegisterChanged(u32 id) {
break;
// Fog state
- case PICA_REG_INDEX(fog_color):
+ case PICA_REG_INDEX(texturing.fog_color):
SyncFogColor();
break;
- case PICA_REG_INDEX_WORKAROUND(fog_lut_data[0], 0xe8):
- case PICA_REG_INDEX_WORKAROUND(fog_lut_data[1], 0xe9):
- case PICA_REG_INDEX_WORKAROUND(fog_lut_data[2], 0xea):
- case PICA_REG_INDEX_WORKAROUND(fog_lut_data[3], 0xeb):
- case PICA_REG_INDEX_WORKAROUND(fog_lut_data[4], 0xec):
- case PICA_REG_INDEX_WORKAROUND(fog_lut_data[5], 0xed):
- case PICA_REG_INDEX_WORKAROUND(fog_lut_data[6], 0xee):
- case PICA_REG_INDEX_WORKAROUND(fog_lut_data[7], 0xef):
+ case PICA_REG_INDEX_WORKAROUND(texturing.fog_lut_data[0], 0xe8):
+ case PICA_REG_INDEX_WORKAROUND(texturing.fog_lut_data[1], 0xe9):
+ case PICA_REG_INDEX_WORKAROUND(texturing.fog_lut_data[2], 0xea):
+ case PICA_REG_INDEX_WORKAROUND(texturing.fog_lut_data[3], 0xeb):
+ case PICA_REG_INDEX_WORKAROUND(texturing.fog_lut_data[4], 0xec):
+ case PICA_REG_INDEX_WORKAROUND(texturing.fog_lut_data[5], 0xed):
+ case PICA_REG_INDEX_WORKAROUND(texturing.fog_lut_data[6], 0xee):
+ case PICA_REG_INDEX_WORKAROUND(texturing.fog_lut_data[7], 0xef):
uniform_block_data.fog_lut_dirty = true;
break;
@@ -411,60 +413,60 @@ void RasterizerOpenGL::NotifyPicaRegisterChanged(u32 id) {
break;
// Texture 0 type
- case PICA_REG_INDEX(texture0.type):
+ case PICA_REG_INDEX(texturing.texture0.type):
shader_dirty = true;
break;
// TEV stages
// (This also syncs fog_mode and fog_flip which are part of tev_combiner_buffer_input)
- case PICA_REG_INDEX(tev_stage0.color_source1):
- case PICA_REG_INDEX(tev_stage0.color_modifier1):
- case PICA_REG_INDEX(tev_stage0.color_op):
- case PICA_REG_INDEX(tev_stage0.color_scale):
- case PICA_REG_INDEX(tev_stage1.color_source1):
- case PICA_REG_INDEX(tev_stage1.color_modifier1):
- case PICA_REG_INDEX(tev_stage1.color_op):
- case PICA_REG_INDEX(tev_stage1.color_scale):
- case PICA_REG_INDEX(tev_stage2.color_source1):
- case PICA_REG_INDEX(tev_stage2.color_modifier1):
- case PICA_REG_INDEX(tev_stage2.color_op):
- case PICA_REG_INDEX(tev_stage2.color_scale):
- case PICA_REG_INDEX(tev_stage3.color_source1):
- case PICA_REG_INDEX(tev_stage3.color_modifier1):
- case PICA_REG_INDEX(tev_stage3.color_op):
- case PICA_REG_INDEX(tev_stage3.color_scale):
- case PICA_REG_INDEX(tev_stage4.color_source1):
- case PICA_REG_INDEX(tev_stage4.color_modifier1):
- case PICA_REG_INDEX(tev_stage4.color_op):
- case PICA_REG_INDEX(tev_stage4.color_scale):
- case PICA_REG_INDEX(tev_stage5.color_source1):
- case PICA_REG_INDEX(tev_stage5.color_modifier1):
- case PICA_REG_INDEX(tev_stage5.color_op):
- case PICA_REG_INDEX(tev_stage5.color_scale):
- case PICA_REG_INDEX(tev_combiner_buffer_input):
+ case PICA_REG_INDEX(texturing.tev_stage0.color_source1):
+ case PICA_REG_INDEX(texturing.tev_stage0.color_modifier1):
+ case PICA_REG_INDEX(texturing.tev_stage0.color_op):
+ case PICA_REG_INDEX(texturing.tev_stage0.color_scale):
+ case PICA_REG_INDEX(texturing.tev_stage1.color_source1):
+ case PICA_REG_INDEX(texturing.tev_stage1.color_modifier1):
+ case PICA_REG_INDEX(texturing.tev_stage1.color_op):
+ case PICA_REG_INDEX(texturing.tev_stage1.color_scale):
+ case PICA_REG_INDEX(texturing.tev_stage2.color_source1):
+ case PICA_REG_INDEX(texturing.tev_stage2.color_modifier1):
+ case PICA_REG_INDEX(texturing.tev_stage2.color_op):
+ case PICA_REG_INDEX(texturing.tev_stage2.color_scale):
+ case PICA_REG_INDEX(texturing.tev_stage3.color_source1):
+ case PICA_REG_INDEX(texturing.tev_stage3.color_modifier1):
+ case PICA_REG_INDEX(texturing.tev_stage3.color_op):
+ case PICA_REG_INDEX(texturing.tev_stage3.color_scale):
+ case PICA_REG_INDEX(texturing.tev_stage4.color_source1):
+ case PICA_REG_INDEX(texturing.tev_stage4.color_modifier1):
+ case PICA_REG_INDEX(texturing.tev_stage4.color_op):
+ case PICA_REG_INDEX(texturing.tev_stage4.color_scale):
+ case PICA_REG_INDEX(texturing.tev_stage5.color_source1):
+ case PICA_REG_INDEX(texturing.tev_stage5.color_modifier1):
+ case PICA_REG_INDEX(texturing.tev_stage5.color_op):
+ case PICA_REG_INDEX(texturing.tev_stage5.color_scale):
+ case PICA_REG_INDEX(texturing.tev_combiner_buffer_input):
shader_dirty = true;
break;
- case PICA_REG_INDEX(tev_stage0.const_r):
- SyncTevConstColor(0, regs.tev_stage0);
+ case PICA_REG_INDEX(texturing.tev_stage0.const_r):
+ SyncTevConstColor(0, regs.texturing.tev_stage0);
break;
- case PICA_REG_INDEX(tev_stage1.const_r):
- SyncTevConstColor(1, regs.tev_stage1);
+ case PICA_REG_INDEX(texturing.tev_stage1.const_r):
+ SyncTevConstColor(1, regs.texturing.tev_stage1);
break;
- case PICA_REG_INDEX(tev_stage2.const_r):
- SyncTevConstColor(2, regs.tev_stage2);
+ case PICA_REG_INDEX(texturing.tev_stage2.const_r):
+ SyncTevConstColor(2, regs.texturing.tev_stage2);
break;
- case PICA_REG_INDEX(tev_stage3.const_r):
- SyncTevConstColor(3, regs.tev_stage3);
+ case PICA_REG_INDEX(texturing.tev_stage3.const_r):
+ SyncTevConstColor(3, regs.texturing.tev_stage3);
break;
- case PICA_REG_INDEX(tev_stage4.const_r):
- SyncTevConstColor(4, regs.tev_stage4);
+ case PICA_REG_INDEX(texturing.tev_stage4.const_r):
+ SyncTevConstColor(4, regs.texturing.tev_stage4);
break;
- case PICA_REG_INDEX(tev_stage5.const_r):
- SyncTevConstColor(5, regs.tev_stage5);
+ case PICA_REG_INDEX(texturing.tev_stage5.const_r):
+ SyncTevConstColor(5, regs.texturing.tev_stage5);
break;
// TEV combiner buffer color
- case PICA_REG_INDEX(tev_combiner_buffer_color):
+ case PICA_REG_INDEX(texturing.tev_combiner_buffer_color):
SyncCombinerColor();
break;
@@ -979,7 +981,9 @@ void RasterizerOpenGL::SamplerInfo::Create() {
// Other attributes have correct defaults
}
-void RasterizerOpenGL::SamplerInfo::SyncWithConfig(const Pica::Regs::TextureConfig& config) {
+void RasterizerOpenGL::SamplerInfo::SyncWithConfig(
+ const Pica::TexturingRegs::TextureConfig& config) {
+
GLuint s = sampler.handle;
if (mag_filter != config.mag_filter) {
@@ -1091,7 +1095,7 @@ void RasterizerOpenGL::SetShader() {
SyncDepthOffset();
SyncAlphaTest();
SyncCombinerColor();
- auto& tev_stages = Pica::g_state.regs.GetTevStages();
+ auto& tev_stages = Pica::g_state.regs.texturing.GetTevStages();
for (int index = 0; index < tev_stages.size(); ++index)
SyncTevConstColor(index, tev_stages[index]);
@@ -1182,8 +1186,8 @@ void RasterizerOpenGL::SyncBlendColor() {
void RasterizerOpenGL::SyncFogColor() {
const auto& regs = Pica::g_state.regs;
uniform_block_data.data.fog_color = {
- regs.fog_color.r.Value() / 255.0f, regs.fog_color.g.Value() / 255.0f,
- regs.fog_color.b.Value() / 255.0f,
+ regs.texturing.fog_color.r.Value() / 255.0f, regs.texturing.fog_color.g.Value() / 255.0f,
+ regs.texturing.fog_color.b.Value() / 255.0f,
};
uniform_block_data.dirty = true;
}
@@ -1267,7 +1271,8 @@ void RasterizerOpenGL::SyncDepthTest() {
}
void RasterizerOpenGL::SyncCombinerColor() {
- auto combiner_color = PicaToGL::ColorRGBA8(Pica::g_state.regs.tev_combiner_buffer_color.raw);
+ auto combiner_color =
+ PicaToGL::ColorRGBA8(Pica::g_state.regs.texturing.tev_combiner_buffer_color.raw);
if (combiner_color != uniform_block_data.data.tev_combiner_buffer_color) {
uniform_block_data.data.tev_combiner_buffer_color = combiner_color;
uniform_block_data.dirty = true;
@@ -1275,7 +1280,7 @@ void RasterizerOpenGL::SyncCombinerColor() {
}
void RasterizerOpenGL::SyncTevConstColor(int stage_index,
- const Pica::Regs::TevStageConfig& tev_stage) {
+ const Pica::TexturingRegs::TevStageConfig& tev_stage) {
auto const_color = PicaToGL::ColorRGBA8(tev_stage.const_color);
if (const_color != uniform_block_data.data.const_color[stage_index]) {
uniform_block_data.data.const_color[stage_index] = const_color;
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index bd7b6874a..519df6478 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -60,12 +60,12 @@ union PicaShaderConfig {
? regs.output_merger.alpha_test.func.Value()
: Pica::Regs::CompareFunc::Always;
- state.texture0_type = regs.texture0.type;
+ state.texture0_type = regs.texturing.texture0.type;
// Copy relevant tev stages fields.
// We don't sync const_color here because of the high variance, it is a
// shader uniform instead.
- const auto& tev_stages = regs.GetTevStages();
+ const auto& tev_stages = regs.texturing.GetTevStages();
DEBUG_ASSERT(state.tev_stages.size() == tev_stages.size());
for (size_t i = 0; i < tev_stages.size(); i++) {
const auto& tev_stage = tev_stages[i];
@@ -75,11 +75,12 @@ union PicaShaderConfig {
state.tev_stages[i].scales_raw = tev_stage.scales_raw;
}
- state.fog_mode = regs.fog_mode;
- state.fog_flip = regs.fog_flip != 0;
+ state.fog_mode = regs.texturing.fog_mode;
+ state.fog_flip = regs.texturing.fog_flip != 0;
- state.combiner_buffer_input = regs.tev_combiner_buffer_input.update_mask_rgb.Value() |
- regs.tev_combiner_buffer_input.update_mask_a.Value() << 4;
+ state.combiner_buffer_input =
+ regs.texturing.tev_combiner_buffer_input.update_mask_rgb.Value() |
+ regs.texturing.tev_combiner_buffer_input.update_mask_a.Value() << 4;
// Fragment lighting
@@ -159,8 +160,8 @@ union PicaShaderConfig {
u32 modifiers_raw;
u32 ops_raw;
u32 scales_raw;
- explicit operator Pica::Regs::TevStageConfig() const noexcept {
- Pica::Regs::TevStageConfig stage;
+ explicit operator Pica::TexturingRegs::TevStageConfig() const noexcept {
+ Pica::TexturingRegs::TevStageConfig stage;
stage.sources_raw = sources_raw;
stage.modifiers_raw = modifiers_raw;
stage.ops_raw = ops_raw;
@@ -173,12 +174,12 @@ union PicaShaderConfig {
struct State {
Pica::Regs::CompareFunc alpha_test_func;
Pica::RasterizerRegs::ScissorMode scissor_test_mode;
- Pica::Regs::TextureConfig::TextureType texture0_type;
+ Pica::TexturingRegs::TextureConfig::TextureType texture0_type;
std::array<TevStageConfigRaw, 6> tev_stages;
u8 combiner_buffer_input;
Pica::RasterizerRegs::DepthBuffering depthmap_enable;
- Pica::Regs::FogMode fog_mode;
+ Pica::TexturingRegs::FogMode fog_mode;
bool fog_flip;
struct {
@@ -251,7 +252,7 @@ public:
private:
struct SamplerInfo {
- using TextureConfig = Pica::Regs::TextureConfig;
+ using TextureConfig = Pica::TexturingRegs::TextureConfig;
OGLSampler sampler;
@@ -398,7 +399,7 @@ private:
void SyncCombinerColor();
/// Syncs the TEV constant color to match the PICA register
- void SyncTevConstColor(int tev_index, const Pica::Regs::TevStageConfig& tev_stage);
+ void SyncTevConstColor(int tev_index, const Pica::TexturingRegs::TevStageConfig& tev_stage);
/// Syncs the lighting global ambient color to match the PICA register
void SyncGlobalAmbient();
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index 60380257a..6d08d1a67 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -342,7 +342,7 @@ CachedSurface* RasterizerCacheOpenGL::GetSurface(const CachedSurface& params, bo
Pica::Texture::TextureInfo tex_info;
tex_info.width = params.width;
tex_info.height = params.height;
- tex_info.format = (Pica::Regs::TextureFormat)params.pixel_format;
+ tex_info.format = (Pica::TexturingRegs::TextureFormat)params.pixel_format;
tex_info.SetDefaultStride();
tex_info.physical_address = params.addr;
@@ -510,7 +510,7 @@ CachedSurface* RasterizerCacheOpenGL::GetSurfaceRect(const CachedSurface& params
}
CachedSurface* RasterizerCacheOpenGL::GetTextureSurface(
- const Pica::Regs::FullTextureConfig& config) {
+ const Pica::TexturingRegs::FullTextureConfig& config) {
Pica::Texture::TextureInfo info =
Pica::Texture::TextureInfo::FromPicaRegister(config.config, config.format);
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
index f57fdb3cc..c354dfa33 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
@@ -96,7 +96,7 @@ struct CachedSurface {
return bpp_table[(unsigned int)format];
}
- static PixelFormat PixelFormatFromTextureFormat(Pica::Regs::TextureFormat format) {
+ static PixelFormat PixelFormatFromTextureFormat(Pica::TexturingRegs::TextureFormat format) {
return ((unsigned int)format < 14) ? (PixelFormat)format : PixelFormat::Invalid;
}
@@ -212,7 +212,7 @@ public:
bool load_if_create, MathUtil::Rectangle<int>& out_rect);
/// Gets a surface based on the texture configuration
- CachedSurface* GetTextureSurface(const Pica::Regs::FullTextureConfig& config);
+ CachedSurface* GetTextureSurface(const Pica::TexturingRegs::FullTextureConfig& config);
/// Gets the color and depth surfaces and rect (resolution scaled) based on the framebuffer
/// configuration
diff --git a/src/video_core/renderer_opengl/gl_shader_gen.cpp b/src/video_core/renderer_opengl/gl_shader_gen.cpp
index c34c3463f..c3b0fdcee 100644
--- a/src/video_core/renderer_opengl/gl_shader_gen.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_gen.cpp
@@ -14,7 +14,7 @@
using Pica::Regs;
using Pica::RasterizerRegs;
-using TevStageConfig = Regs::TevStageConfig;
+using TevStageConfig = Pica::TexturingRegs::TevStageConfig;
namespace GLShader {
@@ -47,10 +47,10 @@ static void AppendSource(std::string& out, const PicaShaderConfig& config,
case Source::Texture0:
// Only unit 0 respects the texturing type (according to 3DBrew)
switch (state.texture0_type) {
- case Pica::Regs::TextureConfig::Texture2D:
+ case Pica::TexturingRegs::TextureConfig::Texture2D:
out += "texture(tex[0], texcoord[0])";
break;
- case Pica::Regs::TextureConfig::Projection2D:
+ case Pica::TexturingRegs::TextureConfig::Projection2D:
out += "textureProj(tex[0], vec3(texcoord[0], texcoord0_w))";
break;
default:
@@ -308,7 +308,7 @@ static void AppendAlphaTestCondition(std::string& out, Regs::CompareFunc func) {
/// Writes the code to emulate the specified TEV stage
static void WriteTevStage(std::string& out, const PicaShaderConfig& config, unsigned index) {
const auto stage =
- static_cast<const Pica::Regs::TevStageConfig>(config.state.tev_stages[index]);
+ static_cast<const Pica::TexturingRegs::TevStageConfig>(config.state.tev_stages[index]);
if (!IsPassThroughTevStage(stage)) {
std::string index_name = std::to_string(index);
@@ -674,7 +674,7 @@ vec4 secondary_fragment_color = vec4(0.0);
}
// Append fog combiner
- if (state.fog_mode == Regs::FogMode::Fog) {
+ if (state.fog_mode == Pica::TexturingRegs::FogMode::Fog) {
// Get index into fog LUT
if (state.fog_flip) {
out += "float fog_index = (1.0 - depth) * 128.0;\n";
diff --git a/src/video_core/renderer_opengl/pica_to_gl.h b/src/video_core/renderer_opengl/pica_to_gl.h
index cc49867c8..37cfbd45a 100644
--- a/src/video_core/renderer_opengl/pica_to_gl.h
+++ b/src/video_core/renderer_opengl/pica_to_gl.h
@@ -20,7 +20,7 @@ using GLvec4 = std::array<GLfloat, 4>;
namespace PicaToGL {
-inline GLenum TextureFilterMode(Pica::Regs::TextureConfig::TextureFilter mode) {
+inline GLenum TextureFilterMode(Pica::TexturingRegs::TextureConfig::TextureFilter mode) {
static const GLenum filter_mode_table[] = {
GL_NEAREST, // TextureFilter::Nearest
GL_LINEAR, // TextureFilter::Linear
@@ -47,7 +47,7 @@ inline GLenum TextureFilterMode(Pica::Regs::TextureConfig::TextureFilter mode) {
return gl_mode;
}
-inline GLenum WrapMode(Pica::Regs::TextureConfig::WrapMode mode) {
+inline GLenum WrapMode(Pica::TexturingRegs::TextureConfig::WrapMode mode) {
static const GLenum wrap_mode_table[] = {
GL_CLAMP_TO_EDGE, // WrapMode::ClampToEdge
GL_CLAMP_TO_BORDER, // WrapMode::ClampToBorder