Rasterizer: Implement Inline2Memory Acceleration.
This commit is contained in:
parent
f54280dafd
commit
4258d515e6
14 changed files with 122 additions and 6 deletions
|
@ -7,6 +7,7 @@
|
|||
#include "common/assert.h"
|
||||
#include "video_core/engines/engine_upload.h"
|
||||
#include "video_core/memory_manager.h"
|
||||
#include "video_core/rasterizer_interface.h"
|
||||
#include "video_core/textures/decoders.h"
|
||||
|
||||
namespace Tegra::Engines::Upload {
|
||||
|
@ -16,6 +17,10 @@ State::State(MemoryManager& memory_manager_, Registers& regs_)
|
|||
|
||||
State::~State() = default;
|
||||
|
||||
void State::BindRasterizer(VideoCore::RasterizerInterface* rasterizer_) {
|
||||
rasterizer = rasterizer_;
|
||||
}
|
||||
|
||||
void State::ProcessExec(const bool is_linear_) {
|
||||
write_offset = 0;
|
||||
copy_size = regs.line_length_in * regs.line_count;
|
||||
|
@ -32,8 +37,7 @@ void State::ProcessData(const u32 data, const bool is_last_call) {
|
|||
}
|
||||
const GPUVAddr address{regs.dest.Address()};
|
||||
if (is_linear) {
|
||||
memory_manager.FlushRegion(address, copy_size);
|
||||
memory_manager.WriteBlock(address, inner_buffer.data(), copy_size);
|
||||
rasterizer->AccelerateInline2Memory(address, copy_size, inner_buffer);
|
||||
} else {
|
||||
UNIMPLEMENTED_IF(regs.dest.z != 0);
|
||||
UNIMPLEMENTED_IF(regs.dest.depth != 1);
|
||||
|
|
|
@ -12,6 +12,10 @@ namespace Tegra {
|
|||
class MemoryManager;
|
||||
}
|
||||
|
||||
namespace VideoCore {
|
||||
class RasterizerInterface;
|
||||
}
|
||||
|
||||
namespace Tegra::Engines::Upload {
|
||||
|
||||
struct Registers {
|
||||
|
@ -60,6 +64,9 @@ public:
|
|||
void ProcessExec(bool is_linear_);
|
||||
void ProcessData(u32 data, bool is_last_call);
|
||||
|
||||
/// Binds a rasterizer to this engine.
|
||||
void BindRasterizer(VideoCore::RasterizerInterface* rasterizer);
|
||||
|
||||
private:
|
||||
u32 write_offset = 0;
|
||||
u32 copy_size = 0;
|
||||
|
@ -68,6 +75,7 @@ private:
|
|||
bool is_linear = false;
|
||||
Registers& regs;
|
||||
MemoryManager& memory_manager;
|
||||
VideoCore::RasterizerInterface* rasterizer = nullptr;
|
||||
};
|
||||
|
||||
} // namespace Tegra::Engines::Upload
|
||||
|
|
|
@ -22,6 +22,7 @@ KeplerCompute::~KeplerCompute() = default;
|
|||
|
||||
void KeplerCompute::BindRasterizer(VideoCore::RasterizerInterface* rasterizer_) {
|
||||
rasterizer = rasterizer_;
|
||||
upload_state.BindRasterizer(rasterizer);
|
||||
}
|
||||
|
||||
void KeplerCompute::CallMethod(u32 method, u32 method_argument, bool is_last_call) {
|
||||
|
|
|
@ -19,6 +19,10 @@ KeplerMemory::KeplerMemory(Core::System& system_, MemoryManager& memory_manager)
|
|||
|
||||
KeplerMemory::~KeplerMemory() = default;
|
||||
|
||||
void KeplerMemory::BindRasterizer(VideoCore::RasterizerInterface* rasterizer_) {
|
||||
upload_state.BindRasterizer(rasterizer_);
|
||||
}
|
||||
|
||||
void KeplerMemory::CallMethod(u32 method, u32 method_argument, bool is_last_call) {
|
||||
ASSERT_MSG(method < Regs::NUM_REGS,
|
||||
"Invalid KeplerMemory register, increase the size of the Regs structure");
|
||||
|
|
|
@ -22,6 +22,10 @@ namespace Tegra {
|
|||
class MemoryManager;
|
||||
}
|
||||
|
||||
namespace VideoCore {
|
||||
class RasterizerInterface;
|
||||
}
|
||||
|
||||
namespace Tegra::Engines {
|
||||
|
||||
/**
|
||||
|
@ -38,6 +42,9 @@ public:
|
|||
explicit KeplerMemory(Core::System& system_, MemoryManager& memory_manager);
|
||||
~KeplerMemory() override;
|
||||
|
||||
/// Binds a rasterizer to this engine.
|
||||
void BindRasterizer(VideoCore::RasterizerInterface* rasterizer);
|
||||
|
||||
/// Write the value to the register identified by method.
|
||||
void CallMethod(u32 method, u32 method_argument, bool is_last_call) override;
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@ Maxwell3D::~Maxwell3D() = default;
|
|||
|
||||
void Maxwell3D::BindRasterizer(VideoCore::RasterizerInterface* rasterizer_) {
|
||||
rasterizer = rasterizer_;
|
||||
upload_state.BindRasterizer(rasterizer_);
|
||||
}
|
||||
|
||||
void Maxwell3D::InitializeRegisterDefaults() {
|
||||
|
|
|
@ -1557,7 +1557,8 @@ private:
|
|||
|
||||
static constexpr u32 null_cb_data = 0xFFFFFFFF;
|
||||
struct CBDataState {
|
||||
std::array<std::array<u32, 0x4000>, 16> buffer;
|
||||
static constexpr size_t inline_size = 0x8000;
|
||||
std::array<std::array<u32, inline_size>, 16> buffer;
|
||||
u32 current{null_cb_data};
|
||||
u32 id{null_cb_data};
|
||||
u32 start_pos{};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue