mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-13 12:39:56 +00:00
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.
This commit is contained in:
parent
aaed15d308
commit
e9b1df95ff
@ -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();
|
||||
|
@ -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 @@ 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; }
|
||||
|
Loading…
Reference in New Issue
Block a user