Skip to content

Commit

Permalink
Move index buffer to DirectDraw interface
Browse files Browse the repository at this point in the history
  • Loading branch information
elishacloud committed Oct 11, 2024
1 parent c5dd47e commit fb34d62
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 85 deletions.
2 changes: 1 addition & 1 deletion Dllmain/BuildNo.rc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
#define BUILD_NUMBER 7238
#define BUILD_NUMBER 7239
2 changes: 1 addition & 1 deletion ddraw/IDirect3DDeviceX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3680,7 +3680,7 @@ HRESULT m_IDirect3DDeviceX::DrawIndexedPrimitiveVB(D3DPRIMITIVETYPE dptPrimitive
return D3D_OK;
}

LPDIRECT3DINDEXBUFFER9 d3d9IndexBuffer = pVertexBufferX->SetupIndexBuffer(lpwIndices, dwIndexCount);
LPDIRECT3DINDEXBUFFER9 d3d9IndexBuffer = ddrawParent->GetIndexBuffer(lpwIndices, dwIndexCount);
if (!d3d9IndexBuffer)
{
LOG_LIMIT(100, __FUNCTION__ << " Error: could not get d3d9 index buffer!");
Expand Down
73 changes: 2 additions & 71 deletions ddraw/IDirect3DVertexBufferX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -567,7 +567,7 @@ void m_IDirect3DVertexBufferX::ReleaseVertexBuffer()
WrapperInterface7->DeleteMe();
}

ReleaseD9Buffers(false, false);
ReleaseD9Buffer(false, false);

if (ddrawParent && !Config.Exiting)
{
Expand Down Expand Up @@ -665,72 +665,7 @@ void m_IDirect3DVertexBufferX::ReleaseD3D9VertexBuffer()
}
}

LPDIRECT3DINDEXBUFFER9 m_IDirect3DVertexBufferX::SetupIndexBuffer(LPWORD lpwIndices, DWORD dwIndexCount)
{
if (!lpwIndices)
{
LOG_LIMIT(100, __FUNCTION__ << " Error: nullptr Indices!");
return nullptr;
}

// Check for device interface
if (FAILED(CheckInterface(__FUNCTION__, true, false)))
{
return nullptr;
}

DWORD NewIndexSize = dwIndexCount * sizeof(WORD);

HRESULT hr = D3D_OK;
if (!d3d9IndexBuffer || NewIndexSize > IndexBufferSize)
{
ReleaseD3D9IndexBuffer();
hr = (*d3d9Device)->CreateIndexBuffer(NewIndexSize, ((VBDesc.dwCaps & D3DVBCAPS_DONOTCLIP) ? D3DUSAGE_DONOTCLIP : 0), D3DFMT_INDEX16, D3DPOOL_SYSTEMMEM, &d3d9IndexBuffer, nullptr);
}

if (FAILED(hr))
{
LOG_LIMIT(100, __FUNCTION__ << " Error: failed to create index buffer: " << (D3DERR)hr << " Size: " << NewIndexSize);
return nullptr;
}

if (NewIndexSize > IndexBufferSize)
{
IndexBufferSize = NewIndexSize;
}

void* pData = nullptr;
hr = d3d9IndexBuffer->Lock(0, NewIndexSize, &pData, 0);

if (FAILED(hr))
{
LOG_LIMIT(100, __FUNCTION__ << " Error: failed to lock index buffer: " << (D3DERR)hr);
return nullptr;
}

memcpy(pData, lpwIndices, NewIndexSize);

d3d9IndexBuffer->Unlock();

return d3d9IndexBuffer;
}

void m_IDirect3DVertexBufferX::ReleaseD3D9IndexBuffer()
{
// Release index buffer
if (d3d9IndexBuffer)
{
ULONG ref = d3d9IndexBuffer->Release();
if (ref)
{
Logging::Log() << __FUNCTION__ << " (" << this << ")" << " Error: there is still a reference to 'd3d9IndexBuffer' " << ref;
}
d3d9IndexBuffer = nullptr;
IndexBufferSize = 0;
}
}

