9 changed files with 195 additions and 13 deletions
-
20src/video_core/renderer_opengl/gl_rasterizer.cpp
-
6src/video_core/renderer_opengl/gl_rasterizer.h
-
85src/video_core/renderer_opengl/gl_state_tracker.cpp
-
56src/video_core/renderer_opengl/gl_state_tracker.h
-
7src/video_core/renderer_opengl/gl_texture_cache.cpp
-
5src/video_core/renderer_opengl/gl_texture_cache.h
-
6src/video_core/renderer_opengl/renderer_opengl.cpp
-
3src/video_core/renderer_opengl/renderer_opengl.h
-
20src/video_core/texture_cache/texture_cache.h
@ -0,0 +1,85 @@ |
|||
// Copyright 2019 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include <algorithm>
|
|||
#include <array>
|
|||
#include <cstddef>
|
|||
#include <type_traits>
|
|||
|
|||
#include "common/common_types.h"
|
|||
#include "core/core.h"
|
|||
#include "video_core/engines/maxwell_3d.h"
|
|||
#include "video_core/gpu.h"
|
|||
#include "video_core/renderer_opengl/gl_state_tracker.h"
|
|||
|
|||
#define OFF(field_name) MAXWELL3D_REG_INDEX(field_name)
|
|||
#define NUM(field_name) (sizeof(Maxwell3D::Regs::field_name) / sizeof(u32))
|
|||
|
|||
namespace OpenGL { |
|||
|
|||
namespace { |
|||
|
|||
using namespace Dirty; |
|||
using namespace VideoCommon::Dirty; |
|||
using Tegra::Engines::Maxwell3D; |
|||
using Regs = Maxwell3D::Regs; |
|||
using Dirty = std::remove_reference_t<decltype(Maxwell3D::dirty)>; |
|||
using Tables = std::remove_reference_t<decltype(Maxwell3D::dirty.tables)>; |
|||
using Table = std::remove_reference_t<decltype(Maxwell3D::dirty.tables[0])>; |
|||
|
|||
template <typename Integer> |
|||
void FillBlock(Table& table, std::size_t begin, std::size_t num, Integer dirty_index) { |
|||
const auto it = std::begin(table) + begin; |
|||
std::fill(it, it + num, static_cast<u8>(dirty_index)); |
|||
} |
|||
|
|||
template <typename Integer1, typename Integer2> |
|||
void FillBlock(Tables& tables, std::size_t begin, std::size_t num, Integer1 index_a, |
|||
Integer2 index_b) { |
|||
FillBlock(tables[0], begin, num, index_a); |
|||
FillBlock(tables[1], begin, num, index_b); |
|||
} |
|||
|
|||
void SetupDirtyRenderTargets(Tables& tables) { |
|||
static constexpr std::size_t num_per_rt = NUM(rt[0]); |
|||
static constexpr std::size_t begin = OFF(rt); |
|||
static constexpr std::size_t num = num_per_rt * Regs::NumRenderTargets; |
|||
for (std::size_t rt = 0; rt < Regs::NumRenderTargets; ++rt) { |
|||
FillBlock(tables[0], begin + rt * num_per_rt, num_per_rt, ColorBuffer0 + rt); |
|||
} |
|||
FillBlock(tables[1], begin, num, RenderTargets); |
|||
|
|||
static constexpr std::array zeta_flags{ZetaBuffer, RenderTargets}; |
|||
for (std::size_t i = 0; i < std::size(zeta_flags); ++i) { |
|||
const u8 flag = zeta_flags[i]; |
|||
auto& table = tables[i]; |
|||
table[OFF(zeta_enable)] = flag; |
|||
table[OFF(zeta_width)] = flag; |
|||
table[OFF(zeta_height)] = flag; |
|||
FillBlock(table, OFF(zeta), NUM(zeta), flag); |
|||
} |
|||
} |
|||
|
|||
} // Anonymous namespace
|
|||
|
|||
StateTracker::StateTracker(Core::System& system) : system{system} {} |
|||
|
|||
void StateTracker::Initialize() { |
|||
auto& dirty = system.GPU().Maxwell3D().dirty; |
|||
std::size_t entry_index = 0; |
|||
const auto AddEntry = [&dirty, &entry_index](std::size_t dirty_register) { |
|||
dirty.on_write_stores[entry_index++] = static_cast<u8>(dirty_register); |
|||
}; |
|||
|
|||
AddEntry(RenderTargets); |
|||
for (std::size_t i = 0; i < Regs::NumRenderTargets; ++i) { |
|||
AddEntry(ColorBuffer0 + i); |
|||
} |
|||
AddEntry(ZetaBuffer); |
|||
|
|||
auto& tables = dirty.tables; |
|||
SetupDirtyRenderTargets(tables); |
|||
} |
|||
|
|||
} // namespace OpenGL
|
|||
@ -0,0 +1,56 @@ |
|||
// Copyright 2019 yuzu Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include "common/common_types.h" |
|||
#include "video_core/dirty_flags.h" |
|||
#include "video_core/engines/maxwell_3d.h" |
|||
|
|||
namespace Core { |
|||
class System; |
|||
} |
|||
|
|||
namespace OpenGL { |
|||
|
|||
namespace Dirty { |
|||
enum : u8 { |
|||
First = VideoCommon::Dirty::LastCommonEntry, |
|||
|
|||
VertexFormats, |
|||
VertexBuffers, |
|||
VertexInstances, |
|||
Shaders, |
|||
Viewports, |
|||
CullTestEnable, |
|||
FrontFace, |
|||
CullFace, |
|||
PrimitiveRestart, |
|||
DepthTest, |
|||
StencilTest, |
|||
ColorMask, |
|||
BlendState, |
|||
PolygonOffset, |
|||
|
|||
VertexBuffer0 = PolygonOffset + 8, |
|||
VertexInstance0 = VertexBuffer0 + 32, |
|||
}; |
|||
} |
|||
|
|||
class StateTracker { |
|||
public: |
|||
explicit StateTracker(Core::System& system); |
|||
|
|||
void Initialize(); |
|||
|
|||
void NotifyFramebuffer() { |
|||
auto& flags = system.GPU().Maxwell3D().dirty.flags; |
|||
flags[VideoCommon::Dirty::RenderTargets] = true; |
|||
} |
|||
|
|||
private: |
|||
Core::System& system; |
|||
}; |
|||
|
|||
} // namespace OpenGL |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue