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

144 lines
5.2 KiB
C
Raw Normal View History

2019-04-23 12:44:13 +02:00
#pragma once
#include <memory>
2019-04-23 12:44:13 +02:00
#include <vector>
#include <d3d.h>
#include <d3dumddi.h>
#include <D3dDdi/FormatInfo.h>
2021-12-04 16:39:07 +01:00
#include <D3dDdi/ResourceDeleter.h>
2021-07-10 15:06:20 +02:00
#include <D3dDdi/SurfaceRepository.h>
2019-07-26 00:26:44 +02:00
2019-04-23 12:44:13 +02:00
namespace D3dDdi
{
class Device;
class Resource
{
public:
Resource(Device& device, D3DDDIARG_CREATERESOURCE2& data);
2019-04-23 12:44:13 +02:00
Resource(const Resource&) = delete;
Resource(Resource&&) = delete;
Resource& operator=(const Resource&) = delete;
Resource& operator=(Resource&&) = delete;
~Resource();
2019-04-23 12:44:13 +02:00
operator HANDLE() const { return m_handle; }
2021-12-14 13:15:19 +01:00
const Resource* getCustomResource() { return m_msaaSurface.resource ? m_msaaSurface.resource : m_msaaResolvedSurface.resource; }
2022-04-15 23:49:46 +02:00
Device& getDevice() const { return m_device; }
const D3DDDIARG_CREATERESOURCE2& getFixedDesc() const { return m_fixedData; }
2021-07-10 15:06:20 +02:00
const D3DDDIARG_CREATERESOURCE2& getOrigDesc() const { return m_origData; }
2022-08-27 00:44:25 +02:00
UINT getPaletteHandle() const { return m_paletteHandle; }
Resource* getPalettizedTexture() { return m_palettizedTexture; }
2022-03-06 12:31:46 +01:00
bool isClampable() const { return m_isClampable; }
2022-08-27 00:44:25 +02:00
void invalidatePalettizedTexture() { m_isPalettizedTextureUpToDate = false; }
2019-04-23 12:44:13 +02:00
HRESULT blt(D3DDDIARG_BLT data);
HRESULT colorFill(D3DDDIARG_COLORFILL data);
2022-03-06 12:31:46 +01:00
void disableClamp();
void* getLockPtr(UINT subResourceIndex);
2019-04-23 12:44:13 +02:00
HRESULT lock(D3DDDIARG_LOCK& data);
void onDestroyResource(HANDLE resource);
Resource& prepareForBltSrc(const D3DDDIARG_BLT& data);
Resource& prepareForBltDst(D3DDDIARG_BLT& data);
Resource& prepareForBltDst(HANDLE& resource, UINT subResourceIndex, RECT& rect);
2021-12-14 13:15:19 +01:00
void prepareForCpuRead(UINT subResourceIndex);
void prepareForCpuWrite(UINT subResourceIndex);
Resource& prepareForGpuRead(UINT subResourceIndex);
void prepareForGpuWrite(UINT subResourceIndex);
HRESULT presentationBlt(D3DDDIARG_BLT data, Resource* srcResource);
2021-12-28 00:41:11 +01:00
void scaleRect(RECT& rect);
void setAsGdiResource(bool isGdiResource);
void setAsPrimary();
void setFullscreenMode(bool isFullscreen);
2022-08-27 00:44:25 +02:00
void setPaletteHandle(UINT paletteHandle);
void setPalettizedTexture(Resource& resource);
2019-04-23 12:44:13 +02:00
HRESULT unlock(const D3DDDIARG_UNLOCK& data);
2021-08-23 23:08:31 +02:00
void updateConfig();
2022-08-27 00:44:25 +02:00
void updatePalettizedTexture(UINT stage);
2019-04-23 12:44:13 +02:00
private:
class Data : public D3DDDIARG_CREATERESOURCE2
{
public:
Data(const D3DDDIARG_CREATERESOURCE2& data);
Data(const Data&) = delete;
Data(Data&&) = delete;
Data& operator=(const Data&) = delete;
Data& operator=(Data&&) = delete;
2019-04-23 12:44:13 +02:00
std::vector<D3DDDI_SURFACEINFO> surfaceData;
};
struct LockData
{
void* data;
UINT pitch;
UINT lockCount;
long long qpcLastForcedLock;
bool isSysMemUpToDate;
bool isVidMemUpToDate;
2021-12-14 13:15:19 +01:00
bool isMsaaUpToDate;
bool isMsaaResolvedUpToDate;
bool isRefLocked;
};
HRESULT bltLock(D3DDDIARG_LOCK& data);
2022-05-15 21:11:30 +02:00
HRESULT bltViaCpu(D3DDDIARG_BLT data, Resource& srcResource);
HRESULT bltViaGpu(D3DDDIARG_BLT data, Resource& srcResource);
void clearRectExterior(UINT subResourceIndex, const RECT& rect);
void clearRectInterior(UINT subResourceIndex, const RECT& rect);
2021-12-14 13:15:19 +01:00
void clearUpToDateFlags(UINT subResourceIndex);
void clipRect(UINT subResourceIndex, RECT& rect);
2021-12-28 00:41:11 +01:00
HRESULT copySubResource(Resource& dstResource, Resource& srcResource, UINT subResourceIndex);
HRESULT copySubResource(HANDLE dstResource, HANDLE srcResource, UINT subResourceIndex);
HRESULT copySubResourceRegion(HANDLE dst, UINT dstIndex, const RECT& dstRect,
HANDLE src, UINT srcIndex, const RECT& srcRect);
void createGdiLockResource();
void createLockResource();
void createSysMemResource(const std::vector<D3DDDI_SURFACEINFO>& surfaceInfo);
bool downscale(Resource*& rt, LONG& srcWidth, LONG& srcHeight, LONG dstWidth, LONG dstHeight);
2021-06-12 20:49:36 +02:00
void fixResourceData();
2021-12-14 13:15:19 +01:00
D3DDDIFORMAT getFormatConfig();
2021-07-10 15:06:20 +02:00
std::pair<D3DDDIMULTISAMPLE_TYPE, UINT> getMultisampleConfig();
const SurfaceRepository::Surface& getNextRenderTarget(Resource* currentRt, DWORD width, DWORD height);
2021-12-28 00:41:11 +01:00
RECT getRect(UINT subResourceIndex);
SIZE getScaledSize();
bool isValidRect(UINT subResourceIndex, const RECT& rect);
void loadFromLockRefResource(UINT subResourceIndex);
2021-12-14 13:15:19 +01:00
void loadMsaaResource(UINT subResourceIndex);
void loadMsaaResolvedResource(UINT subResourceIndex);
void loadSysMemResource(UINT subResourceIndex);
void loadVidMemResource(UINT subResourceIndex);
2021-07-10 15:06:20 +02:00
void notifyLock(UINT subResourceIndex);
void presentLayeredWindows(Resource& dst, UINT dstSubResourceIndex, const RECT& dstRect);
HRESULT shaderBlt(D3DDDIARG_BLT& data, Resource& dstResource, Resource& srcResource);
2019-04-23 12:44:13 +02:00
Device& m_device;
HANDLE m_handle;
Data m_origData;
Data m_fixedData;
2019-07-26 00:26:44 +02:00
FormatInfo m_formatInfo;
std::unique_ptr<void, void(*)(void*)> m_lockBuffer;
std::vector<LockData> m_lockData;
std::unique_ptr<void, ResourceDeleter> m_lockResource;
SurfaceRepository::Surface m_lockRefSurface;
2021-12-14 13:15:19 +01:00
SurfaceRepository::Surface m_msaaSurface;
SurfaceRepository::Surface m_msaaResolvedSurface;
D3DDDIFORMAT m_formatConfig;
2021-08-23 23:08:31 +02:00
std::pair<D3DDDIMULTISAMPLE_TYPE, UINT> m_multiSampleConfig;
2021-12-28 00:41:11 +01:00
SIZE m_scaledSize;
2022-08-27 00:44:25 +02:00
Resource* m_palettizedTexture;
UINT m_paletteHandle;
int m_paletteColorKeyIndex;
bool m_isOversized;
2021-08-23 23:08:31 +02:00
bool m_isSurfaceRepoResource;
2022-03-06 12:31:46 +01:00
bool m_isClampable;
bool m_isPrimary;
2022-08-27 00:44:25 +02:00
bool m_isPalettizedTextureUpToDate;
2019-04-23 12:44:13 +02:00
};
}