void m_IDirect3DVertexBufferX::ReleaseD9Buffers(bool BackupData, bool ResetBuffer)
void m_IDirect3DVertexBufferX::ReleaseD9Buffer(bool BackupData, bool ResetBuffer)
{
if (BackupData && VBDesc.dwFVF != D3DFVF_LVERTEX)
{
Expand All @@ -742,8 +677,4 @@ void m_IDirect3DVertexBufferX::ReleaseD9Buffers(bool BackupData, bool ResetBuffe
{
ReleaseD3D9VertexBuffer();
}
if (!ResetBuffer)
{
ReleaseD3D9IndexBuffer();
}
}
8 changes: 1 addition & 7 deletions ddraw/IDirect3DVertexBufferX.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,8 @@ class m_IDirect3DVertexBufferX : public IDirect3DVertexBuffer7, public AddressLo
void* LastLockAddr = nullptr;
DWORD LastLockFlags = 0;

// Index buffer data
DWORD IndexBufferSize = 0;

// Store d3d interface
LPDIRECT3DVERTEXBUFFER9 d3d9VertexBuffer = nullptr;
LPDIRECT3DINDEXBUFFER9 d3d9IndexBuffer = nullptr;

// Store version wrappers
m_IDirect3DVertexBuffer *WrapperInterface = nullptr;
Expand Down Expand Up @@ -54,7 +50,6 @@ class m_IDirect3DVertexBufferX : public IDirect3DVertexBuffer7, public AddressLo
// Direct3D9 interface functions
HRESULT CreateD3D9VertexBuffer();
void ReleaseD3D9VertexBuffer();
void ReleaseD3D9IndexBuffer();

public:
m_IDirect3DVertexBufferX(IDirect3DVertexBuffer7 *aOriginal, DWORD DirectXVersion) : ProxyInterface(aOriginal)
Expand Down Expand Up @@ -123,8 +118,7 @@ class m_IDirect3DVertexBufferX : public IDirect3DVertexBuffer7, public AddressLo

// Direct3D9 interfaces
LPDIRECT3DVERTEXBUFFER9 GetCurrentD9VertexBuffer() { return d3d9VertexBuffer; };
LPDIRECT3DINDEXBUFFER9 SetupIndexBuffer(LPWORD lpwIndices, DWORD dwIndexCount);
void ReleaseD9Buffers(bool BackupData, bool ResetBuffer);
void ReleaseD9Buffer(bool BackupData, bool ResetBuffer);

DWORD GetFVF9() { return d3d9VBDesc.FVF; };
};
2 changes: 1 addition & 1 deletion ddraw/IDirectDrawSurfaceX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4708,7 +4708,7 @@ HRESULT m_IDirectDrawSurfaceX::CreateD9Surface()
break;
}

