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:
parent
6799ecc1a9
commit
e7d0fa8f10
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user