aboutsummaryrefslogtreecommitdiff
path: root/backends/platform
diff options
context:
space:
mode:
authorBastien Bouclet2019-10-20 09:33:04 +0200
committerBastien Bouclet2019-10-25 19:13:40 +0200
commite9b1df95ffeff6f63d29786060bad70f1f89cea0 (patch)
tree9739f2af455740c486594acace3df218c4896cdc /backends/platform
parentaaed15d308ddca2eefb9fdb11ca3b8174b97f4cd (diff)
downloadscummvm-rg350-e9b1df95ffeff6f63d29786060bad70f1f89cea0.tar.gz
scummvm-rg350-e9b1df95ffeff6f63d29786060bad70f1f89cea0.tar.bz2
scummvm-rg350-e9b1df95ffeff6f63d29786060bad70f1f89cea0.zip
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.
Diffstat (limited to 'backends/platform')
-rw-r--r--backends/platform/3ds/osystem-graphics.cpp15
-rw-r--r--backends/platform/3ds/sprite.cpp6
-rw-r--r--backends/platform/3ds/sprite.h1
3 files changed, 16 insertions, 6 deletions
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; }