From 385b9ebf33ad653d65e30b427b94502238fb3832 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sun, 8 Jun 2025 08:40:06 +0200 Subject: [PATCH] hacks to allow capturing vulkan --- .../src/d3drm/backends/sdl3gpu/renderer.cpp | 36 ++++++++++++++++--- miniwin/src/ddraw/ddsurface.cpp | 1 + 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/miniwin/src/d3drm/backends/sdl3gpu/renderer.cpp b/miniwin/src/d3drm/backends/sdl3gpu/renderer.cpp index c9dba602..0461172e 100644 --- a/miniwin/src/d3drm/backends/sdl3gpu/renderer.cpp +++ b/miniwin/src/d3drm/backends/sdl3gpu/renderer.cpp @@ -210,7 +210,7 @@ Direct3DRMRenderer* Direct3DRMSDL3GPURenderer::Create(DWORD width, DWORD height) SDL_GPUTextureCreateInfo textureInfo = {}; textureInfo.type = SDL_GPU_TEXTURETYPE_2D; textureInfo.format = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM; - textureInfo.usage = SDL_GPU_TEXTUREUSAGE_COLOR_TARGET; + textureInfo.usage = SDL_GPU_TEXTUREUSAGE_SAMPLER | SDL_GPU_TEXTUREUSAGE_COLOR_TARGET; textureInfo.width = width; textureInfo.height = height; textureInfo.layer_count_or_depth = 1; @@ -325,6 +325,10 @@ Direct3DRMSDL3GPURenderer::Direct3DRMSDL3GPURenderer( m_dummyTexture = CreateTextureFromSurface(dummySurface); SDL_DestroySurface(dummySurface); + + if (!SDL_ClaimWindowForGPUDevice(m_device, DDWindow)) { + SDL_LogError(LOG_CATEGORY_MINIWIN, "SDL_ClaimWindowForGPUDevice failed: %s", SDL_GetError()); + } } Direct3DRMSDL3GPURenderer::~Direct3DRMSDL3GPURenderer() @@ -342,6 +346,7 @@ Direct3DRMSDL3GPURenderer::~Direct3DRMSDL3GPURenderer() if (m_uploadFence) { SDL_ReleaseGPUFence(m_device, m_uploadFence); } + SDL_ReleaseWindowFromGPUDevice(m_device, DDWindow); SDL_DestroyGPUDevice(m_device); } @@ -761,9 +766,32 @@ HRESULT Direct3DRMSDL3GPURenderer::FinalizeFrame() SDL_GPUTextureTransferInfo transferInfo = {}; transferInfo.transfer_buffer = m_downloadBuffer; - SDL_GPUCopyPass* copyPass = SDL_BeginGPUCopyPass(m_cmdbuf); - SDL_DownloadFromGPUTexture(copyPass, ®ion, &transferInfo); - SDL_EndGPUCopyPass(copyPass); + SDL_GPUTexture* swapchainTexture; + Uint32 swapWidth, swapHeight; + if (!SDL_AcquireGPUSwapchainTexture(m_cmdbuf, DDWindow, &swapchainTexture, &swapWidth, &swapHeight) || + !swapchainTexture) { + SDL_LogError(LOG_CATEGORY_MINIWIN, "SDL_AcquireGPUSwapchainTexture failed (%s)", SDL_GetError()); + } + + SDL_GPUBlitRegion srcRegion; + srcRegion.texture = m_transferTexture; + srcRegion.w = 640; + srcRegion.h = 480; + + SDL_GPUBlitRegion dstRegion; + dstRegion.texture = swapchainTexture; + dstRegion.w = 640; + dstRegion.h = 480; + + SDL_GPUBlitInfo blit; + blit.source = srcRegion; + blit.destination = dstRegion; + blit.load_op = SDL_GPU_LOADOP_CLEAR; + blit.clear_color = {0, 0, 0, 1}; + blit.flip_mode = SDL_FLIP_NONE; + blit.filter = SDL_GPU_FILTER_LINEAR; + + SDL_BlitGPUTexture(m_cmdbuf, &blit); WaitForPendingUpload(); diff --git a/miniwin/src/ddraw/ddsurface.cpp b/miniwin/src/ddraw/ddsurface.cpp index 5c8ee6db..1a9e8f7e 100644 --- a/miniwin/src/ddraw/ddsurface.cpp +++ b/miniwin/src/ddraw/ddsurface.cpp @@ -126,6 +126,7 @@ HRESULT DirectDrawSurfaceImpl::BltFast( HRESULT DirectDrawSurfaceImpl::Flip(LPDIRECTDRAWSURFACE lpDDSurfaceTargetOverride, DDFlipFlags dwFlags) { + return DD_OK; if (!DDBackBuffer) { return DDERR_GENERIC; }