diff options
| author | 2023-03-06 21:53:51 -0500 | |
|---|---|---|
| committer | 2023-03-06 22:57:52 -0500 | |
| commit | 268942c8fe0c34f193ba3d195a974e91db8af26a (patch) | |
| tree | a4b0b63f2f324aa0e2e7e45ba1fd85dc9554189e | |
| parent | Refactor AccelerateDMA code (diff) | |
| download | yuzu-268942c8fe0c34f193ba3d195a974e91db8af26a.tar.gz yuzu-268942c8fe0c34f193ba3d195a974e91db8af26a.tar.xz yuzu-268942c8fe0c34f193ba3d195a974e91db8af26a.zip | |
gl_rasterizer: Implement AccelerateDMA DmaBufferImageCopy
Diffstat (limited to '')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 45 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 16 |
2 files changed, 52 insertions, 9 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 7bced675c..33748762f 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -63,7 +63,7 @@ RasterizerOpenGL::RasterizerOpenGL(Core::Frontend::EmuWindow& emu_window_, Tegra | |||
| 63 | buffer_cache(*this, cpu_memory_, buffer_cache_runtime), | 63 | buffer_cache(*this, cpu_memory_, buffer_cache_runtime), |
| 64 | shader_cache(*this, emu_window_, device, texture_cache, buffer_cache, program_manager, | 64 | shader_cache(*this, emu_window_, device, texture_cache, buffer_cache, program_manager, |
| 65 | state_tracker, gpu.ShaderNotify()), | 65 | state_tracker, gpu.ShaderNotify()), |
| 66 | query_cache(*this), accelerate_dma(buffer_cache), | 66 | query_cache(*this), accelerate_dma(buffer_cache, texture_cache), |
| 67 | fence_manager(*this, gpu, texture_cache, buffer_cache, query_cache), | 67 | fence_manager(*this, gpu, texture_cache, buffer_cache, query_cache), |
| 68 | blit_image(program_manager_) {} | 68 | blit_image(program_manager_) {} |
| 69 | 69 | ||
| @@ -1262,7 +1262,8 @@ void RasterizerOpenGL::ReleaseChannel(s32 channel_id) { | |||
| 1262 | query_cache.EraseChannel(channel_id); | 1262 | query_cache.EraseChannel(channel_id); |
| 1263 | } | 1263 | } |
| 1264 | 1264 | ||
| 1265 | AccelerateDMA::AccelerateDMA(BufferCache& buffer_cache_) : buffer_cache{buffer_cache_} {} | 1265 | AccelerateDMA::AccelerateDMA(BufferCache& buffer_cache_, TextureCache& texture_cache_) |
| 1266 | : buffer_cache{buffer_cache_}, texture_cache{texture_cache_} {} | ||
| 1266 | 1267 | ||
| 1267 | bool AccelerateDMA::BufferCopy(GPUVAddr src_address, GPUVAddr dest_address, u64 amount) { | 1268 | bool AccelerateDMA::BufferCopy(GPUVAddr src_address, GPUVAddr dest_address, u64 amount) { |
| 1268 | std::scoped_lock lock{buffer_cache.mutex}; | 1269 | std::scoped_lock lock{buffer_cache.mutex}; |
| @@ -1274,4 +1275,44 @@ bool AccelerateDMA::BufferClear(GPUVAddr src_address, u64 amount, u32 value) { | |||
| 1274 | return buffer_cache.DMAClear(src_address, amount, value); | 1275 | return buffer_cache.DMAClear(src_address, amount, value); |
| 1275 | } | 1276 | } |
| 1276 | 1277 | ||
| 1278 | template <bool IS_IMAGE_UPLOAD> | ||
| 1279 | bool AccelerateDMA::DmaBufferImageCopy(const Tegra::DMA::ImageCopy& copy_info, | ||
| 1280 | const Tegra::DMA::BufferOperand& buffer_operand, | ||
| 1281 | const Tegra::DMA::ImageOperand& image_operand) { | ||
| 1282 | std::scoped_lock lock{buffer_cache.mutex, texture_cache.mutex}; | ||
| 1283 | const auto image_id = texture_cache.DmaImageId(image_operand); | ||
| 1284 | if (image_id == VideoCommon::NULL_IMAGE_ID) { | ||
| 1285 | return false; | ||
| 1286 | } | ||
| 1287 | const u32 buffer_size = static_cast<u32>(buffer_operand.pitch * buffer_operand.height); | ||
| 1288 | static constexpr auto sync_info = VideoCommon::ObtainBufferSynchronize::FullSynchronize; | ||
| 1289 | const auto post_op = IS_IMAGE_UPLOAD ? VideoCommon::ObtainBufferOperation::DoNothing | ||
| 1290 | : VideoCommon::ObtainBufferOperation::MarkAsWritten; | ||
| 1291 | const auto [buffer, offset] = | ||
| 1292 | buffer_cache.ObtainBuffer(buffer_operand.address, buffer_size, sync_info, post_op); | ||
| 1293 | |||
| 1294 | const auto [image, copy] = texture_cache.DmaBufferImageCopy( | ||
| 1295 | copy_info, buffer_operand, image_operand, image_id, IS_IMAGE_UPLOAD); | ||
| 1296 | const std::span copy_span{©, 1}; | ||
| 1297 | |||
| 1298 | if constexpr (IS_IMAGE_UPLOAD) { | ||
| 1299 | image->UploadMemory(buffer->Handle(), offset, copy_span); | ||
| 1300 | } else { | ||
| 1301 | image->DownloadMemory(buffer->Handle(), offset, copy_span); | ||
| 1302 | } | ||
| 1303 | return true; | ||
| 1304 | } | ||
| 1305 | |||
| 1306 | bool AccelerateDMA::ImageToBuffer(const Tegra::DMA::ImageCopy& copy_info, | ||
| 1307 | const Tegra::DMA::ImageOperand& image_operand, | ||
| 1308 | const Tegra::DMA::BufferOperand& buffer_operand) { | ||
| 1309 | return DmaBufferImageCopy<false>(copy_info, buffer_operand, image_operand); | ||
| 1310 | } | ||
| 1311 | |||
| 1312 | bool AccelerateDMA::BufferToImage(const Tegra::DMA::ImageCopy& copy_info, | ||
| 1313 | const Tegra::DMA::BufferOperand& buffer_operand, | ||
| 1314 | const Tegra::DMA::ImageOperand& image_operand) { | ||
| 1315 | return DmaBufferImageCopy<true>(copy_info, buffer_operand, image_operand); | ||
| 1316 | } | ||
| 1317 | |||
| 1277 | } // namespace OpenGL | 1318 | } // namespace OpenGL |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index 7e21fc43d..1f6562ef8 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h | |||
| @@ -50,24 +50,26 @@ static_assert(sizeof(BindlessSSBO) * CHAR_BIT == 128); | |||
| 50 | 50 | ||
| 51 | class AccelerateDMA : public Tegra::Engines::AccelerateDMAInterface { | 51 | class AccelerateDMA : public Tegra::Engines::AccelerateDMAInterface { |
| 52 | public: | 52 | public: |
| 53 | explicit AccelerateDMA(BufferCache& buffer_cache); | 53 | explicit AccelerateDMA(BufferCache& buffer_cache, TextureCache& texture_cache); |
| 54 | 54 | ||
| 55 | bool BufferCopy(GPUVAddr src_address, GPUVAddr dest_address, u64 amount) override; | 55 | bool BufferCopy(GPUVAddr src_address, GPUVAddr dest_address, u64 amount) override; |
| 56 | 56 | ||
| 57 | bool BufferClear(GPUVAddr src_address, u64 amount, u32 value) override; | 57 | bool BufferClear(GPUVAddr src_address, u64 amount, u32 value) override; |
| 58 | 58 | ||
| 59 | bool ImageToBuffer(const Tegra::DMA::ImageCopy& copy_info, const Tegra::DMA::ImageOperand& src, | 59 | bool ImageToBuffer(const Tegra::DMA::ImageCopy& copy_info, const Tegra::DMA::ImageOperand& src, |
| 60 | const Tegra::DMA::BufferOperand& dst) override { | 60 | const Tegra::DMA::BufferOperand& dst) override; |
| 61 | return false; | ||
| 62 | } | ||
| 63 | 61 | ||
| 64 | bool BufferToImage(const Tegra::DMA::ImageCopy& copy_info, const Tegra::DMA::BufferOperand& src, | 62 | bool BufferToImage(const Tegra::DMA::ImageCopy& copy_info, const Tegra::DMA::BufferOperand& src, |
| 65 | const Tegra::DMA::ImageOperand& dst) override { | 63 | const Tegra::DMA::ImageOperand& dst) override; |
| 66 | return false; | ||
| 67 | } | ||
| 68 | 64 | ||
| 69 | private: | 65 | private: |
| 66 | template <bool IS_IMAGE_UPLOAD> | ||
| 67 | bool DmaBufferImageCopy(const Tegra::DMA::ImageCopy& copy_info, | ||
| 68 | const Tegra::DMA::BufferOperand& src, | ||
| 69 | const Tegra::DMA::ImageOperand& dst); | ||
| 70 | |||
| 70 | BufferCache& buffer_cache; | 71 | BufferCache& buffer_cache; |
| 72 | TextureCache& texture_cache; | ||
| 71 | }; | 73 | }; |
| 72 | 74 | ||
| 73 | class RasterizerOpenGL : public VideoCore::RasterizerAccelerated, | 75 | class RasterizerOpenGL : public VideoCore::RasterizerAccelerated, |