if (LostDeviceBackup[Level].Format == Format && LostDeviceBackup[Level].Width == surface.Width && LostDeviceBackup[Level].Height == surface.Height)
if (LostDeviceBackup[Level].Format == Desc.Format && LostDeviceBackup[Level].Width == Desc.Width && LostDeviceBackup[Level].Height == Desc.Height)
{
size_t size = GetSurfaceSize(Desc.Format, Desc.Width, Desc.Height, LockRect.Pitch);

Expand Down
81 changes: 77 additions & 4 deletions ddraw/IDirectDrawX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,8 @@ LPDIRECT3DPIXELSHADER9 palettePixelShader;
LPDIRECT3DPIXELSHADER9 colorkeyPixelShader;
LPDIRECT3DVERTEXBUFFER9 VertexBuffer;
LPDIRECT3DVERTEXBUFFER9 validateDeviceVertexBuffer;
LPDIRECT3DINDEXBUFFER9 d3d9IndexBuffer = nullptr;
DWORD IndexBufferSize = 0;
DWORD BehaviorFlags;
HWND hFocusWindow;

Expand Down Expand Up @@ -2616,7 +2618,7 @@ void m_IDirectDrawX::ReleaseDdraw()
// Release vertex buffers
for (m_IDirect3DVertexBufferX*& pVertexBuffer : VertexBufferVector)
{
pVertexBuffer->ReleaseD9Buffers(false, false);
pVertexBuffer->ReleaseD9Buffer(false, false);
pVertexBuffer->ClearDdraw();
}
VertexBufferVector.clear();
Expand Down Expand Up @@ -2902,6 +2904,56 @@ LPDIRECT3DVERTEXBUFFER9 m_IDirectDrawX::GetValidateDeviceVertexBuffer(DWORD& FVF
return validateDeviceVertexBuffer;
}

LPDIRECT3DINDEXBUFFER9 m_IDirectDrawX::GetIndexBuffer(LPWORD lpwIndices, DWORD dwIndexCount)
{
if (!lpwIndices)
{
LOG_LIMIT(100, __FUNCTION__ << " Error: nullptr Indices!");
return nullptr;
}

// Check for device interface
if (FAILED(CheckInterface(__FUNCTION__, true)))
{
return nullptr;
}

DWORD NewIndexSize = dwIndexCount * sizeof(WORD);

HRESULT hr = D3D_OK;
if (!d3d9IndexBuffer || NewIndexSize > IndexBufferSize)
{
ReleaseD3D9IndexBuffer();
hr = d3d9Device->CreateIndexBuffer(NewIndexSize, D3DUSAGE_DYNAMIC, D3DFMT_INDEX16, D3DPOOL_SYSTEMMEM, &d3d9IndexBuffer, nullptr);
}

if (FAILED(hr))
{
LOG_LIMIT(100, __FUNCTION__ << " Error: failed to create index buffer: " << (D3DERR)hr << " Size: " << NewIndexSize);
return nullptr;
}

if (NewIndexSize > IndexBufferSize)
{
IndexBufferSize = NewIndexSize;
}

void* pData = nullptr;
hr = d3d9IndexBuffer->Lock(0, NewIndexSize, &pData, 0);

if (FAILED(hr))
{
LOG_LIMIT(100, __FUNCTION__ << " Error: failed to lock index buffer: " << (D3DERR)hr);
return nullptr;
}

memcpy(pData, lpwIndices, NewIndexSize);

d3d9IndexBuffer->Unlock();

return d3d9IndexBuffer;
}

// Get AntiAliasing type and quality
D3DMULTISAMPLE_TYPE m_IDirectDrawX::GetMultiSampleTypeQuality(D3DFORMAT Format, DWORD MaxSampleType, DWORD& QualityLevels)
{
Expand Down Expand Up @@ -3640,6 +3692,21 @@ inline void m_IDirectDrawX::ResetAllSurfaceDisplay()
ReleaseCriticalSection();
}

inline void m_IDirectDrawX::ReleaseD3D9IndexBuffer()
{
// Release index buffer
if (d3d9IndexBuffer)
{
ULONG ref = d3d9IndexBuffer->Release();
if (ref)
{
Logging::Log() << __FUNCTION__ << " (" << this << ")" << " Error: there is still a reference to 'd3d9IndexBuffer' " << ref;
}
d3d9IndexBuffer = nullptr;
IndexBufferSize = 0;
}
}

// Release all dd9 resources
inline void m_IDirectDrawX::ReleaseAllD9Resources(bool BackupData, bool ResetInterface)
{
Expand All @@ -3666,7 +3733,7 @@ inline void m_IDirectDrawX::ReleaseAllD9Resources(bool BackupData, bool ResetInt
pDDraw->ReleasedSurfaceVector.clear();
}

// Release all surfaces from all direct3d device
// Release all state blocks from all ddraw devices
if (!ResetInterface)
{
for (m_IDirectDrawX*& pDDraw : DDrawVector)
Expand All @@ -3679,12 +3746,12 @@ inline void m_IDirectDrawX::ReleaseAllD9Resources(bool BackupData, bool ResetInt
}
}

// Release all buffers from all ddraw devices
// Release all vertex buffers from all ddraw devices
for (m_IDirectDrawX*& pDDraw : DDrawVector)
{
for (m_IDirect3DVertexBufferX*& pBuffer : pDDraw->VertexBufferVector)
{
pBuffer->ReleaseD9Buffers(BackupData, ResetInterface);
pBuffer->ReleaseD9Buffer(BackupData, ResetInterface);
}
}

Expand Down Expand Up @@ -3712,6 +3779,12 @@ inline void m_IDirectDrawX::ReleaseAllD9Resources(bool BackupData, bool ResetInt
validateDeviceVertexBuffer = nullptr;
}

// Release index buffer
if (!ResetInterface)
{
ReleaseD3D9IndexBuffer();
}

// Release palette pixel shader
if (palettePixelShader)
{
Expand Down
2 changes: 2 additions & 0 deletions ddraw/IDirectDrawX.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ class m_IDirectDrawX : public IUnknown, public AddressLookupTableDdrawObject
HRESULT CreateD9Object();
void Clear3DFlagForAllSurfaces();
void ResetAllSurfaceDisplay();
void ReleaseD3D9IndexBuffer();
void ReleaseAllD9Resources(bool BackupData, bool ResetInterface);
void ReleaseD9Device();
void ReleaseD9Object();
Expand Down Expand Up @@ -190,6 +191,7 @@ class m_IDirectDrawX : public IUnknown, public AddressLookupTableDdrawObject
bool CreatePaletteShader();
LPDIRECT3DPIXELSHADER9* GetColorKeyShader();
LPDIRECT3DVERTEXBUFFER9 GetValidateDeviceVertexBuffer(DWORD& FVF, DWORD& Size);
LPDIRECT3DINDEXBUFFER9 GetIndexBuffer(LPWORD lpwIndices, DWORD dwIndexCount);
D3DMULTISAMPLE_TYPE GetMultiSampleTypeQuality(D3DFORMAT Format, DWORD MaxSampleType, DWORD& QualityLevels);
HRESULT ResetD9Device();
HRESULT CreateD9Device(char* FunctionName);
Expand Down

0 comments on commit fb34d62

Please sign in to comment.