From e9b1df95ffeff6f63d29786060bad70f1f89cea0 Mon Sep 17 00:00:00 2001 From: Bastien Bouclet Date: Sun, 20 Oct 2019 09:33:04 +0200 Subject: 3DS: Upload the textures to VRAM in a separate frame So rendering waits for the textures to finish uploading before using them. Fixes glitchy mouse pointer in Riven. --- backends/platform/3ds/osystem-graphics.cpp | 15 +++++++++++---- backends/platform/3ds/sprite.cpp | 6 ++++-- backends/platform/3ds/sprite.h | 1 + 3 files changed, 16 insertions(+), 6 deletions(-) (limited to 'backends/platform/3ds') diff --git a/backends/platform/3ds/osystem-graphics.cpp b/backends/platform/3ds/osystem-graphics.cpp index 9dd9c5a91f..c1434177e7 100644 --- a/backends/platform/3ds/osystem-graphics.cpp +++ b/backends/platform/3ds/osystem-graphics.cpp @@ -265,13 +265,22 @@ void OSystem_3DS::unlockScreen() { } void OSystem_3DS::updateScreen() { - if (sleeping || exiting) return; // updateFocus(); - C3D_FrameBegin(C3D_FRAME_SYNCDRAW); + C3D_FrameBegin(0); + _gameTopTexture.transfer(); + if (_overlayVisible) { + _overlay.transfer(); + } + if (_cursorVisible && config.showCursor) { + _cursorTexture.transfer(); + } + C3D_FrameEnd(0); + + C3D_FrameBegin(0); // Render top screen C3D_RenderTargetClear(_renderTargetTop, C3D_CLEAR_ALL, 0x00000000, 0); C3D_FrameDrawOn(_renderTargetTop); @@ -279,7 +288,6 @@ void OSystem_3DS::updateScreen() { C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, _projectionLocation, &_projectionTop); C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, _modelviewLocation, _gameTopTexture.getMatrix()); _gameTopTexture.render(); - _gameTopTexture.render(); if (_overlayVisible && config.screen == kScreenTop) { C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, _modelviewLocation, _overlay.getMatrix()); _overlay.render(); @@ -297,7 +305,6 @@ void OSystem_3DS::updateScreen() { C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, _projectionLocation, &_projectionBottom); C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, _modelviewLocation, _gameBottomTexture.getMatrix()); _gameTopTexture.render(); - _gameTopTexture.render(); if (_overlayVisible) { C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, _modelviewLocation, _overlay.getMatrix()); _overlay.render(); diff --git a/backends/platform/3ds/sprite.cpp b/backends/platform/3ds/sprite.cpp index 78082f3027..b2785e2c2d 100644 --- a/backends/platform/3ds/sprite.cpp +++ b/backends/platform/3ds/sprite.cpp @@ -100,13 +100,15 @@ void Sprite::convertToInPlace(const Graphics::PixelFormat &dstFormat, const byte // } -void Sprite::render() { +void Sprite::transfer() { if (dirtyPixels) { dirtyPixels = false; GSPGPU_FlushDataCache(pixels, w * h * format.bytesPerPixel); C3D_SyncDisplayTransfer((u32*)pixels, GX_BUFFER_DIM(w, h), (u32*)texture.data, GX_BUFFER_DIM(w, h), TEXTURE_TRANSFER_FLAGS); -// gspWaitForPPF(); } +} + +void Sprite::render() { C3D_TexBind(0, &texture); C3D_BufInfo *bufInfo = C3D_GetBufInfo(); diff --git a/backends/platform/3ds/sprite.h b/backends/platform/3ds/sprite.h index 35c048c24b..1e9c0b4c01 100644 --- a/backends/platform/3ds/sprite.h +++ b/backends/platform/3ds/sprite.h @@ -46,6 +46,7 @@ public: void create(uint16 width, uint16 height, const Graphics::PixelFormat &format); void free(); void convertToInPlace(const Graphics::PixelFormat &dstFormat, const byte *palette = 0); + void transfer(); void render(); void clear(uint32 color = 0); void markDirty(){ dirtyPixels = true; } -- cgit v1.2.3