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

Prevent some redundant state changes from execute buffers

This commit is contained in:
narzoul 2020-05-30 21:23:49 +02:00
parent 6799ecc1a9
commit e7d0fa8f10
3 changed files with 44 additions and 0 deletions

View File

@ -24,6 +24,8 @@ namespace D3dDdi
, m_renderTarget(nullptr)
, m_renderTargetSubResourceIndex(0)
, m_sharedPrimary(nullptr)
, m_textures{}
, m_vertexShaderDecl(nullptr)
, m_drawPrimitive(*this)
{
}
@ -218,6 +220,41 @@ namespace D3dDdi
return m_drawPrimitive.setStreamSourceUm(*data, umBuffer);
}
HRESULT Device::setTexture(UINT stage, HANDLE texture)
{
if (stage < m_textures.size())
{
if (texture == m_textures[stage])
{
return S_OK;
}
HRESULT result = m_origVtable.pfnSetTexture(m_device, stage, texture);
if (SUCCEEDED(result) && stage < m_textures.size())
{
m_textures[stage] = texture;
}
return result;
}
return m_origVtable.pfnSetTexture(m_device, stage, texture);
}
HRESULT Device::setVertexShaderDecl(HANDLE shader)
{
if (shader == m_vertexShaderDecl)
{
return S_OK;
}
HRESULT result = m_origVtable.pfnSetVertexShaderDecl(m_device, shader);
if (SUCCEEDED(result))
{
m_vertexShaderDecl = shader;
}
return result;
}
HRESULT Device::unlock(const D3DDDIARG_UNLOCK* data)
{
auto it = m_resources.find(data->hResource);

View File

@ -1,5 +1,6 @@
#pragma once
#include <array>
#include <map>
#include <unordered_map>
@ -37,6 +38,8 @@ namespace D3dDdi
HRESULT setRenderTarget(const D3DDDIARG_SETRENDERTARGET* data);
HRESULT setStreamSource(const D3DDDIARG_SETSTREAMSOURCE* data);
HRESULT setStreamSourceUm(const D3DDDIARG_SETSTREAMSOURCEUM* data, const void* umBuffer);
HRESULT setTexture(UINT stage, HANDLE texture);
HRESULT setVertexShaderDecl(HANDLE shader);
HRESULT unlock(const D3DDDIARG_UNLOCK* data);
HRESULT updateWInfo(const D3DDDIARG_WINFO* data);
@ -70,6 +73,8 @@ namespace D3dDdi
Resource* m_renderTarget;
UINT m_renderTargetSubResourceIndex;
HANDLE m_sharedPrimary;
std::array<HANDLE, 8> m_textures;
HANDLE m_vertexShaderDecl;
DrawPrimitive m_drawPrimitive;
static std::map<HANDLE, Device> s_devices;

View File

@ -45,6 +45,8 @@ namespace D3dDdi
vtable.pfnSetRenderTarget = &DEVICE_FUNC(setRenderTarget);
vtable.pfnSetStreamSource = &DEVICE_FUNC(setStreamSource);
vtable.pfnSetStreamSourceUm = &DEVICE_FUNC(setStreamSourceUm);
vtable.pfnSetTexture = &DEVICE_FUNC(setTexture);
vtable.pfnSetVertexShaderDecl = &DEVICE_FUNC(setVertexShaderDecl);
vtable.pfnUnlock = &DEVICE_FUNC(unlock);
vtable.pfnUpdateWInfo = &DEVICE_FUNC(updateWInfo);
}