Skip to content
Permalink
Browse files

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.

(cherry picked from commit e9b1df9)
  • Loading branch information...
bgK committed Oct 20, 2019
1 parent 753d26e commit be05540528ff548df12a740e189f379dc30a0bfc
Showing with 16 additions and 6 deletions.
  1. +11 −4 backends/platform/3ds/osystem-graphics.cpp
  2. +4 −2 backends/platform/3ds/sprite.cpp
  3. +1 −0 backends/platform/3ds/sprite.h
@@ -265,21 +265,29 @@ 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);
if (config.screen == kScreenTop || config.screen == kScreenBoth) {
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();
@@ -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();
@@ -46,6 +46,7 @@ class Sprite : public Graphics::Surface {
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; }

0 comments on commit be05540

Please sign in to comment.
You can’t perform that action at this time.