1
0
mirror of https://github.com/narzoul/DDrawCompat synced 2024-12-30 08:55:36 +01:00

Added DepthFormat setting

This commit is contained in:
narzoul 2022-12-20 13:51:40 +01:00
parent 95ade4412b
commit 6425c6c767
16 changed files with 164 additions and 84 deletions

View File

@ -6,6 +6,7 @@
#include <Config/Settings/ConfigHotKey.h> #include <Config/Settings/ConfigHotKey.h>
#include <Config/Settings/CpuAffinity.h> #include <Config/Settings/CpuAffinity.h>
#include <Config/Settings/CpuAffinityRotation.h> #include <Config/Settings/CpuAffinityRotation.h>
#include <Config/Settings/DepthFormat.h>
#include <Config/Settings/DesktopColorDepth.h> #include <Config/Settings/DesktopColorDepth.h>
#include <Config/Settings/DisplayFilter.h> #include <Config/Settings/DisplayFilter.h>
#include <Config/Settings/DisplayRefreshRate.h> #include <Config/Settings/DisplayRefreshRate.h>
@ -46,6 +47,7 @@ namespace Config
Settings::ConfigHotKey configHotKey; Settings::ConfigHotKey configHotKey;
Settings::CpuAffinity cpuAffinity; Settings::CpuAffinity cpuAffinity;
Settings::CpuAffinityRotation cpuAffinityRotation; Settings::CpuAffinityRotation cpuAffinityRotation;
Settings::DepthFormat depthFormat;
Settings::DesktopColorDepth desktopColorDepth; Settings::DesktopColorDepth desktopColorDepth;
Settings::DisplayFilter displayFilter; Settings::DisplayFilter displayFilter;
Settings::DisplayRefreshRate displayRefreshRate; Settings::DisplayRefreshRate displayRefreshRate;

View File

@ -0,0 +1,21 @@
#pragma once
#include <Config/MappedSetting.h>
namespace Config
{
namespace Settings
{
class DepthFormat : public MappedSetting<UINT>
{
public:
static const UINT APP = 0;
DepthFormat() : MappedSetting("DepthFormat", "app", { {"app", APP}, {"16", 16}, {"24", 24}, {"32", 32} })
{
}
};
}
extern Settings::DepthFormat depthFormat;
}

View File

@ -47,6 +47,30 @@ namespace D3dDdi
s_devices.try_emplace(device, adapter, device); s_devices.try_emplace(device, adapter, device);
} }
HRESULT Device::clear(D3DDDIARG_CLEAR data, UINT numRect, const RECT* rect, Resource* resource, DWORD flags)
{
if (0 == flags)
{
return S_OK;
}
data.Flags &= ~(D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL);
data.Flags |= flags;
if (resource)
{
static std::vector<RECT> scaledRects;
scaledRects.assign(rect, rect + numRect);
for (UINT i = 0; i < numRect; ++i)
{
resource->scaleRect(scaledRects[i]);
}
rect = scaledRects.data();
}
return m_origVtable.pfnClear(m_device, &data, numRect, rect);
}
HRESULT Device::createPrivateResource(D3DDDIARG_CREATERESOURCE2& data) HRESULT Device::createPrivateResource(D3DDDIARG_CREATERESOURCE2& data)
{ {
const bool isPalettized = D3DDDIFMT_P8 == data.Format; const bool isPalettized = D3DDDIFMT_P8 == data.Format;
@ -179,18 +203,17 @@ namespace D3dDdi
prepareForGpuWrite(); prepareForGpuWrite();
m_state.flush(); m_state.flush();
if ((m_renderTarget || m_depthStencil) && rect) if (0 == numRect || !rect)
{ {
std::vector<RECT> scaledRect(rect, rect + numRect); return m_origVtable.pfnClear(m_device, data, numRect, rect);
auto resource = m_renderTarget ? m_renderTarget : m_depthStencil;
for (UINT i = 0; i < numRect; ++i)
{
resource->scaleRect(scaledRect[i]);
}
return m_origVtable.pfnClear(m_device, data, numRect, scaledRect.data());
} }
return m_origVtable.pfnClear(m_device, data, numRect, rect); HRESULT result = clear(*data, numRect, rect, m_renderTarget, data->Flags & D3DCLEAR_TARGET);
if (SUCCEEDED(result))
{
result = clear(*data, numRect, rect, m_depthStencil, data->Flags & (D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL));
}
return result;
} }
HRESULT Device::pfnColorFill(const D3DDDIARG_COLORFILL* data) HRESULT Device::pfnColorFill(const D3DDDIARG_COLORFILL* data)

View File

@ -78,6 +78,7 @@ namespace D3dDdi
static void updateAllConfig(); static void updateAllConfig();
private: private:
HRESULT clear(D3DDDIARG_CLEAR data, UINT numRect, const RECT* rect, Resource* resource, DWORD flags);
static void updateAllConfigNow(); static void updateAllConfigNow();
D3DDDI_DEVICEFUNCS m_origVtable; D3DDDI_DEVICEFUNCS m_origVtable;

View File

@ -953,12 +953,12 @@ namespace D3dDdi
{ {
resource->scaleRect(reinterpret_cast<RECT&>(vp)); resource->scaleRect(reinterpret_cast<RECT&>(vp));
renderTarget.hRenderTarget = *resource->getCustomResource(); renderTarget.hRenderTarget = *resource->getCustomResource();
}
resource = m_device.getResource(depthStencil.hZBuffer);
if (resource && resource->getCustomResource()) resource = m_device.getResource(depthStencil.hZBuffer);
{ if (resource && resource->getCustomResource())
depthStencil.hZBuffer = *resource->getCustomResource(); {
} depthStencil.hZBuffer = *resource->getCustomResource();
} }
setRenderTarget(renderTarget); setRenderTarget(renderTarget);

