diff --git a/src/video_core/renderer_opengl/gl_primitive_assembler.cpp b/src/video_core/renderer_opengl/gl_primitive_assembler.cpp index d9ed08437d..cb00bbb4aa 100644 --- a/src/video_core/renderer_opengl/gl_primitive_assembler.cpp +++ b/src/video_core/renderer_opengl/gl_primitive_assembler.cpp @@ -47,12 +47,13 @@ GLintptr PrimitiveAssembler::MakeQuadIndexed(Tegra::GPUVAddr gpu_addr, std::size auto& memory_manager = Core::System::GetInstance().GPU().MemoryManager(); const std::optional cpu_addr{memory_manager.GpuToCpuAddress(gpu_addr)}; - const u8* source{Memory::GetPointer(*cpu_addr)}; + index_cache.resize(count); + Memory::ReadBlock(*cpu_addr, index_cache.data(), count); for (u32 primitive = 0; primitive < count / 4; ++primitive) { for (std::size_t i = 0; i < TRIANGLES_PER_QUAD; ++i) { const u32 index = primitive * 4 + QUAD_MAP[i]; - const u8* src_offset = source + (index * index_size); + const u8* src_offset = index_cache.data() + (index * index_size); std::memcpy(dst_pointer, src_offset, index_size); dst_pointer += index_size; @@ -62,4 +63,4 @@ GLintptr PrimitiveAssembler::MakeQuadIndexed(Tegra::GPUVAddr gpu_addr, std::size return index_offset; } -} // namespace OpenGL \ No newline at end of file +} // namespace OpenGL diff --git a/src/video_core/renderer_opengl/gl_primitive_assembler.h b/src/video_core/renderer_opengl/gl_primitive_assembler.h index a8cb88eb5b..504a65ba06 100644 --- a/src/video_core/renderer_opengl/gl_primitive_assembler.h +++ b/src/video_core/renderer_opengl/gl_primitive_assembler.h @@ -28,6 +28,7 @@ public: private: OGLBufferCache& buffer_cache; + std::vector index_cache; }; -} // namespace OpenGL \ No newline at end of file +} // namespace OpenGL diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp index 864f426f71..b552525c7c 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp @@ -752,8 +752,7 @@ static void CopySurface(const Surface& src_surface, const Surface& dst_surface, } std::size_t remaining_size = dst_params.size_in_bytes - src_params.size_in_bytes; std::vector data(remaining_size); - std::memcpy(data.data(), Memory::GetPointer(dst_params.addr + src_params.size_in_bytes), - data.size()); + Memory::ReadBlock(dst_params.addr + src_params.size_in_bytes, data.data(), data.size()); glBufferSubData(GL_PIXEL_PACK_BUFFER, src_params.size_in_bytes, remaining_size, data.data()); @@ -1004,9 +1003,8 @@ void CachedSurface::LoadGLBuffer() { for (u32 i = 0; i < params.max_mip_level; i++) SwizzleFunc(morton_to_gl_fns, params, gl_buffer[i], i); } else { - const auto texture_src_data{Memory::GetPointer(params.addr)}; - const auto texture_src_data_end{texture_src_data + params.size_in_bytes_gl}; - gl_buffer[0].assign(texture_src_data, texture_src_data_end); + gl_buffer[0].resize(params.size_in_bytes_gl); + Memory::ReadBlock(params.addr, gl_buffer[0].data(), gl_buffer[0].size()); } for (u32 i = 0; i < params.max_mip_level; i++) ConvertFormatAsNeeded_LoadGLBuffer(gl_buffer[i], params.pixel_format, params.MipWidth(i), @@ -1035,15 +1033,14 @@ void CachedSurface::FlushGLBuffer() { ConvertFormatAsNeeded_FlushGLBuffer(gl_buffer[0], params.pixel_format, params.width, params.height); ASSERT(params.type != SurfaceType::Fill); - const u8* const texture_src_data = Memory::GetPointer(params.addr); - ASSERT(texture_src_data); + ASSERT(/*texture_src_data*/ Memory::GetPointer(params.addr)); if (params.is_tiled) { ASSERT_MSG(params.block_width == 1, "Block width is defined as {} on texture type {}", params.block_width, static_cast(params.target)); SwizzleFunc(gl_to_morton_fns, params, gl_buffer[0], 0); } else { - std::memcpy(Memory::GetPointer(GetAddr()), gl_buffer[0].data(), GetSizeInBytes()); + Memory::WriteBlock(GetAddr(), gl_buffer[0].data(), GetSizeInBytes()); } }