Skip to content

Commit

Permalink
Merge branch 'ajaus/make_device_state_set_elimination_be_optional' in…
Browse files Browse the repository at this point in the history
…to 'main'

Make Redundant Setter Elmination optional and default to disabled.

See merge request lightspeedrtx/bridge-remix-nv!114
  • Loading branch information
nv-ajaus committed Sep 24, 2024
2 parents ec5944b + ed1de03 commit 3e91886
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 12 deletions.
7 changes: 7 additions & 0 deletions bridge.conf
Original file line number Diff line number Diff line change
Expand Up @@ -547,3 +547,10 @@
# Supported values: True, False

# exposeRemixApi = False

# If set, the bridge client will not send certain setter calls to the bridge server if the
# client knows the setter is writing the the same value that is currently stored.
#
# Supported values: True, False

# eliminateRedundantSetterCalls = False
40 changes: 28 additions & 12 deletions src/client/d3d9_device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1209,13 +1209,16 @@ HRESULT Direct3DDevice9Ex_LSS<EnableSync>::SetTransform(D3DTRANSFORMSTATETYPE St
{
BRIDGE_DEVICE_LOCKGUARD();
if (m_stateRecording) {
if (m_stateRecording->m_dirtyFlags.transforms[idx] && memcmp(&m_stateRecording->m_captureState.transforms[idx], pMatrix, sizeof(D3DMATRIX)) == 0) {
if (GlobalOptions::getEliminateRedundantSetterCalls() &&
m_stateRecording->m_dirtyFlags.transforms[idx] &&
memcmp(&m_stateRecording->m_captureState.transforms[idx], pMatrix, sizeof(D3DMATRIX)) == 0) {
return S_OK;
}
m_stateRecording->m_captureState.transforms[idx] = *pMatrix;
m_stateRecording->m_dirtyFlags.transforms[idx] = true;
} else {
if (memcmp(&m_state.transforms[idx], pMatrix, sizeof(D3DMATRIX)) == 0) {
if (GlobalOptions::getEliminateRedundantSetterCalls() &&
memcmp(&m_state.transforms[idx], pMatrix, sizeof(D3DMATRIX)) == 0) {
return S_OK;
}
m_state.transforms[idx] = *pMatrix;
Expand Down Expand Up @@ -1386,13 +1389,16 @@ HRESULT Direct3DDevice9Ex_LSS<EnableSync>::SetLight(DWORD Index, CONST D3DLIGHT9
{
BRIDGE_DEVICE_LOCKGUARD();
if (m_stateRecording) {
if (m_stateRecording->m_dirtyFlags.lights[Index] && memcmp(&m_stateRecording->m_captureState.lights[Index], pLight, sizeof(D3DLIGHT9)) == 0) {
if (GlobalOptions::getEliminateRedundantSetterCalls() &&
m_stateRecording->m_dirtyFlags.lights[Index] &&
memcmp(&m_stateRecording->m_captureState.lights[Index], pLight, sizeof(D3DLIGHT9)) == 0) {
return S_OK;
}
m_stateRecording->m_captureState.lights[Index] = *pLight;
m_stateRecording->m_dirtyFlags.lights[Index] = true;
} else {
if (memcmp(&m_state.lights[Index], pLight, sizeof(D3DLIGHT9)) == 0) {
if (GlobalOptions::getEliminateRedundantSetterCalls() &&
memcmp(&m_state.lights[Index], pLight, sizeof(D3DLIGHT9)) == 0) {
return S_OK;
}
m_state.lights[Index] = *pLight;
Expand Down Expand Up @@ -1434,13 +1440,16 @@ HRESULT Direct3DDevice9Ex_LSS<EnableSync>::LightEnable(DWORD LightIndex, BOOL bE
{
BRIDGE_DEVICE_LOCKGUARD();
if (m_stateRecording) {
if (m_stateRecording->m_dirtyFlags.bLightEnables[LightIndex] && (m_stateRecording->m_captureState.bLightEnables[LightIndex] == (bool)bEnable)) {
if (GlobalOptions::getEliminateRedundantSetterCalls() &&
m_stateRecording->m_dirtyFlags.bLightEnables[LightIndex] &&
(m_stateRecording->m_captureState.bLightEnables[LightIndex] == (bool)bEnable)) {
return S_OK;
}
m_stateRecording->m_captureState.bLightEnables[LightIndex] = bEnable;
m_stateRecording->m_dirtyFlags.bLightEnables[LightIndex] = true;
} else {
if (m_state.bLightEnables[LightIndex] == (bool)bEnable) {
if (GlobalOptions::getEliminateRedundantSetterCalls() &&
m_state.bLightEnables[LightIndex] == (bool)bEnable) {
return S_OK;
}
m_state.bLightEnables[LightIndex] = bEnable;
Expand Down Expand Up @@ -1534,13 +1543,15 @@ HRESULT Direct3DDevice9Ex_LSS<EnableSync>::SetRenderState(D3DRENDERSTATETYPE Sta
{
BRIDGE_DEVICE_LOCKGUARD();
if (m_stateRecording) {
if (m_stateRecording->m_dirtyFlags.renderStates[State] && m_stateRecording->m_captureState.renderStates[State] == Value) {
if (GlobalOptions::getEliminateRedundantSetterCalls() &&
m_stateRecording->m_dirtyFlags.renderStates[State] && m_stateRecording->m_captureState.renderStates[State] == Value) {
return S_OK;
}
m_stateRecording->m_captureState.renderStates[State] = Value;
m_stateRecording->m_dirtyFlags.renderStates[State] = true;
} else {
if (m_state.renderStates[State] == Value) {
if (GlobalOptions::getEliminateRedundantSetterCalls() &&
m_state.renderStates[State] == Value) {
return S_OK;
}
m_state.renderStates[State] = Value;
Expand Down Expand Up @@ -2079,13 +2090,15 @@ HRESULT Direct3DDevice9Ex_LSS<EnableSync>::SetTextureStageState(DWORD Stage, D3D
{
BRIDGE_DEVICE_LOCKGUARD();
if (m_stateRecording) {
if (m_stateRecording->m_dirtyFlags.textureStageStates[stageIdx][typeIdx] && m_stateRecording->m_captureState.textureStageStates[stageIdx][typeIdx] == Value) {
if (GlobalOptions::getEliminateRedundantSetterCalls() &&
m_stateRecording->m_dirtyFlags.textureStageStates[stageIdx][typeIdx] && m_stateRecording->m_captureState.textureStageStates[stageIdx][typeIdx] == Value) {
return S_OK;
}
m_stateRecording->m_captureState.textureStageStates[stageIdx][typeIdx] = Value;
m_stateRecording->m_dirtyFlags.textureStageStates[stageIdx][typeIdx] = true;
} else {
if (m_state.textureStageStates[stageIdx][typeIdx] == Value) {
if (GlobalOptions::getEliminateRedundantSetterCalls() &&
m_state.textureStageStates[stageIdx][typeIdx] == Value) {
return S_OK;
}
m_state.textureStageStates[stageIdx][typeIdx] = Value;
Expand Down Expand Up @@ -2136,13 +2149,16 @@ HRESULT Direct3DDevice9Ex_LSS<EnableSync>::SetSamplerState(DWORD Sampler, D3DSAM
{
BRIDGE_DEVICE_LOCKGUARD();
if (m_stateRecording) {
if (m_stateRecording->m_dirtyFlags.samplerStates[samplerIdx][typeIdx] && m_stateRecording->m_captureState.samplerStates[samplerIdx][typeIdx] == Value) {
if (GlobalOptions::getEliminateRedundantSetterCalls() &&
m_stateRecording->m_dirtyFlags.samplerStates[samplerIdx][typeIdx] &&
m_stateRecording->m_captureState.samplerStates[samplerIdx][typeIdx] == Value) {
return S_OK;
}
m_stateRecording->m_captureState.samplerStates[samplerIdx][typeIdx] = Value;
m_stateRecording->m_dirtyFlags.samplerStates[samplerIdx][typeIdx] = true;
} else {
if (m_state.samplerStates[samplerIdx][typeIdx] == Value) {
if (GlobalOptions::getEliminateRedundantSetterCalls() &&
m_state.samplerStates[samplerIdx][typeIdx] == Value) {
return S_OK;
}
m_state.samplerStates[samplerIdx][typeIdx] = Value;
Expand Down
9 changes: 9 additions & 0 deletions src/util/config/global_options.h
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,10 @@ class GlobalOptions {
return get().exposeRemixApi;
}

static bool getEliminateRedundantSetterCalls() {
return get().eliminateRedundantSetterCalls;
}

private:
GlobalOptions() = default;

Expand Down Expand Up @@ -421,6 +425,10 @@ class GlobalOptions {
alwaysCopyEntireStaticBuffer = bridge_util::Config::getOption<bool>("alwaysCopyEntireStaticBuffer", false);

exposeRemixApi = bridge_util::Config::getOption<bool>("exposeRemixApi", false);

// If set, the bridge client will not send certain setter calls to the bridge server if the client knows the setter is writing
// the the same value that is currently stored.
eliminateRedundantSetterCalls = bridge_util::Config::getOption<bool>("eliminateRedundantSetterCalls", false);
}

void initSharedHeapPolicy();
Expand Down Expand Up @@ -472,4 +480,5 @@ class GlobalOptions {
uint32_t threadSafetyPolicy;
bool alwaysCopyEntireStaticBuffer;
bool exposeRemixApi;
bool eliminateRedundantSetterCalls;
};

0 comments on commit 3e91886

Please sign in to comment.