diff --git a/DDrawCompat/D3dDdi/Adapter.cpp b/DDrawCompat/D3dDdi/Adapter.cpp index c7ae81d..49775d3 100644 --- a/DDrawCompat/D3dDdi/Adapter.cpp +++ b/DDrawCompat/D3dDdi/Adapter.cpp @@ -496,14 +496,19 @@ namespace D3dDdi return result; } - void Adapter::setRepository(LUID luid, CompatWeakPtr repository) + void Adapter::setRepository(LUID luid, CompatWeakPtr repository, bool isPrimary) { for (auto& adapter : s_adapters) { if (adapter.second.m_luid == luid) { adapter.second.m_repository = repository; - SurfaceRepository::get(adapter.second).setRepository(repository); + auto& surfaceRepo = SurfaceRepository::get(adapter.second); + surfaceRepo.setRepository(repository); + if (isPrimary) + { + surfaceRepo.setAsPrimary(); + } } } } diff --git a/DDrawCompat/D3dDdi/Adapter.h b/DDrawCompat/D3dDdi/Adapter.h index 21c9664..16f21be 100644 --- a/DDrawCompat/D3dDdi/Adapter.h +++ b/DDrawCompat/D3dDdi/Adapter.h @@ -53,7 +53,7 @@ namespace D3dDdi static void add(const D3DDDIARG_OPENADAPTER& data) { s_adapters.emplace(data.hAdapter, data); } static Adapter& get(HANDLE adapter) { return s_adapters.find(adapter)->second; } - static void setRepository(LUID luid, CompatWeakPtr repository); + static void setRepository(LUID luid, CompatWeakPtr repository, bool isPrimary); private: const AdapterInfo& findInfo() const; diff --git a/DDrawCompat/D3dDdi/SurfaceRepository.cpp b/DDrawCompat/D3dDdi/SurfaceRepository.cpp index e7ab9ce..0eb4110 100644 --- a/DDrawCompat/D3dDdi/SurfaceRepository.cpp +++ b/DDrawCompat/D3dDdi/SurfaceRepository.cpp @@ -17,6 +17,7 @@ namespace { std::map g_repositories; + D3dDdi::SurfaceRepository* g_primaryRepository = nullptr; bool g_enableSurfaceCheck = true; void initDitherTexture(BYTE* tex, DWORD pitch, DWORD x, DWORD y, DWORD size, DWORD mul, DWORD value) @@ -297,6 +298,11 @@ namespace D3dDdi return getSurface(m_paletteTexture, 256, 1, D3DDDIFMT_A8R8G8B8, DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY).resource; } + SurfaceRepository& SurfaceRepository::getPrimary() + { + return *g_primaryRepository; + } + SurfaceRepository::Surface& SurfaceRepository::getSurface(Surface& surface, DWORD width, DWORD height, D3DDDIFORMAT format, DWORD caps, UINT surfaceCount, DWORD caps2) { @@ -386,5 +392,10 @@ namespace D3dDdi } } + void SurfaceRepository::setAsPrimary() + { + g_primaryRepository = this; + } + bool SurfaceRepository::s_inCreateSurface = false; } diff --git a/DDrawCompat/D3dDdi/SurfaceRepository.h b/DDrawCompat/D3dDdi/SurfaceRepository.h index e40b814..7b3a265 100644 --- a/DDrawCompat/D3dDdi/SurfaceRepository.h +++ b/DDrawCompat/D3dDdi/SurfaceRepository.h @@ -53,9 +53,11 @@ namespace D3dDdi D3DDDIFORMAT format, DWORD caps, UINT surfaceCount = 1); const Surface& getTempTexture(DWORD width, DWORD height, D3DDDIFORMAT format); void release(Surface& surface); + void setAsPrimary(); void setRepository(CompatWeakPtr dd) { m_dd = dd; } static SurfaceRepository& get(const Adapter& adapter); + static SurfaceRepository& getPrimary(); static bool inCreateSurface() { return s_inCreateSurface; } static void enableSurfaceCheck(bool enable); diff --git a/DDrawCompat/DDraw/DirectDraw.cpp b/DDrawCompat/DDraw/DirectDraw.cpp index 71a4126..8c587dc 100644 --- a/DDrawCompat/DDraw/DirectDraw.cpp +++ b/DDrawCompat/DDraw/DirectDraw.cpp @@ -284,9 +284,9 @@ namespace DDraw } repo.get()->lpVtbl->SetCooperativeLevel(repo, nullptr, DDSCL_NORMAL); it = repositories.insert({ adapterInfo.luid, repo }).first; + D3dDdi::Adapter::setRepository(adapterInfo.luid, it->second, !guid); repo.detach(); } - D3dDdi::Adapter::setRepository(adapterInfo.luid, it->second); } void suppressEmulatedDirectDraw(GUID*& guid) diff --git a/DDrawCompat/DDraw/Hooks.cpp b/DDrawCompat/DDraw/Hooks.cpp index 79659fd..d526517 100644 --- a/DDrawCompat/DDraw/Hooks.cpp +++ b/DDrawCompat/DDraw/Hooks.cpp @@ -97,6 +97,7 @@ namespace DDraw { void installHooks(CompatPtr dd7) { + DDraw::DirectDraw::onCreate(nullptr, *dd7); RealPrimarySurface::init(); g_origInitialize = dd7.get()->lpVtbl->Initialize;