From c4ac05c82c49e678ca78147b2716e0a26b103f8d Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Tue, 26 Mar 2019 14:37:43 -0400 Subject: Implement Const Buffer Accessor --- src/video_core/CMakeLists.txt | 2 ++ src/video_core/const_buffer_accessor.cpp | 35 ++++++++++++++++++++++++ src/video_core/const_buffer_accessor.h | 21 ++++++++++++++ src/video_core/renderer_opengl/gl_rasterizer.cpp | 6 ++-- src/video_core/renderer_opengl/gl_rasterizer.h | 3 ++ 5 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 src/video_core/const_buffer_accessor.cpp create mode 100644 src/video_core/const_buffer_accessor.h diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 242a0d1cd..804395d38 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -1,4 +1,6 @@ add_library(video_core STATIC + const_buffer_accessor.cpp + const_buffer_accessor.h dma_pusher.cpp dma_pusher.h debug_utils/debug_utils.cpp diff --git a/src/video_core/const_buffer_accessor.cpp b/src/video_core/const_buffer_accessor.cpp new file mode 100644 index 000000000..c89ab91c7 --- /dev/null +++ b/src/video_core/const_buffer_accessor.cpp @@ -0,0 +1,35 @@ +#pragma once + +#include + +#include "common/common_types.h" +#include "core/core.h" +#include "core/memory.h" +#include "video_core/const_buffer_accessor.h" +#include "video_core/engines/maxwell_3d.h" +#include "video_core/gpu.h" +#include "video_core/memory_manager.h" + +namespace Tegra { + +u32 ConstBufferAccessor::access32(Tegra::Engines::Maxwell3D::Regs::ShaderStage stage, + u64 const_buffer, u64 offset) { + auto& memory_manager = Core::System::GetInstance().GPU().MemoryManager(); + const auto& shader_stage = maxwell3d.state.shader_stages[static_cast(stage)]; + const auto& buffer = shader_stage.const_buffers[const_buffer]; + u32 result; + std::memcpy(&result, memory_manager.GetPointer(buffer.address + offset * 4), sizeof(u32)); + return result; +} + +u64 ConstBufferAccessor::access64(Tegra::Engines::Maxwell3D::Regs::ShaderStage stage, + u64 const_buffer, u64 offset) { + auto& memory_manager = Core::System::GetInstance().GPU().MemoryManager(); + const auto& shader_stage = maxwell3d.state.shader_stages[static_cast(stage)]; + const auto& buffer = shader_stage.const_buffers[const_buffer]; + u64 result; + std::memcpy(&result, memory_manager.GetPointer(buffer.address + offset * 4), sizeof(u64)); + return result; +} + +} // namespace Tegra diff --git a/src/video_core/const_buffer_accessor.h b/src/video_core/const_buffer_accessor.h new file mode 100644 index 000000000..2410f1483 --- /dev/null +++ b/src/video_core/const_buffer_accessor.h @@ -0,0 +1,21 @@ +#pragma once + +#include "common/common_types.h" +#include "video_core/engines/maxwell_3d.h" + +namespace Tegra { + +class ConstBufferAccessor { +public: + ConstBufferAccessor(Tegra::Engines::Maxwell3D& maxwell3d) : maxwell3d(maxwell3d) {} + ~ConstBufferAccessor() = default; + + u32 access32(Tegra::Engines::Maxwell3D::Regs::ShaderStage stage, u64 const_buffer, u64 offset); + + u64 access64(Tegra::Engines::Maxwell3D::Regs::ShaderStage stage, u64 const_buffer, u64 offset); + +private: + Tegra::Engines::Maxwell3D& maxwell3d; +}; + +} // namespace Tegra diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 7ff1e6737..f2ac5382d 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -98,9 +98,11 @@ struct FramebufferCacheKey { } }; -RasterizerOpenGL::RasterizerOpenGL(Core::System& system, ScreenInfo& info) +RasterizerOpenGL::RasterizerOpenGL(Core::Frontend::EmuWindow& window, Core::System& system, + ScreenInfo& info) : res_cache{*this}, shader_cache{*this, system}, global_cache{*this}, system{system}, - screen_info{info}, buffer_cache(*this, STREAM_BUFFER_SIZE) { + screen_info{info}, buffer_cache(*this, STREAM_BUFFER_SIZE), + const_buffer_accessor(system.GPU().Maxwell3D()) { // Create sampler objects for (std::size_t i = 0; i < texture_samplers.size(); ++i) { texture_samplers[i].Create(); diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index 54fbf48aa..886e9c2b5 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h @@ -17,6 +17,7 @@ #include #include "common/common_types.h" +#include "video_core/const_buffer_accessor.h" #include "video_core/engines/maxwell_3d.h" #include "video_core/rasterizer_cache.h" #include "video_core/rasterizer_interface.h" @@ -229,6 +230,8 @@ private: PrimitiveAssembler primitive_assembler{buffer_cache}; GLint uniform_buffer_alignment; + Tegra::ConstBufferAccessor const_buffer_accessor; + std::size_t CalculateVertexArraysSize() const; std::size_t CalculateIndexBufferSize() const; -- cgit v1.2.3