From e7c7ecf510a06582316eaf698f63026b04a12eb0 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Tue, 1 Jul 2025 23:15:15 -0700 Subject: [PATCH 1/4] Add experimental WebGL support to Emscripten (#440) Co-authored-by: Anders Jenbo --- CMakeLists.txt | 2 +- miniwin/CMakeLists.txt | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f758bd95..3808cbe1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ project(isle LANGUAGES CXX C VERSION 0.1) if (EMSCRIPTEN) add_compile_options(-pthread) - add_link_options(-sALLOW_MEMORY_GROWTH=1 -sMAXIMUM_MEMORY=2gb -sUSE_PTHREADS=1 -sPROXY_TO_PTHREAD=1 -sPTHREAD_POOL_SIZE_STRICT=0 -sFORCE_FILESYSTEM=1 -sWASMFS=1 -sEXIT_RUNTIME=1) + add_link_options(-sALLOW_MEMORY_GROWTH=1 -sMAXIMUM_MEMORY=2gb -sUSE_PTHREADS=1 -sPROXY_TO_PTHREAD=1 -sOFFSCREENCANVAS_SUPPORT=1 -sPTHREAD_POOL_SIZE_STRICT=0 -sFORCE_FILESYSTEM=1 -sWASMFS=1 -sEXIT_RUNTIME=1) set(SDL_PTHREADS ON CACHE BOOL "Enable SDL pthreads" FORCE) endif() diff --git a/miniwin/CMakeLists.txt b/miniwin/CMakeLists.txt index 851403cc..c2aa0bd6 100644 --- a/miniwin/CMakeLists.txt +++ b/miniwin/CMakeLists.txt @@ -45,11 +45,13 @@ else() endif() find_library(OPENGL_ES2_LIBRARY NAMES GLESv2) -if(OPENGL_ES2_LIBRARY) +if(EMSCRIPTEN OR OPENGL_ES2_LIBRARY) message(STATUS "Found OpenGL: enabling OpenGL ES 2.x renderer") target_sources(miniwin PRIVATE src/d3drm/backends/opengles2/renderer.cpp) target_compile_definitions(miniwin PRIVATE USE_OPENGLES2) - target_link_libraries(miniwin PRIVATE OpenGL::GL) + if(OPENGL_ES2_LIBRARY) + target_link_libraries(miniwin PRIVATE OpenGL::GL) + endif() else() message(STATUS "🧩 OpenGL ES 2.x support not enabled") endif() From fb8fe5def423a3edfd1e02570f241c2ca0e325fb Mon Sep 17 00:00:00 2001 From: VoxelTek <53562267+VoxelTek@users.noreply.github.com> Date: Wed, 2 Jul 2025 17:10:44 +1000 Subject: [PATCH 2/4] Update tab order (#474) --- CONFIG/res/maindialog.ui | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONFIG/res/maindialog.ui b/CONFIG/res/maindialog.ui index c2760e7c..c2d429ae 100644 --- a/CONFIG/res/maindialog.ui +++ b/CONFIG/res/maindialog.ui @@ -562,8 +562,10 @@ sound3DCheckBox musicCheckBox joystickCheckBox + fullscreenCheckBox devicesList okButton + launchButton cancelButton From cca65ba17827d86f966faeb91327301c6feb10bf Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 2 Jul 2025 12:07:04 +0200 Subject: [PATCH 3/4] Remove unused function from OpenGL renderer (#475) --- miniwin/src/d3drm/backends/opengl1/actual.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/miniwin/src/d3drm/backends/opengl1/actual.cpp b/miniwin/src/d3drm/backends/opengl1/actual.cpp index e809f7e5..9a2e314d 100644 --- a/miniwin/src/d3drm/backends/opengl1/actual.cpp +++ b/miniwin/src/d3drm/backends/opengl1/actual.cpp @@ -321,9 +321,6 @@ void GL11_Draw2DImage( glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - GLint boundTexture = 0; - glGetIntegerv(GL_TEXTURE_BINDING_2D, &boundTexture); - float u1 = srcRect.x / cache.width; float v1 = srcRect.y / cache.height; float u2 = (srcRect.x + srcRect.w) / cache.width; From 55c13cd1409537a5ada30876579e0d78b6239830 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 2 Jul 2025 12:07:20 +0200 Subject: [PATCH 4/4] Implement dithering where relevant (#473) --- miniwin/src/d3drm/backends/citro3d/renderer.cpp | 4 ++++ miniwin/src/d3drm/backends/directx9/renderer.cpp | 4 ++++ miniwin/src/d3drm/backends/opengl1/actual.cpp | 10 ++++++++++ miniwin/src/d3drm/backends/opengl1/actual.h | 1 + miniwin/src/d3drm/backends/opengl1/renderer.cpp | 5 +++++ miniwin/src/d3drm/backends/opengles2/renderer.cpp | 10 ++++++++++ miniwin/src/d3drm/backends/sdl3gpu/renderer.cpp | 4 ++++ miniwin/src/d3drm/backends/software/renderer.cpp | 4 ++++ miniwin/src/d3drm/d3drmdevice.cpp | 4 +--- miniwin/src/internal/d3drmrenderer.h | 1 + miniwin/src/internal/d3drmrenderer_citro3d.h | 1 + miniwin/src/internal/d3drmrenderer_directx9.h | 1 + miniwin/src/internal/d3drmrenderer_opengl1.h | 1 + miniwin/src/internal/d3drmrenderer_opengles2.h | 1 + miniwin/src/internal/d3drmrenderer_sdl3gpu.h | 1 + miniwin/src/internal/d3drmrenderer_software.h | 1 + 16 files changed, 50 insertions(+), 3 deletions(-) diff --git a/miniwin/src/d3drm/backends/citro3d/renderer.cpp b/miniwin/src/d3drm/backends/citro3d/renderer.cpp index f9167401..72d729bc 100644 --- a/miniwin/src/d3drm/backends/citro3d/renderer.cpp +++ b/miniwin/src/d3drm/backends/citro3d/renderer.cpp @@ -600,6 +600,10 @@ void Citro3DRenderer::Draw2DImage(Uint32 textureId, const SDL_Rect& srcRect, con C3D_ImmDrawEnd(); } +void Citro3DRenderer::SetDither(bool dither) +{ +} + void Citro3DRenderer::Download(SDL_Surface* target) { MINIWIN_NOT_IMPLEMENTED(); diff --git a/miniwin/src/d3drm/backends/directx9/renderer.cpp b/miniwin/src/d3drm/backends/directx9/renderer.cpp index 5917cd07..2701528b 100644 --- a/miniwin/src/d3drm/backends/directx9/renderer.cpp +++ b/miniwin/src/d3drm/backends/directx9/renderer.cpp @@ -278,6 +278,10 @@ void DirectX9Renderer::Draw2DImage(Uint32 textureId, const SDL_Rect& srcRect, co Actual_Draw2DImage(m_textures[textureId].dxTexture, srcRect, dstRect); } +void DirectX9Renderer::SetDither(bool dither) +{ +} + void DirectX9Renderer::Download(SDL_Surface* target) { Actual_Download(target); diff --git a/miniwin/src/d3drm/backends/opengl1/actual.cpp b/miniwin/src/d3drm/backends/opengl1/actual.cpp index 9a2e314d..b9234c8e 100644 --- a/miniwin/src/d3drm/backends/opengl1/actual.cpp +++ b/miniwin/src/d3drm/backends/opengl1/actual.cpp @@ -354,3 +354,13 @@ void GL11_Download(SDL_Surface* target) glFinish(); glReadPixels(0, 0, target->w, target->h, GL_RGBA, GL_UNSIGNED_BYTE, target->pixels); } + +void GL11_SetDither(bool dither) +{ + if (dither) { + glEnable(GL_DITHER); + } + else { + glDisable(GL_DITHER); + } +} diff --git a/miniwin/src/d3drm/backends/opengl1/actual.h b/miniwin/src/d3drm/backends/opengl1/actual.h index 1d5e407d..7a6a4432 100644 --- a/miniwin/src/d3drm/backends/opengl1/actual.h +++ b/miniwin/src/d3drm/backends/opengl1/actual.h @@ -87,4 +87,5 @@ void GL11_Draw2DImage( float bottom, float top ); +void GL11_SetDither(bool dither); void GL11_Download(SDL_Surface* target); diff --git a/miniwin/src/d3drm/backends/opengl1/renderer.cpp b/miniwin/src/d3drm/backends/opengl1/renderer.cpp index 2e18b38a..4c6aacf9 100644 --- a/miniwin/src/d3drm/backends/opengl1/renderer.cpp +++ b/miniwin/src/d3drm/backends/opengl1/renderer.cpp @@ -384,6 +384,11 @@ void OpenGL1Renderer::Draw2DImage(Uint32 textureId, const SDL_Rect& srcRect, con GL11_Draw2DImage(m_textures[textureId], srcRect, dstRect, left, right, bottom, top); } +void OpenGL1Renderer::SetDither(bool dither) +{ + GL11_SetDither(dither); +} + void OpenGL1Renderer::Download(SDL_Surface* target) { GL11_Download(m_renderedImage); diff --git a/miniwin/src/d3drm/backends/opengles2/renderer.cpp b/miniwin/src/d3drm/backends/opengles2/renderer.cpp index 9cb8455c..28466bea 100644 --- a/miniwin/src/d3drm/backends/opengles2/renderer.cpp +++ b/miniwin/src/d3drm/backends/opengles2/renderer.cpp @@ -706,3 +706,13 @@ void OpenGLES2Renderer::Download(SDL_Surface* target) SDL_DestroySurface(bufferClone); } + +void OpenGLES2Renderer::SetDither(bool dither) +{ + if (dither) { + glEnable(GL_DITHER); + } + else { + glDisable(GL_DITHER); + } +} diff --git a/miniwin/src/d3drm/backends/sdl3gpu/renderer.cpp b/miniwin/src/d3drm/backends/sdl3gpu/renderer.cpp index 98704c66..69b326b6 100644 --- a/miniwin/src/d3drm/backends/sdl3gpu/renderer.cpp +++ b/miniwin/src/d3drm/backends/sdl3gpu/renderer.cpp @@ -942,6 +942,10 @@ void Direct3DRMSDL3GPURenderer::Draw2DImage(Uint32 textureId, const SDL_Rect& sr SDL_SetGPUScissor(m_renderPass, &fullViewport); } +void Direct3DRMSDL3GPURenderer::SetDither(bool dither) +{ +} + void Direct3DRMSDL3GPURenderer::Download(SDL_Surface* target) { if (!m_cmdbuf) { diff --git a/miniwin/src/d3drm/backends/software/renderer.cpp b/miniwin/src/d3drm/backends/software/renderer.cpp index 02c5bfc0..b4fab671 100644 --- a/miniwin/src/d3drm/backends/software/renderer.cpp +++ b/miniwin/src/d3drm/backends/software/renderer.cpp @@ -788,6 +788,10 @@ void Direct3DRMSoftwareRenderer::Draw2DImage(Uint32 textureId, const SDL_Rect& s SDL_LockSurface(surface); } +void Direct3DRMSoftwareRenderer::SetDither(bool dither) +{ +} + void Direct3DRMSoftwareRenderer::Download(SDL_Surface* target) { SDL_Rect srcRect = { diff --git a/miniwin/src/d3drm/d3drmdevice.cpp b/miniwin/src/d3drm/d3drmdevice.cpp index b738c809..822f412e 100644 --- a/miniwin/src/d3drm/d3drmdevice.cpp +++ b/miniwin/src/d3drm/d3drmdevice.cpp @@ -84,9 +84,7 @@ D3DRMRENDERQUALITY Direct3DRMDevice2Impl::GetQuality() HRESULT Direct3DRMDevice2Impl::SetDither(BOOL dither) { - if (dither) { - MINIWIN_NOT_IMPLEMENTED(); - } + m_renderer->SetDither(dither); return DD_OK; } diff --git a/miniwin/src/internal/d3drmrenderer.h b/miniwin/src/internal/d3drmrenderer.h index 259b20eb..a871bb26 100644 --- a/miniwin/src/internal/d3drmrenderer.h +++ b/miniwin/src/internal/d3drmrenderer.h @@ -53,6 +53,7 @@ class Direct3DRMRenderer : public IDirect3DDevice2 { virtual void Flip() = 0; virtual void Draw2DImage(Uint32 textureId, const SDL_Rect& srcRect, const SDL_Rect& dstRect) = 0; virtual void Download(SDL_Surface* target) = 0; + virtual void SetDither(bool dither) = 0; protected: int m_width, m_height; diff --git a/miniwin/src/internal/d3drmrenderer_citro3d.h b/miniwin/src/internal/d3drmrenderer_citro3d.h index 426f75c8..af91b3dc 100644 --- a/miniwin/src/internal/d3drmrenderer_citro3d.h +++ b/miniwin/src/internal/d3drmrenderer_citro3d.h @@ -50,6 +50,7 @@ class Citro3DRenderer : public Direct3DRMRenderer { void Flip() override; void Draw2DImage(Uint32 textureId, const SDL_Rect& srcRect, const SDL_Rect& dstRect) override; void Download(SDL_Surface* target) override; + void SetDither(bool dither) override; private: void AddTextureDestroyCallback(Uint32 id, IDirect3DRMTexture* texture); diff --git a/miniwin/src/internal/d3drmrenderer_directx9.h b/miniwin/src/internal/d3drmrenderer_directx9.h index 900bbe03..18ac126f 100644 --- a/miniwin/src/internal/d3drmrenderer_directx9.h +++ b/miniwin/src/internal/d3drmrenderer_directx9.h @@ -36,6 +36,7 @@ class DirectX9Renderer : public Direct3DRMRenderer { void Flip() override; void Draw2DImage(Uint32 textureId, const SDL_Rect& srcRect, const SDL_Rect& dstRect) override; void Download(SDL_Surface* target) override; + void SetDither(bool dither) override; private: void AddTextureDestroyCallback(Uint32 id, IDirect3DRMTexture* texture); diff --git a/miniwin/src/internal/d3drmrenderer_opengl1.h b/miniwin/src/internal/d3drmrenderer_opengl1.h index dce25e6b..656a964b 100644 --- a/miniwin/src/internal/d3drmrenderer_opengl1.h +++ b/miniwin/src/internal/d3drmrenderer_opengl1.h @@ -36,6 +36,7 @@ class OpenGL1Renderer : public Direct3DRMRenderer { void Flip() override; void Draw2DImage(Uint32 textureId, const SDL_Rect& srcRect, const SDL_Rect& dstRect) override; void Download(SDL_Surface* target) override; + void SetDither(bool dither) override; private: void AddTextureDestroyCallback(Uint32 id, IDirect3DRMTexture* texture); diff --git a/miniwin/src/internal/d3drmrenderer_opengles2.h b/miniwin/src/internal/d3drmrenderer_opengles2.h index f5d62579..0aaec63d 100644 --- a/miniwin/src/internal/d3drmrenderer_opengles2.h +++ b/miniwin/src/internal/d3drmrenderer_opengles2.h @@ -57,6 +57,7 @@ class OpenGLES2Renderer : public Direct3DRMRenderer { void Flip() override; void Draw2DImage(Uint32 textureId, const SDL_Rect& srcRect, const SDL_Rect& dstRect) override; void Download(SDL_Surface* target) override; + void SetDither(bool dither) override; private: void AddTextureDestroyCallback(Uint32 id, IDirect3DRMTexture* texture); diff --git a/miniwin/src/internal/d3drmrenderer_sdl3gpu.h b/miniwin/src/internal/d3drmrenderer_sdl3gpu.h index 02ec05d0..cf68a8c4 100644 --- a/miniwin/src/internal/d3drmrenderer_sdl3gpu.h +++ b/miniwin/src/internal/d3drmrenderer_sdl3gpu.h @@ -67,6 +67,7 @@ class Direct3DRMSDL3GPURenderer : public Direct3DRMRenderer { void Flip() override; void Draw2DImage(Uint32 textureId, const SDL_Rect& srcRect, const SDL_Rect& dstRect) override; void Download(SDL_Surface* target) override; + void SetDither(bool dither) override; private: Direct3DRMSDL3GPURenderer( diff --git a/miniwin/src/internal/d3drmrenderer_software.h b/miniwin/src/internal/d3drmrenderer_software.h index 87715999..91abac32 100644 --- a/miniwin/src/internal/d3drmrenderer_software.h +++ b/miniwin/src/internal/d3drmrenderer_software.h @@ -49,6 +49,7 @@ class Direct3DRMSoftwareRenderer : public Direct3DRMRenderer { void Flip() override; void Draw2DImage(Uint32 textureId, const SDL_Rect& srcRect, const SDL_Rect& dstRect) override; void Download(SDL_Surface* target) override; + void SetDither(bool dither) override; private: void ClearZBuffer();