View File

@ -6,6 +6,7 @@
#include <Common/Rect.h> #include <Common/Rect.h>
#include <Common/Time.h> #include <Common/Time.h>
#include <Config/Settings/BltFilter.h> #include <Config/Settings/BltFilter.h>
#include <Config/Settings/DepthFormat.h>
#include <Config/Settings/DisplayFilter.h> #include <Config/Settings/DisplayFilter.h>
#include <Config/Settings/RenderColorDepth.h> #include <Config/Settings/RenderColorDepth.h>
#include <Config/Settings/ResolutionScaleFilter.h> #include <Config/Settings/ResolutionScaleFilter.h>
@ -161,8 +162,6 @@ namespace D3dDdi
} }
m_handle = m_fixedData.hResource; m_handle = m_fixedData.hResource;
updateConfig();
if (D3DDDIPOOL_SYSTEMMEM != m_fixedData.Pool && m_origData.Flags.ZBuffer) if (D3DDDIPOOL_SYSTEMMEM != m_fixedData.Pool && m_origData.Flags.ZBuffer)
{ {
m_lockData.resize(m_origData.SurfCount); m_lockData.resize(m_origData.SurfCount);
@ -191,6 +190,7 @@ namespace D3dDdi
} }
data.hResource = m_fixedData.hResource; data.hResource = m_fixedData.hResource;
updateConfig();
} }
Resource::~Resource() Resource::~Resource()
@ -707,7 +707,7 @@ namespace D3dDdi
if (D3DDDIFMT_UNKNOWN != g_formatOverride) if (D3DDDIFMT_UNKNOWN != g_formatOverride)
{ {
m_fixedData.Format = g_formatOverride; m_fixedData.Format = g_formatOverride;
if (m_fixedData.Flags.ZBuffer) if (FOURCC_INTZ == g_formatOverride)
{ {
m_fixedData.Flags.Texture = 1; m_fixedData.Flags.Texture = 1;
} }
@ -749,6 +749,27 @@ namespace D3dDdi
case 32: return D3DDDIFMT_X8R8G8B8; case 32: return D3DDDIFMT_X8R8G8B8;
} }
} }
else if (m_fixedData.Flags.ZBuffer && Config::Settings::DepthFormat::APP != Config::depthFormat.get() &&
getFormatInfo(m_fixedData.Format).depth.bitCount != Config::depthFormat.get())
{
auto& formatOps = m_device.getAdapter().getInfo().formatOps;
switch (Config::depthFormat.get())
{
#define USE_FORMAT(format) if (formatOps.find(format) != formatOps.end()) return format
case 32:
USE_FORMAT(D3DDDIFMT_D32);
USE_FORMAT(D3DDDIFMT_D32_LOCKABLE);
USE_FORMAT(D3DDDIFMT_D32F_LOCKABLE);
case 24:
USE_FORMAT(D3DDDIFMT_S8D24);
USE_FORMAT(D3DDDIFMT_D24S8);
USE_FORMAT(D3DDDIFMT_X8D24);
USE_FORMAT(D3DDDIFMT_D24X8);
case 16:
USE_FORMAT(D3DDDIFMT_D16);
#undef USE_FORMAT
}
}
return m_fixedData.Format; return m_fixedData.Format;
} }
@ -815,7 +836,7 @@ namespace D3dDdi
if (!m_fixedData.Flags.Texture) if (!m_fixedData.Flags.Texture)
{ {
auto& repo = SurfaceRepository::get(m_device.getAdapter()); auto& repo = SurfaceRepository::get(m_device.getAdapter());
auto& texture = repo.getTempTexture(si.Width, si.Height, getPixelFormat(m_fixedData.Format)); auto& texture = repo.getTempTexture(si.Width, si.Height, m_fixedData.Format);
if (!texture.resource) if (!texture.resource)
{ {
return; return;
@ -1207,7 +1228,7 @@ namespace D3dDdi
if (D3DDDIPOOL_SYSTEMMEM == srcResource->m_fixedData.Pool) if (D3DDDIPOOL_SYSTEMMEM == srcResource->m_fixedData.Pool)
{ {
srcResource = repo.getTempTexture(srcWidth, srcHeight, getPixelFormat(srcResource->m_fixedData.Format)).resource; srcResource = repo.getTempTexture(srcWidth, srcHeight, srcResource->m_fixedData.Format).resource;
if (!srcResource) if (!srcResource)
{ {
return LOG_RESULT(E_OUTOFMEMORY); return LOG_RESULT(E_OUTOFMEMORY);
@ -1319,7 +1340,7 @@ namespace D3dDdi
RECT srcRect = { 0, 0, visibleRect.right - visibleRect.left, visibleRect.bottom - visibleRect.top }; RECT srcRect = { 0, 0, visibleRect.right - visibleRect.left, visibleRect.bottom - visibleRect.top };
auto& windowSurface = repo.getTempSysMemSurface(srcRect.right, srcRect.bottom); auto& windowSurface = repo.getTempSysMemSurface(srcRect.right, srcRect.bottom);
auto& texture = repo.getTempTexture(srcRect.right, srcRect.bottom, getPixelFormat(D3DDDIFMT_A8R8G8B8)); auto& texture = repo.getTempTexture(srcRect.right, srcRect.bottom, D3DDDIFMT_A8R8G8B8);
if (!windowSurface.resource || !texture.resource) if (!windowSurface.resource || !texture.resource)
{ {
continue; continue;
@ -1407,6 +1428,11 @@ namespace D3dDdi
} }
} }
void Resource::setFormatOverride(D3DDDIFORMAT format)
{
g_formatOverride = format;
}
void Resource::setFullscreenMode(bool isFullscreen) void Resource::setFullscreenMode(bool isFullscreen)
{ {
if (!IsRectEmpty(&g_presentationRect) == isFullscreen) if (!IsRectEmpty(&g_presentationRect) == isFullscreen)
@ -1469,7 +1495,7 @@ namespace D3dDdi
DWORD height = data.SrcRect.bottom - data.SrcRect.top; DWORD height = data.SrcRect.bottom - data.SrcRect.top;
auto texture = m_fixedData.Flags.ZBuffer auto texture = m_fixedData.Flags.ZBuffer
? m_msaaResolvedSurface.resource ? m_msaaResolvedSurface.resource
: repo.getTempTexture(width, height, getPixelFormat(srcResource.m_fixedData.Format)).resource; : repo.getTempTexture(width, height, srcResource.m_fixedData.Format).resource;
if (!texture) if (!texture)
{ {
return LOG_RESULT(E_OUTOFMEMORY); return LOG_RESULT(E_OUTOFMEMORY);
@ -1492,7 +1518,7 @@ namespace D3dDdi
} }
} }
if (!m_fixedData.Flags.RenderTarget) if (!m_fixedData.Flags.RenderTarget && !m_fixedData.Flags.ZBuffer)
{ {
LONG width = data.DstRect.right - data.DstRect.left; LONG width = data.DstRect.right - data.DstRect.left;
LONG height = data.DstRect.bottom - data.DstRect.top; LONG height = data.DstRect.bottom - data.DstRect.top;
@ -1540,7 +1566,7 @@ namespace D3dDdi
data.Flags.Linear ? D3DTEXF_LINEAR : D3DTEXF_POINT, data.Flags.SrcColorKey ? &ck : nullptr); data.Flags.Linear ? D3DTEXF_LINEAR : D3DTEXF_POINT, data.Flags.SrcColorKey ? &ck : nullptr);
} }
if (!m_fixedData.Flags.RenderTarget) if (!m_fixedData.Flags.RenderTarget && !m_fixedData.Flags.ZBuffer)
{ {
HRESULT result = copySubResourceRegion(data.hDstResource, data.DstSubResourceIndex, data.DstRect, HRESULT result = copySubResourceRegion(data.hDstResource, data.DstSubResourceIndex, data.DstRect,
*dstRes, dstIndex, dstRect); *dstRes, dstIndex, dstRect);
@ -1563,6 +1589,9 @@ namespace D3dDdi
return false; return false;
} }
D3DDDIARG_BLT blt = {};
DDraw::setBltSrc(blt);
if (D3DDDIPOOL_SYSTEMMEM == m_fixedData.Pool || if (D3DDDIPOOL_SYSTEMMEM == m_fixedData.Pool ||
D3DDDIFMT_P8 == m_fixedData.Format || D3DDDIFMT_P8 == m_fixedData.Format ||
m_isOversized || srcResource.m_isOversized) m_isOversized || srcResource.m_isOversized)
@ -1604,9 +1633,6 @@ namespace D3dDdi
{ {
return; return;
} }
m_multiSampleConfig = msaa;
m_formatConfig = formatConfig;
m_scaledSize = scaledSize;
if (m_msaaSurface.resource || m_msaaResolvedSurface.resource) if (m_msaaSurface.resource || m_msaaResolvedSurface.resource)
{ {
@ -1622,6 +1648,10 @@ namespace D3dDdi
} }
} }
m_multiSampleConfig = msaa;
m_formatConfig = formatConfig;
m_scaledSize = scaledSize;
m_msaaSurface = {}; m_msaaSurface = {};
m_msaaResolvedSurface = {}; m_msaaResolvedSurface = {};
m_nullSurface = {}; m_nullSurface = {};
@ -1636,39 +1666,35 @@ namespace D3dDdi
{ {
g_msaaOverride = msaa; g_msaaOverride = msaa;
SurfaceRepository::get(m_device.getAdapter()).getSurface(m_msaaSurface, SurfaceRepository::get(m_device.getAdapter()).getSurface(m_msaaSurface,
scaledSize.cx, scaledSize.cy, getPixelFormat(formatConfig), caps, m_fixedData.SurfCount); scaledSize.cx, scaledSize.cy, formatConfig, caps, m_fixedData.SurfCount);
g_msaaOverride = {}; g_msaaOverride = {};
} }
if (m_fixedData.Flags.ZBuffer && m_msaaSurface.resource && if (m_fixedData.Flags.ZBuffer && m_msaaSurface.resource &&
m_device.getAdapter().getInfo().isMsaaDepthResolveSupported) m_device.getAdapter().getInfo().isMsaaDepthResolveSupported)
{ {
g_formatOverride = FOURCC_NULL;
g_msaaOverride = msaa; g_msaaOverride = msaa;
SurfaceRepository::get(m_device.getAdapter()).getSurface(m_nullSurface, SurfaceRepository::get(m_device.getAdapter()).getSurface(m_nullSurface,
scaledSize.cx, scaledSize.cy, getPixelFormat(D3DDDIFMT_X8R8G8B8), scaledSize.cx, scaledSize.cy, FOURCC_NULL,
DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY, m_fixedData.SurfCount); DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY, m_fixedData.SurfCount);
g_msaaOverride = {}; g_msaaOverride = {};
g_formatOverride = m_nullSurface.resource ? FOURCC_INTZ : D3DDDIFMT_UNKNOWN;
} }
auto msaaResolvedSurfaceCaps = caps | ((m_fixedData.Flags.ZBuffer || !isScaled) ? 0 : DDSCAPS_TEXTURE); auto msaaResolvedSurfaceCaps = caps | ((m_fixedData.Flags.ZBuffer || !isScaled) ? 0 : DDSCAPS_TEXTURE);
auto msaaResolvedSurfaceFormat =
(m_fixedData.Flags.ZBuffer || !isScaled) ? getPixelFormat(formatConfig) : getPixelFormat(D3DDDIFMT_A8R8G8B8);
SurfaceRepository::get(m_device.getAdapter()).getSurface(m_msaaResolvedSurface, SurfaceRepository::get(m_device.getAdapter()).getSurface(m_msaaResolvedSurface,
scaledSize.cx, scaledSize.cy, msaaResolvedSurfaceFormat, msaaResolvedSurfaceCaps, m_fixedData.SurfCount); scaledSize.cx, scaledSize.cy, m_nullSurface.resource ? FOURCC_INTZ : formatConfig,
g_formatOverride = D3DDDIFMT_UNKNOWN; msaaResolvedSurfaceCaps, m_fixedData.SurfCount);
if (!m_msaaResolvedSurface.resource && m_msaaSurface.resource) if (!m_msaaResolvedSurface.resource && m_msaaSurface.resource)
{ {
m_msaaSurface = {}; m_msaaSurface = {};
SurfaceRepository::get(m_device.getAdapter()).getSurface(m_msaaResolvedSurface, SurfaceRepository::get(m_device.getAdapter()).getSurface(m_msaaResolvedSurface,
scaledSize.cx, scaledSize.cy, msaaResolvedSurfaceFormat, msaaResolvedSurfaceCaps, m_fixedData.SurfCount); scaledSize.cx, scaledSize.cy, formatConfig, msaaResolvedSurfaceCaps, m_fixedData.SurfCount);
} }
if (!m_fixedData.Flags.ZBuffer && m_msaaResolvedSurface.resource) if (!m_fixedData.Flags.ZBuffer && m_msaaResolvedSurface.resource)
{ {
SurfaceRepository::get(m_device.getAdapter()).getSurface(m_lockRefSurface, SurfaceRepository::get(m_device.getAdapter()).getSurface(m_lockRefSurface,
m_fixedData.pSurfList[0].Width, m_fixedData.pSurfList[0].Height, getPixelFormat(m_fixedData.Format), m_fixedData.pSurfList[0].Width, m_fixedData.pSurfList[0].Height, m_fixedData.Format,
DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, m_fixedData.SurfCount); DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, m_fixedData.SurfCount);
if (isScaled) if (isScaled)

View File

@ -27,7 +27,7 @@ namespace D3dDdi
~Resource(); ~Resource();
operator HANDLE() const { return m_handle; } operator HANDLE() const { return m_handle; }
const Resource* getCustomResource() { return m_msaaSurface.resource ? m_msaaSurface.resource : m_msaaResolvedSurface.resource; } Resource* getCustomResource() const { return m_msaaSurface.resource ? m_msaaSurface.resource : m_msaaResolvedSurface.resource; }
Device& getDevice() const { return m_device; } Device& getDevice() const { return m_device; }
const D3DDDIARG_CREATERESOURCE2& getFixedDesc() const { return m_fixedData; } const D3DDDIARG_CREATERESOURCE2& getFixedDesc() const { return m_fixedData; }
const D3DDDIARG_CREATERESOURCE2& getOrigDesc() const { return m_origData; } const D3DDDIARG_CREATERESOURCE2& getOrigDesc() const { return m_origData; }
@ -60,6 +60,8 @@ namespace D3dDdi
void updateConfig(); void updateConfig();
void updatePalettizedTexture(UINT stage); void updatePalettizedTexture(UINT stage);
static void setFormatOverride(D3DDDIFORMAT format);
private: private:
class Data : public D3DDDIARG_CREATERESOURCE2 class Data : public D3DDDIARG_CREATERESOURCE2
{ {

View File

@ -31,7 +31,7 @@ namespace D3dDdi
} }
CompatPtr<IDirectDrawSurface7> SurfaceRepository::createSurface( CompatPtr<IDirectDrawSurface7> SurfaceRepository::createSurface(
DWORD width, DWORD height, const DDPIXELFORMAT& pf, DWORD caps, UINT surfaceCount) DWORD width, DWORD height, D3DDDIFORMAT format, DWORD caps, UINT surfaceCount)
{ {
auto dd(m_adapter.getRepository()); auto dd(m_adapter.getRepository());
if (!dd) if (!dd)
@ -48,7 +48,7 @@ namespace D3dDdi
desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_CAPS; desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_CAPS;
desc.dwWidth = width; desc.dwWidth = width;
desc.dwHeight = height; desc.dwHeight = height;
desc.ddpfPixelFormat = pf; desc.ddpfPixelFormat = getPixelFormat(format);
desc.ddsCaps.dwCaps = caps; desc.ddsCaps.dwCaps = caps;
if (surfaceCount > 1) if (surfaceCount > 1)
{ {
@ -57,10 +57,17 @@ namespace D3dDdi
desc.dwBackBufferCount = surfaceCount - 1; desc.dwBackBufferCount = surfaceCount - 1;
} }
if (0 == desc.ddpfPixelFormat.dwFlags)
{
desc.ddpfPixelFormat = getPixelFormat((caps & DDSCAPS_ZBUFFER) ? D3DDDIFMT_D16 : D3DDDIFMT_X8R8G8B8);
D3dDdi::Resource::setFormatOverride(format);
}
DDraw::SuppressResourceFormatLogs suppressResourceFormatLogs; DDraw::SuppressResourceFormatLogs suppressResourceFormatLogs;
s_inCreateSurface = true; s_inCreateSurface = true;
HRESULT result = dd.get()->lpVtbl->CreateSurface(dd, &desc, &surface.getRef(), nullptr); HRESULT result = dd.get()->lpVtbl->CreateSurface(dd, &desc, &surface.getRef(), nullptr);
s_inCreateSurface = false; s_inCreateSurface = false;
D3dDdi::Resource::setFormatOverride(D3DDDIFMT_UNKNOWN);
if (FAILED(result)) if (FAILED(result))
{ {
LOG_ONCE("ERROR: Failed to create repository surface: " << Compat::hex(result) << " " << desc); LOG_ONCE("ERROR: Failed to create repository surface: " << Compat::hex(result) << " " << desc);
@ -137,7 +144,7 @@ namespace D3dDdi
{ {
result.maskTexture = m_cursorMaskTexture.resource; result.maskTexture = m_cursorMaskTexture.resource;
result.tempTexture = getSurface(m_cursorTempTexture, m_cursorSize.cx, m_cursorSize.cy, result.tempTexture = getSurface(m_cursorTempTexture, m_cursorSize.cx, m_cursorSize.cy,
DDraw::DirectDraw::getRgbPixelFormat(32), DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY).resource; D3DDDIFMT_X8R8G8B8, DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY).resource;
if (!result.tempTexture) if (!result.tempTexture)
{ {
return {}; return {};
@ -148,8 +155,7 @@ namespace D3dDdi
bool SurfaceRepository::getCursorImage(Surface& surface, HCURSOR cursor, DWORD width, DWORD height, UINT flags) bool SurfaceRepository::getCursorImage(Surface& surface, HCURSOR cursor, DWORD width, DWORD height, UINT flags)
{ {
if (!getSurface(surface, width, height, getPixelFormat(D3DDDIFMT_A8R8G8B8), if (!getSurface(surface, width, height, D3DDDIFMT_A8R8G8B8, DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY).resource)
DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY).resource)
{ {
return false; return false;
} }
@ -167,18 +173,12 @@ namespace D3dDdi
Resource* SurfaceRepository::getGammaRampTexture() Resource* SurfaceRepository::getGammaRampTexture()
{ {
DDPIXELFORMAT pf = {}; return getSurface(m_gammaRampTexture, 256, 3, D3DDDIFMT_L8, DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY).resource;
pf.dwSize = sizeof(pf);
pf.dwFlags = DDPF_LUMINANCE;
pf.dwLuminanceBitCount = 8;
pf.dwLuminanceBitMask = 0xFF;
return getSurface(m_gammaRampTexture, 256, 3, pf, DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY).resource;
} }
Resource* SurfaceRepository::getLogicalXorTexture() Resource* SurfaceRepository::getLogicalXorTexture()
{ {
return getInitializedResource(m_logicalXorTexture, 256, 256, DDraw::DirectDraw::getRgbPixelFormat(8), return getInitializedResource(m_logicalXorTexture, 256, 256, D3DDDIFMT_L8, DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY,
DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY,
[](const DDSURFACEDESC2& desc) { [](const DDSURFACEDESC2& desc) {
BYTE* p = static_cast<BYTE*>(desc.lpSurface); BYTE* p = static_cast<BYTE*>(desc.lpSurface);
for (UINT y = 0; y < 256; ++y) for (UINT y = 0; y < 256; ++y)
@ -193,9 +193,9 @@ namespace D3dDdi
} }
Resource* SurfaceRepository::getInitializedResource(Surface& surface, DWORD width, DWORD height, Resource* SurfaceRepository::getInitializedResource(Surface& surface, DWORD width, DWORD height,
const DDPIXELFORMAT& pf, DWORD caps, std::function<void(const DDSURFACEDESC2&)> initFunc) D3DDDIFORMAT format, DWORD caps, std::function<void(const DDSURFACEDESC2&)> initFunc)
{ {
if (!isLost(surface) || !getSurface(surface, width, height, pf, caps).resource) if (!isLost(surface) || !getSurface(surface, width, height, format, caps).resource)
{ {
return surface.resource; return surface.resource;
} }
@ -216,34 +216,32 @@ namespace D3dDdi
Resource* SurfaceRepository::getPaletteTexture() Resource* SurfaceRepository::getPaletteTexture()
{ {
return getSurface(m_paletteTexture, 256, 1, getPixelFormat(D3DDDIFMT_A8R8G8B8), return getSurface(m_paletteTexture, 256, 1, D3DDDIFMT_A8R8G8B8, DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY).resource;
DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY).resource;
} }
SurfaceRepository::Surface& SurfaceRepository::getSurface(Surface& surface, DWORD width, DWORD height, SurfaceRepository::Surface& SurfaceRepository::getSurface(Surface& surface, DWORD width, DWORD height,
const DDPIXELFORMAT& pf, DWORD caps, UINT surfaceCount) D3DDDIFORMAT format, DWORD caps, UINT surfaceCount)
{ {
if (!g_enableSurfaceCheck) if (!g_enableSurfaceCheck)
{ {
return surface; return surface;
} }
if (surface.surface && (surface.width != width || surface.height != height || if (surface.width != width || surface.height != height || surface.format != format || isLost(surface))
0 != memcmp(&surface.pixelFormat, &pf, sizeof(pf)) || isLost(surface)))
{ {
surface = {}; surface = {};
} }
if (!surface.surface) if (!surface.surface)
{ {
surface.surface = createSurface(width, height, pf, caps, surfaceCount); surface.surface = createSurface(width, height, format, caps, surfaceCount);
if (surface.surface) if (surface.surface)
{ {
surface.resource = D3dDdi::Device::findResource( surface.resource = D3dDdi::Device::findResource(
DDraw::DirectDrawSurface::getDriverResourceHandle(*surface.surface)); DDraw::DirectDrawSurface::getDriverResourceHandle(*surface.surface));
surface.width = width; surface.width = width;
surface.height = height; surface.height = height;
surface.pixelFormat = pf; surface.format = format;
} }
} }
@ -256,26 +254,26 @@ namespace D3dDdi
{ {
m_renderTargets.resize(index + 1); m_renderTargets.resize(index + 1);
} }
return getTempSurface(m_renderTargets[index], width, height, getPixelFormat(D3DDDIFMT_A8R8G8B8), return getTempSurface(m_renderTargets[index], width, height, D3DDDIFMT_A8R8G8B8,
DDSCAPS_3DDEVICE | DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY); DDSCAPS_3DDEVICE | DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY);
} }
SurfaceRepository::Surface& SurfaceRepository::getTempSurface(Surface& surface, DWORD width, DWORD height, SurfaceRepository::Surface& SurfaceRepository::getTempSurface(Surface& surface, DWORD width, DWORD height,
const DDPIXELFORMAT& pf, DWORD caps, UINT surfaceCount) D3DDDIFORMAT format, DWORD caps, UINT surfaceCount)
{ {
return getSurface(surface, max(width, surface.width), max(height, surface.height), pf, caps, surfaceCount); return getSurface(surface, max(width, surface.width), max(height, surface.height), format, caps, surfaceCount);
} }
SurfaceRepository::Surface& SurfaceRepository::getTempSysMemSurface(DWORD width, DWORD height) SurfaceRepository::Surface& SurfaceRepository::getTempSysMemSurface(DWORD width, DWORD height)
{ {
return getTempSurface(m_sysMemSurface, width, height, getPixelFormat(D3DDDIFMT_A8R8G8B8), return getTempSurface(m_sysMemSurface, width, height, D3DDDIFMT_A8R8G8B8,
DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY); DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY);
} }
const SurfaceRepository::Surface& SurfaceRepository::getTempTexture(DWORD width, DWORD height, const DDPIXELFORMAT& pf) const SurfaceRepository::Surface& SurfaceRepository::getTempTexture(DWORD width, DWORD height, D3DDDIFORMAT format)
{ {
return getTempSurface(m_textures[pf], width, height, pf, return getTempSurface(m_textures[format], width, height, format,
(pf.dwRGBBitCount > 8 ? DDSCAPS_TEXTURE : 0) | DDSCAPS_VIDEOMEMORY); (D3DDDIFMT_P8 == format ? 0 : DDSCAPS_TEXTURE) | DDSCAPS_VIDEOMEMORY);
} }
bool SurfaceRepository::hasAlpha(CompatRef<IDirectDrawSurface7> surface) bool SurfaceRepository::hasAlpha(CompatRef<IDirectDrawSurface7> surface)

View File

@ -7,7 +7,6 @@
#include <Common/CompatPtr.h> #include <Common/CompatPtr.h>
#include <Common/CompatRef.h> #include <Common/CompatRef.h>
#include <DDraw/Comparison.h>
namespace D3dDdi namespace D3dDdi
{ {
@ -33,7 +32,7 @@ namespace D3dDdi
Resource* resource = nullptr; Resource* resource = nullptr;
DWORD width = 0; DWORD width = 0;
DWORD height = 0; DWORD height = 0;
DDPIXELFORMAT pixelFormat = {}; D3DDDIFORMAT format = D3DDDIFMT_UNKNOWN;
}; };
Cursor getCursor(HCURSOR cursor); Cursor getCursor(HCURSOR cursor);
@ -41,12 +40,12 @@ namespace D3dDdi
Resource* getPaletteTexture(); Resource* getPaletteTexture();
Resource* getGammaRampTexture(); Resource* getGammaRampTexture();
Surface& getSurface(Surface& surface, DWORD width, DWORD height, Surface& getSurface(Surface& surface, DWORD width, DWORD height,
const DDPIXELFORMAT& pf, DWORD caps, UINT surfaceCount = 1); D3DDDIFORMAT format, DWORD caps, UINT surfaceCount = 1);
const Surface& getTempRenderTarget(DWORD width, DWORD height, UINT index = 0); const Surface& getTempRenderTarget(DWORD width, DWORD height, UINT index = 0);
Surface& getTempSysMemSurface(DWORD width, DWORD height); Surface& getTempSysMemSurface(DWORD width, DWORD height);
Surface& getTempSurface(Surface& surface, DWORD width, DWORD height, Surface& getTempSurface(Surface& surface, DWORD width, DWORD height,
const DDPIXELFORMAT& pf, DWORD caps, UINT surfaceCount = 1); D3DDDIFORMAT format, DWORD caps, UINT surfaceCount = 1);
const Surface& getTempTexture(DWORD width, DWORD height, const DDPIXELFORMAT& pf); const Surface& getTempTexture(DWORD width, DWORD height, D3DDDIFORMAT format);
void release(Surface& surface); void release(Surface& surface);
static SurfaceRepository& get(const Adapter& adapter); static SurfaceRepository& get(const Adapter& adapter);
@ -57,9 +56,9 @@ namespace D3dDdi
SurfaceRepository(const Adapter& adapter); SurfaceRepository(const Adapter& adapter);
CompatPtr<IDirectDrawSurface7> createSurface(DWORD width, DWORD height, CompatPtr<IDirectDrawSurface7> createSurface(DWORD width, DWORD height,
const DDPIXELFORMAT& pf, DWORD caps, UINT surfaceCount); D3DDDIFORMAT format, DWORD caps, UINT surfaceCount);
bool getCursorImage(Surface& surface, HCURSOR cursor, DWORD width, DWORD height, UINT flags); bool getCursorImage(Surface& surface, HCURSOR cursor, DWORD width, DWORD height, UINT flags);
Resource* getInitializedResource(Surface& surface, DWORD width, DWORD height, const DDPIXELFORMAT& pf, DWORD caps, Resource* getInitializedResource(Surface& surface, DWORD width, DWORD height, D3DDDIFORMAT format, DWORD caps,
std::function<void(const DDSURFACEDESC2&)> initFunc); std::function<void(const DDSURFACEDESC2&)> initFunc);
bool hasAlpha(CompatRef<IDirectDrawSurface7> surface); bool hasAlpha(CompatRef<IDirectDrawSurface7> surface);
bool isLost(Surface& surface); bool isLost(Surface& surface);
@ -75,7 +74,7 @@ namespace D3dDdi
Surface m_logicalXorTexture; Surface m_logicalXorTexture;
Surface m_paletteTexture; Surface m_paletteTexture;
std::vector<Surface> m_renderTargets; std::vector<Surface> m_renderTargets;
std::map<DDPIXELFORMAT, Surface> m_textures; std::map<D3DDDIFORMAT, Surface> m_textures;
std::vector<Surface> m_releasedSurfaces; std::vector<Surface> m_releasedSurfaces;
Surface m_sysMemSurface; Surface m_sysMemSurface;

View File

@ -194,7 +194,7 @@ namespace
auto& repo = D3dDdi::SurfaceRepository::get(device->getAdapter()); auto& repo = D3dDdi::SurfaceRepository::get(device->getAdapter());
D3dDdi::SurfaceRepository::Surface surface = {}; D3dDdi::SurfaceRepository::Surface surface = {};
repo.getSurface(surface, width, height, DDraw::DirectDraw::getRgbPixelFormat(32), repo.getSurface(surface, width, height, D3DDDIFMT_X8R8G8B8,
DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY); DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY);
if (!surface.surface) if (!surface.surface)
{ {

View File

@ -52,7 +52,7 @@ namespace
auto& repo = D3dDdi::SurfaceRepository::get(device->getAdapter()); auto& repo = D3dDdi::SurfaceRepository::get(device->getAdapter());
D3dDdi::SurfaceRepository::Surface surface = {}; D3dDdi::SurfaceRepository::Surface surface = {};
repo.getSurface(surface, 1, 1, DDraw::DirectDraw::getRgbPixelFormat(32), DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY); repo.getSurface(surface, 1, 1, D3DDDIFMT_X8R8G8B8, DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY);
LOG_RESULT(surface.surface.get()); LOG_RESULT(surface.surface.get());
return surface.surface; return surface.surface;

View File

@ -6,6 +6,7 @@
#include <Common/CompatPtr.h> #include <Common/CompatPtr.h>
#include <D3dDdi/Device.h> #include <D3dDdi/Device.h>
#include <D3dDdi/Resource.h>
#include <D3dDdi/SurfaceRepository.h> #include <D3dDdi/SurfaceRepository.h>
#include <DDraw/DirectDrawClipper.h> #include <DDraw/DirectDrawClipper.h>
#include <DDraw/DirectDrawSurface.h> #include <DDraw/DirectDrawSurface.h>
@ -65,17 +66,16 @@ namespace
return bltFunc(This, lpDDSrcSurface, lpSrcRect); return bltFunc(This, lpDDSrcSurface, lpSrcRect);
} }
auto srcResource = DDraw::DirectDrawSurface::getDriverResourceHandle(*lpDDSrcSurface); auto srcResource = D3dDdi::Device::findResource(DDraw::DirectDrawSurface::getDriverResourceHandle(*lpDDSrcSurface));
auto device = D3dDdi::Device::findDeviceByResource(srcResource); if (!srcResource)
if (!device)
{ {
return bltFunc(This, lpDDSrcSurface, lpSrcRect); return bltFunc(This, lpDDSrcSurface, lpSrcRect);
} }
auto& repo = D3dDdi::SurfaceRepository::get(device->getAdapter()); auto& repo = D3dDdi::SurfaceRepository::get(srcResource->getDevice().getAdapter());
RECT srcRect = getRect(lpSrcRect, srcDesc); RECT srcRect = getRect(lpSrcRect, srcDesc);
auto& tex = repo.getTempTexture(srcRect.right - srcRect.left, srcRect.bottom - srcRect.top, auto& tex = repo.getTempTexture(srcRect.right - srcRect.left, srcRect.bottom - srcRect.top,
srcDesc.ddpfPixelFormat); srcResource->getOrigDesc().Format);
if (!tex.resource) if (!tex.resource)
{ {
return bltFunc(This, lpDDSrcSurface, lpSrcRect); return bltFunc(This, lpDDSrcSurface, lpSrcRect);
@ -86,7 +86,7 @@ namespace
HRESULT result = getOrigVtable(This).GetColorKey(lpDDSrcSurface, DDCKEY_SRCBLT, &ck); HRESULT result = getOrigVtable(This).GetColorKey(lpDDSrcSurface, DDCKEY_SRCBLT, &ck);
getOrigVtable(This).SetColorKey(newSrcSurface, DDCKEY_SRCBLT, SUCCEEDED(result) ? &ck : nullptr); getOrigVtable(This).SetColorKey(newSrcSurface, DDCKEY_SRCBLT, SUCCEEDED(result) ? &ck : nullptr);
g_bltSrcResource = srcResource; g_bltSrcResource = *srcResource;
g_bltSrcSubResourceIndex = DDraw::DirectDrawSurface::getSubResourceIndex(*lpDDSrcSurface); g_bltSrcSubResourceIndex = DDraw::DirectDrawSurface::getSubResourceIndex(*lpDDSrcSurface);
g_bltSrcRect = getRect(lpSrcRect, srcDesc); g_bltSrcRect = getRect(lpSrcRect, srcDesc);

View File

@ -167,6 +167,7 @@
<ClInclude Include="Config\Settings\ConfigHotKey.h" /> <ClInclude Include="Config\Settings\ConfigHotKey.h" />
<ClInclude Include="Config\Settings\CpuAffinity.h" /> <ClInclude Include="Config\Settings\CpuAffinity.h" />
<ClInclude Include="Config\Settings\CpuAffinityRotation.h" /> <ClInclude Include="Config\Settings\CpuAffinityRotation.h" />
<ClInclude Include="Config\Settings\DepthFormat.h" />
<ClInclude Include="Config\Settings\DesktopColorDepth.h" /> <ClInclude Include="Config\Settings\DesktopColorDepth.h" />
<ClInclude Include="Config\Settings\DisplayFilter.h" /> <ClInclude Include="Config\Settings\DisplayFilter.h" />
<ClInclude Include="Config\Settings\DisplayRefreshRate.h" /> <ClInclude Include="Config\Settings\DisplayRefreshRate.h" />

View File

@ -648,6 +648,9 @@
<ClInclude Include="Config\Settings\VertexBufferMemoryType.h"> <ClInclude Include="Config\Settings\VertexBufferMemoryType.h">
<Filter>Header Files\Config\Settings</Filter> <Filter>Header Files\Config\Settings</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Config\Settings\DepthFormat.h">
<Filter>Header Files\Config\Settings</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="Gdi\Gdi.cpp"> <ClCompile Include="Gdi\Gdi.cpp">

View File

@ -6,6 +6,7 @@
#include <Config/Settings/Antialiasing.h> #include <Config/Settings/Antialiasing.h>
#include <Config/Settings/BltFilter.h> #include <Config/Settings/BltFilter.h>
#include <Config/Settings/ConfigHotKey.h> #include <Config/Settings/ConfigHotKey.h>
#include <Config/Settings/DepthFormat.h>
#include <Config/Settings/DisplayFilter.h> #include <Config/Settings/DisplayFilter.h>
#include <Config/Settings/FontAntialiasing.h> #include <Config/Settings/FontAntialiasing.h>
#include <Config/Settings/FpsLimiter.h> #include <Config/Settings/FpsLimiter.h>
@ -30,7 +31,7 @@ namespace
namespace Overlay namespace Overlay
{ {
ConfigWindow::ConfigWindow() ConfigWindow::ConfigWindow()
: Window(nullptr, { 0, 0, SettingControl::TOTAL_WIDTH, 430 }, WS_BORDER, Config::configHotKey.get()) : Window(nullptr, { 0, 0, SettingControl::TOTAL_WIDTH, 455 }, WS_BORDER, Config::configHotKey.get())
, m_buttonCount(0) , m_buttonCount(0)
, m_focus(nullptr) , m_focus(nullptr)
{ {
@ -43,6 +44,7 @@ namespace Overlay
addControl(Config::alternatePixelCenter); addControl(Config::alternatePixelCenter);
addControl(Config::antialiasing); addControl(Config::antialiasing);
addControl(Config::bltFilter); addControl(Config::bltFilter);
addControl(Config::depthFormat);
addControl(Config::displayFilter); addControl(Config::displayFilter);
addControl(Config::fontAntialiasing); addControl(Config::fontAntialiasing);
addControl(Config::fpsLimiter); addControl(Config::fpsLimiter);

View File

@ -1,4 +1,5 @@
#include <Config/Settings/Antialiasing.h> #include <Config/Settings/Antialiasing.h>
#include <Config/Settings/DepthFormat.h>
#include <Config/Settings/RenderColorDepth.h> #include <Config/Settings/RenderColorDepth.h>
#include <Config/Settings/ResolutionScale.h> #include <Config/Settings/ResolutionScale.h>
#include <Config/Settings/SpriteFilter.h> #include <Config/Settings/SpriteFilter.h>
@ -82,6 +83,7 @@ namespace Overlay
} }
if (&Config::antialiasing == &m_setting || if (&Config::antialiasing == &m_setting ||
&Config::depthFormat == &m_setting ||
&Config::renderColorDepth == &m_setting || &Config::renderColorDepth == &m_setting ||
&Config::resolutionScale == &m_setting || &Config::resolutionScale == &m_setting ||
&Config::spriteFilter == &m_setting || &Config::spriteFilter == &m_setting ||