Cocoa Port: Refactor a few things.

This commit is contained in:
rogerman 2022-04-29 12:04:49 -07:00
parent ba630ee278
commit 0e42f772bc
7 changed files with 130 additions and 109 deletions

View File

@ -63,8 +63,8 @@ ClientDisplayPresenter::~ClientDisplayPresenter()
void ClientDisplayPresenter::__InstanceInit(const ClientDisplayPresenterProperties &props)
{
_stagedProperty = props;
_renderProperty = _stagedProperty;
_propsPending = props;
_propsApplied = _propsPending;
_useDeposterize = false;
_pixelScaler = VideoFilterTypeID_None;
@ -265,14 +265,14 @@ void ClientDisplayPresenter::_UpdateClientSize()
void ClientDisplayPresenter::_UpdateViewScale()
{
double checkWidth = this->_renderProperty.normalWidth;
double checkHeight = this->_renderProperty.normalHeight;
ClientDisplayPresenter::ConvertNormalToTransformedBounds(1.0, this->_renderProperty.rotation, checkWidth, checkHeight);
this->_renderProperty.viewScale = ClientDisplayPresenter::GetMaxScalarWithinBounds(checkWidth, checkHeight, this->_renderProperty.clientWidth, this->_renderProperty.clientHeight);
double checkWidth = this->_propsApplied.normalWidth;
double checkHeight = this->_propsApplied.normalHeight;
ClientDisplayPresenter::ConvertNormalToTransformedBounds(1.0, this->_propsApplied.rotation, checkWidth, checkHeight);
this->_propsApplied.viewScale = ClientDisplayPresenter::GetMaxScalarWithinBounds(checkWidth, checkHeight, this->_propsApplied.clientWidth, this->_propsApplied.clientHeight);
const double logicalClientWidth = this->_renderProperty.clientWidth / this->_scaleFactor;
const double logicalClientWidth = this->_propsApplied.clientWidth / this->_scaleFactor;
this->_hudObjectScale = logicalClientWidth / this->_renderProperty.normalWidth;
this->_hudObjectScale = logicalClientWidth / this->_propsApplied.normalWidth;
if (this->_hudObjectScale > 1.74939175)
{
// If the view scale is <= 1.74939175, we scale the HUD objects linearly. Otherwise, we scale
@ -286,30 +286,30 @@ void ClientDisplayPresenter::_UpdateViewScale()
// NDS screen layout
const ClientDisplayPresenterProperties& ClientDisplayPresenter::GetPresenterProperties() const
{
return this->_renderProperty;
return this->_propsApplied;
}
void ClientDisplayPresenter::CommitPresenterProperties(const ClientDisplayPresenterProperties &props)
{
this->_stagedProperty = props;
this->_propsPending = props;
}
void ClientDisplayPresenter::SetupPresenterProperties()
{
// Validate the staged properties.
this->_stagedProperty.gapDistance = (double)DS_DISPLAY_UNSCALED_GAP * this->_stagedProperty.gapScale;
ClientDisplayPresenter::CalculateNormalSize(this->_stagedProperty.mode, this->_stagedProperty.layout, this->_stagedProperty.gapScale, this->_stagedProperty.normalWidth, this->_stagedProperty.normalHeight);
this->_propsPending.gapDistance = (double)DS_DISPLAY_UNSCALED_GAP * this->_propsPending.gapScale;
ClientDisplayPresenter::CalculateNormalSize(this->_propsPending.mode, this->_propsPending.layout, this->_propsPending.gapScale, this->_propsPending.normalWidth, this->_propsPending.normalHeight);
const bool didNormalSizeChange = (this->_renderProperty.mode != this->_stagedProperty.mode) ||
(this->_renderProperty.layout != this->_stagedProperty.layout) ||
(this->_renderProperty.gapScale != this->_stagedProperty.gapScale);
const bool didNormalSizeChange = (this->_propsApplied.mode != this->_propsPending.mode) ||
(this->_propsApplied.layout != this->_propsPending.layout) ||
(this->_propsApplied.gapScale != this->_propsPending.gapScale);
const bool didOrderChange = (this->_renderProperty.order != this->_stagedProperty.order);
const bool didRotationChange = (this->_renderProperty.rotation != this->_stagedProperty.rotation);
const bool didClientSizeChange = (this->_renderProperty.clientWidth != this->_stagedProperty.clientWidth) || (this->_renderProperty.clientHeight != this->_stagedProperty.clientHeight);
const bool didOrderChange = (this->_propsApplied.order != this->_propsPending.order);
const bool didRotationChange = (this->_propsApplied.rotation != this->_propsPending.rotation);
const bool didClientSizeChange = (this->_propsApplied.clientWidth != this->_propsPending.clientWidth) || (this->_propsApplied.clientHeight != this->_propsPending.clientHeight);
// Copy the staged properties to the current rendering properties.
this->_renderProperty = this->_stagedProperty;
this->_propsApplied = this->_propsPending;
// Update internal states based on the new render properties
this->_UpdateViewScale();
@ -346,37 +346,37 @@ void ClientDisplayPresenter::SetupPresenterProperties()
double ClientDisplayPresenter::GetRotation() const
{
return this->_renderProperty.rotation;
return this->_propsApplied.rotation;
}
double ClientDisplayPresenter::GetViewScale() const
{
return this->_renderProperty.viewScale;
return this->_propsApplied.viewScale;
}
ClientDisplayMode ClientDisplayPresenter::GetMode() const
{
return this->_renderProperty.mode;
return this->_propsApplied.mode;
}
ClientDisplayLayout ClientDisplayPresenter::GetLayout() const
{
return this->_renderProperty.layout;
return this->_propsApplied.layout;
}
ClientDisplayOrder ClientDisplayPresenter::GetOrder() const
{
return this->_renderProperty.order;
return this->_propsApplied.order;
}
double ClientDisplayPresenter::GetGapScale() const
{
return this->_renderProperty.gapScale;
return this->_propsApplied.gapScale;
}
double ClientDisplayPresenter::GetGapDistance() const
{
return this->_renderProperty.gapDistance;
return this->_propsApplied.gapDistance;
}
ClientDisplaySource ClientDisplayPresenter::GetDisplayVideoSource(const NDSDisplayID displayID) const
@ -942,8 +942,8 @@ void ClientDisplayPresenter::LoadDisplays()
break;
}
const bool loadMainScreen = this->_isSelectedDisplayEnabled[NDSDisplayID_Main] && ((this->_renderProperty.mode == ClientDisplayMode_Main) || (this->_renderProperty.mode == ClientDisplayMode_Dual));
const bool loadTouchScreen = this->_isSelectedDisplayEnabled[NDSDisplayID_Touch] && ((this->_renderProperty.mode == ClientDisplayMode_Touch) || (this->_renderProperty.mode == ClientDisplayMode_Dual)) && (this->_selectedSourceForDisplay[NDSDisplayID_Main] != this->_selectedSourceForDisplay[NDSDisplayID_Touch]);
const bool loadMainScreen = this->_isSelectedDisplayEnabled[NDSDisplayID_Main] && ((this->_propsApplied.mode == ClientDisplayMode_Main) || (this->_propsApplied.mode == ClientDisplayMode_Dual));
const bool loadTouchScreen = this->_isSelectedDisplayEnabled[NDSDisplayID_Touch] && ((this->_propsApplied.mode == ClientDisplayMode_Touch) || (this->_propsApplied.mode == ClientDisplayMode_Dual)) && (this->_selectedSourceForDisplay[NDSDisplayID_Main] != this->_selectedSourceForDisplay[NDSDisplayID_Touch]);
if (loadMainScreen)
{
@ -1647,16 +1647,16 @@ void ClientDisplay3DPresenter::SetHUDTouchLinePositionVertices(float *vtxBufferP
{
const float x = (this->_ndsFrameInfo.inputStatesApplied.Touch == 0) ? this->_ndsFrameInfo.touchLocXApplied : this->_ndsFrameInfo.touchLocXPending;
const float y = 191.0f - ((this->_ndsFrameInfo.inputStatesApplied.Touch == 0) ? this->_ndsFrameInfo.touchLocYApplied : this->_ndsFrameInfo.touchLocYPending);
const float w = this->_renderProperty.normalWidth / 2.0f;
const float h = this->_renderProperty.normalHeight / 2.0f;
const float w = this->_propsApplied.normalWidth / 2.0f;
const float h = this->_propsApplied.normalHeight / 2.0f;
if (this->_renderProperty.mode == ClientDisplayMode_Dual)
if (this->_propsApplied.mode == ClientDisplayMode_Dual)
{
switch (this->_renderProperty.layout)
switch (this->_propsApplied.layout)
{
case ClientDisplayLayout_Horizontal:
{
if (this->_renderProperty.order == ClientDisplayOrder_MainFirst)
if (this->_propsApplied.order == ClientDisplayOrder_MainFirst)
{
vtxBufferPtr[0] = x; vtxBufferPtr[1] = h; // Vertical line, top left
vtxBufferPtr[2] = x + 1.0f; vtxBufferPtr[3] = h; // Vertical line, top right
@ -1697,7 +1697,7 @@ void ClientDisplay3DPresenter::SetHUDTouchLinePositionVertices(float *vtxBufferP
vtxBufferPtr[12] = w; vtxBufferPtr[13] = -h + (y/2.0f); // Minor bottom display, horizontal line, bottom right
vtxBufferPtr[14] = -w + (float)GPU_FRAMEBUFFER_NATIVE_WIDTH; vtxBufferPtr[15] = -h + (y/2.0f); // Minor bottom display, horizontal line, bottom left
if (this->_renderProperty.order == ClientDisplayOrder_MainFirst)
if (this->_propsApplied.order == ClientDisplayOrder_MainFirst)
{
memcpy(vtxBufferPtr + (2 * 8), vtxBufferPtr + (0 * 8), sizeof(float) * (2 * 8)); // Unused lines
}
@ -1728,7 +1728,7 @@ void ClientDisplay3DPresenter::SetHUDTouchLinePositionVertices(float *vtxBufferP
vtxBufferPtr[12] = w; vtxBufferPtr[13] = -h + (y/3.0f); // Minor bottom display, horizontal line, bottom right
vtxBufferPtr[14] = -w + (float)GPU_FRAMEBUFFER_NATIVE_WIDTH; vtxBufferPtr[15] = -h + (y/3.0f); // Minor bottom display, horizontal line, bottom left
if (this->_renderProperty.order == ClientDisplayOrder_MainFirst)
if (this->_propsApplied.order == ClientDisplayOrder_MainFirst)
{
memcpy(vtxBufferPtr + (2 * 8), vtxBufferPtr + (0 * 8), sizeof(float) * (2 * 8)); // Unused lines
}
@ -1759,7 +1759,7 @@ void ClientDisplay3DPresenter::SetHUDTouchLinePositionVertices(float *vtxBufferP
vtxBufferPtr[12] = w; vtxBufferPtr[13] = -h + (y/5.0f); // Minor bottom display, horizontal line, bottom right
vtxBufferPtr[14] = -w + (float)GPU_FRAMEBUFFER_NATIVE_WIDTH; vtxBufferPtr[15] = -h + (y/5.0f); // Minor bottom display, horizontal line, bottom left
if (this->_renderProperty.order == ClientDisplayOrder_MainFirst)
if (this->_propsApplied.order == ClientDisplayOrder_MainFirst)
{
memcpy(vtxBufferPtr + (2 * 8), vtxBufferPtr + (0 * 8), sizeof(float) * (2 * 8)); // Unused lines
}
@ -1780,9 +1780,9 @@ void ClientDisplay3DPresenter::SetHUDTouchLinePositionVertices(float *vtxBufferP
default: // Default to vertical orientation.
{
const float g = (float)this->_renderProperty.gapDistance;
const float g = (float)this->_propsApplied.gapDistance;
if (this->_renderProperty.order == ClientDisplayOrder_MainFirst)
if (this->_propsApplied.order == ClientDisplayOrder_MainFirst)
{
vtxBufferPtr[0] = -w + x; vtxBufferPtr[1] = -g/2.0f; // Vertical line, top left
vtxBufferPtr[2] = -w + x + 1.0f; vtxBufferPtr[3] = -g/2.0f; // Vertical line, top right
@ -2053,13 +2053,13 @@ void ClientDisplay3DPresenter::SetHUDTextureCoordinates(float *texCoordBufferPtr
void ClientDisplay3DPresenter::SetScreenVertices(float *vtxBufferPtr)
{
const float w = this->_renderProperty.normalWidth / 2.0f;
const float h = this->_renderProperty.normalHeight / 2.0f;
const size_t f = (this->_renderProperty.order == ClientDisplayOrder_MainFirst) ? 0 : 8;
const float w = this->_propsApplied.normalWidth / 2.0f;
const float h = this->_propsApplied.normalHeight / 2.0f;
const size_t f = (this->_propsApplied.order == ClientDisplayOrder_MainFirst) ? 0 : 8;
if (this->_renderProperty.mode == ClientDisplayMode_Dual)
if (this->_propsApplied.mode == ClientDisplayMode_Dual)
{
switch (this->_renderProperty.layout)
switch (this->_propsApplied.layout)
{
case ClientDisplayLayout_Horizontal:
{
@ -2100,7 +2100,7 @@ void ClientDisplay3DPresenter::SetScreenVertices(float *vtxBufferPtr)
case ClientDisplayLayout_Hybrid_16_9:
{
const float g = (float)this->_renderProperty.gapDistance * (this->_renderProperty.normalWidth - (float)GPU_FRAMEBUFFER_NATIVE_WIDTH) / (float)GPU_FRAMEBUFFER_NATIVE_WIDTH;
const float g = (float)this->_propsApplied.gapDistance * (this->_propsApplied.normalWidth - (float)GPU_FRAMEBUFFER_NATIVE_WIDTH) / (float)GPU_FRAMEBUFFER_NATIVE_WIDTH;
vtxBufferPtr[0] = -w + (float)GPU_FRAMEBUFFER_NATIVE_WIDTH; vtxBufferPtr[1] = -h + g + (64.0f * 2.0f); // Minor top display, top left
vtxBufferPtr[2] = w; vtxBufferPtr[3] = -h + g + (64.0f * 2.0f); // Minor top display, top right
@ -2123,7 +2123,7 @@ void ClientDisplay3DPresenter::SetScreenVertices(float *vtxBufferPtr)
case ClientDisplayLayout_Hybrid_16_10:
{
const float g = (float)this->_renderProperty.gapDistance * (this->_renderProperty.normalWidth - (float)GPU_FRAMEBUFFER_NATIVE_WIDTH) / (float)GPU_FRAMEBUFFER_NATIVE_WIDTH;
const float g = (float)this->_propsApplied.gapDistance * (this->_propsApplied.normalWidth - (float)GPU_FRAMEBUFFER_NATIVE_WIDTH) / (float)GPU_FRAMEBUFFER_NATIVE_WIDTH;
vtxBufferPtr[0] = -w + (float)GPU_FRAMEBUFFER_NATIVE_WIDTH; vtxBufferPtr[1] = -h + g + (38.4f * 2.0f); // Minor top display, top left
vtxBufferPtr[2] = w; vtxBufferPtr[3] = -h + g + (38.4f * 2.0f); // Minor top display, top right
@ -2146,7 +2146,7 @@ void ClientDisplay3DPresenter::SetScreenVertices(float *vtxBufferPtr)
default: // Default to vertical orientation.
{
const float g = (float)this->_renderProperty.gapDistance;
const float g = (float)this->_propsApplied.gapDistance;
vtxBufferPtr[0+f] = -w; vtxBufferPtr[1+f] = h; // Top display, top left
vtxBufferPtr[2+f] = w; vtxBufferPtr[3+f] = h; // Top display, top right

View File

@ -139,8 +139,8 @@ private:
void __InstanceInit(const ClientDisplayPresenterProperties &props);
protected:
ClientDisplayPresenterProperties _renderProperty;
ClientDisplayPresenterProperties _stagedProperty;
ClientDisplayPresenterProperties _propsPending;
ClientDisplayPresenterProperties _propsApplied;
GPUClientFetchObject *_fetchObject;
bool _useDeposterize;

View File

@ -1198,72 +1198,84 @@ void ClientExecutionControl::ApplySettingsOnNDSExec()
}
}
void ClientExecutionControl::FetchOutputPostNDSExec()
void ClientExecutionControl::GenerateNDSFrameInfo(ClientInputHandler *inputHandler, NDSFrameInfo &outInfo)
{
pthread_mutex_lock(&this->_mutexOutputPostNDSExec);
outInfo.frameIndex = currFrameCounter;
outInfo.render3DFPS = GPU->GetFPSRender3D();
outInfo.lagFrameCount = TotalLagFrames;
this->_ndsFrameInfo.frameIndex = currFrameCounter;
this->_ndsFrameInfo.render3DFPS = GPU->GetFPSRender3D();
this->_ndsFrameInfo.lagFrameCount = TotalLagFrames;
if ((this->_ndsFrameInfo.frameIndex & 0xF) == 0xF)
if ((outInfo.frameIndex & 0xF) == 0xF)
{
NDS_GetCPULoadAverage(this->_ndsFrameInfo.cpuLoadAvgARM9, this->_ndsFrameInfo.cpuLoadAvgARM7);
NDS_GetCPULoadAverage(outInfo.cpuLoadAvgARM9, outInfo.cpuLoadAvgARM7);
}
char *tempBuffer = (char *)calloc(25, sizeof(char));
rtcGetTimeAsString(tempBuffer);
this->_ndsFrameInfo.rtcString = tempBuffer;
outInfo.rtcString = std::string(tempBuffer);
free(tempBuffer);
this->_ndsFrameInfo.inputStatesApplied.value = INPUT_STATES_CLEAR_VALUE;
ClientExecutionControl::UpdateNDSFrameInfoInput(inputHandler, outInfo);
}
void ClientExecutionControl::UpdateNDSFrameInfoInput(ClientInputHandler *inputHandler, NDSFrameInfo &outInfo)
{
outInfo.inputStatesApplied.value = INPUT_STATES_CLEAR_VALUE;
if (this->_inputHandler != NULL)
if (inputHandler == NULL)
{
const ClientInput *appliedInput = this->_inputHandler->GetClientInputsApplied();
this->_ndsFrameInfo.inputStatesApplied.A = (appliedInput[NDSInputID_A].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.B = (appliedInput[NDSInputID_B].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.Select = (appliedInput[NDSInputID_Select].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.Start = (appliedInput[NDSInputID_Start].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.Right = (appliedInput[NDSInputID_Right].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.Left = (appliedInput[NDSInputID_Left].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.Up = (appliedInput[NDSInputID_Up].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.Down = (appliedInput[NDSInputID_Down].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.R = (appliedInput[NDSInputID_R].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.L = (appliedInput[NDSInputID_L].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.X = (appliedInput[NDSInputID_X].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.Y = (appliedInput[NDSInputID_Y].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.Debug = (appliedInput[NDSInputID_Debug].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.Touch = (appliedInput[NDSInputID_Touch].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.Lid = (appliedInput[NDSInputID_Lid].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.PianoC = (appliedInput[NDSInputID_Piano_C].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.PianoCSharp = (appliedInput[NDSInputID_Piano_CSharp].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.PianoD = (appliedInput[NDSInputID_Piano_D].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.PianoDSharp = (appliedInput[NDSInputID_Piano_DSharp].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.PianoE = (appliedInput[NDSInputID_Piano_E].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.PianoF = (appliedInput[NDSInputID_Piano_F].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.PianoFSharp = (appliedInput[NDSInputID_Piano_FSharp].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.PianoG = (appliedInput[NDSInputID_Piano_G].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.PianoGSharp = (appliedInput[NDSInputID_Piano_GSharp].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.PianoA = (appliedInput[NDSInputID_Piano_A].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.PianoASharp = (appliedInput[NDSInputID_Piano_ASharp].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.PianoB = (appliedInput[NDSInputID_Piano_B].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.PianoHighC = (appliedInput[NDSInputID_Piano_HighC].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.GuitarGripBlue = (appliedInput[NDSInputID_GuitarGrip_Blue].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.GuitarGripYellow = (appliedInput[NDSInputID_GuitarGrip_Yellow].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.GuitarGripRed = (appliedInput[NDSInputID_GuitarGrip_Red].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.GuitarGripGreen = (appliedInput[NDSInputID_GuitarGrip_Green].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.Paddle = (appliedInput[NDSInputID_Paddle].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.Microphone = (appliedInput[NDSInputID_Microphone].isPressed) ? 0 : 1;
this->_ndsFrameInfo.inputStatesApplied.Reset = (appliedInput[NDSInputID_Reset].isPressed) ? 0 : 1;
this->_ndsFrameInfo.touchLocXApplied = this->_inputHandler->GetTouchLocXApplied();
this->_ndsFrameInfo.touchLocYApplied = this->_inputHandler->GetTouchLocYApplied();
this->_ndsFrameInfo.touchPressureApplied = this->_inputHandler->GetTouchPressureApplied();
this->_ndsFrameInfo.paddleValueApplied = this->_inputHandler->GetPaddleValueApplied();
this->_ndsFrameInfo.paddleAdjustApplied = this->_inputHandler->GetPaddleAdjustApplied();
// If the passed in input handler is NULL then this method has
// the effect of clearing the input states of the NDS frame info.
return;
}
const ClientInput *appliedInput = inputHandler->GetClientInputsApplied();
outInfo.inputStatesApplied.A = (appliedInput[NDSInputID_A].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.B = (appliedInput[NDSInputID_B].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.Select = (appliedInput[NDSInputID_Select].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.Start = (appliedInput[NDSInputID_Start].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.Right = (appliedInput[NDSInputID_Right].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.Left = (appliedInput[NDSInputID_Left].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.Up = (appliedInput[NDSInputID_Up].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.Down = (appliedInput[NDSInputID_Down].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.R = (appliedInput[NDSInputID_R].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.L = (appliedInput[NDSInputID_L].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.X = (appliedInput[NDSInputID_X].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.Y = (appliedInput[NDSInputID_Y].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.Debug = (appliedInput[NDSInputID_Debug].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.Touch = (appliedInput[NDSInputID_Touch].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.Lid = (appliedInput[NDSInputID_Lid].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.PianoC = (appliedInput[NDSInputID_Piano_C].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.PianoCSharp = (appliedInput[NDSInputID_Piano_CSharp].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.PianoD = (appliedInput[NDSInputID_Piano_D].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.PianoDSharp = (appliedInput[NDSInputID_Piano_DSharp].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.PianoE = (appliedInput[NDSInputID_Piano_E].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.PianoF = (appliedInput[NDSInputID_Piano_F].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.PianoFSharp = (appliedInput[NDSInputID_Piano_FSharp].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.PianoG = (appliedInput[NDSInputID_Piano_G].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.PianoGSharp = (appliedInput[NDSInputID_Piano_GSharp].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.PianoA = (appliedInput[NDSInputID_Piano_A].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.PianoASharp = (appliedInput[NDSInputID_Piano_ASharp].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.PianoB = (appliedInput[NDSInputID_Piano_B].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.PianoHighC = (appliedInput[NDSInputID_Piano_HighC].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.GuitarGripBlue = (appliedInput[NDSInputID_GuitarGrip_Blue].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.GuitarGripYellow = (appliedInput[NDSInputID_GuitarGrip_Yellow].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.GuitarGripRed = (appliedInput[NDSInputID_GuitarGrip_Red].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.GuitarGripGreen = (appliedInput[NDSInputID_GuitarGrip_Green].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.Paddle = (appliedInput[NDSInputID_Paddle].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.Microphone = (appliedInput[NDSInputID_Microphone].isPressed) ? 0 : 1;
outInfo.inputStatesApplied.Reset = (appliedInput[NDSInputID_Reset].isPressed) ? 0 : 1;
outInfo.touchLocXApplied = inputHandler->GetTouchLocXApplied();
outInfo.touchLocYApplied = inputHandler->GetTouchLocYApplied();
outInfo.touchPressureApplied = inputHandler->GetTouchPressureApplied();
outInfo.paddleValueApplied = inputHandler->GetPaddleValueApplied();
outInfo.paddleAdjustApplied = inputHandler->GetPaddleAdjustApplied();
}
void ClientExecutionControl::FetchOutputPostNDSExec()
{
pthread_mutex_lock(&this->_mutexOutputPostNDSExec);
ClientExecutionControl::GenerateNDSFrameInfo(this->_inputHandler, this->_ndsFrameInfo);
pthread_mutex_unlock(&this->_mutexOutputPostNDSExec);
}

View File

@ -378,6 +378,8 @@ public:
void FetchOutputPostNDSExec();
const NDSFrameInfo& GetNDSFrameInfo();
static void GenerateNDSFrameInfo(ClientInputHandler *inputHandler, NDSFrameInfo &outInfo);
static void UpdateNDSFrameInfoInput(ClientInputHandler *inputHandler, NDSFrameInfo &outInfo);
void SetFrameInfoExecutionSpeed(double executionSpeed);
uint64_t GetFrameIndex();

View File

@ -4987,8 +4987,8 @@ void OGLVideoOutput::_UpdateRotation()
void OGLVideoOutput::_UpdateClientSize()
{
this->_viewportWidth = (GLsizei)(this->_renderProperty.clientWidth + 0.0001);
this->_viewportHeight = (GLsizei)(this->_renderProperty.clientHeight + 0.0001);
this->_viewportWidth = (GLsizei)(this->_propsApplied.clientWidth + 0.0001);
this->_viewportHeight = (GLsizei)(this->_propsApplied.clientHeight + 0.0001);
this->_needUpdateViewport = true;
this->GetHUDLayer()->SetNeedsUpdateVertices();
@ -5199,9 +5199,9 @@ void OGLVideoOutput::CopyFrameToBuffer(uint32_t *dstBuffer)
this->RenderFrameOGL(true);
#ifdef MSB_FIRST
glReadPixels(0, 0, this->_renderProperty.clientWidth, this->_renderProperty.clientHeight, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, dstBuffer);
glReadPixels(0, 0, this->_propsApplied.clientWidth, this->_propsApplied.clientHeight, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, dstBuffer);
#else
glReadPixels(0, 0, this->_renderProperty.clientWidth, this->_renderProperty.clientHeight, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, dstBuffer);
glReadPixels(0, 0, this->_propsApplied.clientWidth, this->_propsApplied.clientHeight, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, dstBuffer);
#endif
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

View File

@ -1056,7 +1056,7 @@ GPU3DInterface *core3DList[GPU_3D_RENDERER_COUNT+1] = {
#ifdef ENABLE_ASYNC_FETCH
const u8 bufferIndex = GPU->GetDisplayInfo().bufferIndex;
((MacGPUFetchObjectAsync *)fetchObject)->SignalFetchAtIndex(bufferIndex, MESSAGE_FETCH_AND_PUSH_VIDEO);
((MacGPUFetchObjectAsync *)fetchObject)->SignalFetchAtIndex(bufferIndex, MESSAGE_FETCH_AND_PERFORM_ACTIONS);
#endif
}
@ -1317,8 +1317,14 @@ void MacGPUFetchObjectAsync::RunFetchLoop()
pthread_cond_wait(&this->_condSignalFetch, &this->_mutexFetchExecute);
}
const uint32_t lastMessageID = this->_threadMessageID;
this->FetchFromBufferIndex(this->_fetchIndex);
this->DoPostFetchActions();
if (lastMessageID == MESSAGE_FETCH_AND_PERFORM_ACTIONS)
{
this->DoPostFetchActions();
}
this->_threadMessageID = MESSAGE_NONE;
[tempPool release];
@ -1716,7 +1722,7 @@ void GPUEventHandlerOSX::DidFrameEnd(bool isFrameSkipped, const NDSDisplayInfo &
if (!isFrameSkipped)
{
asyncFetchObj->SignalFetchAtIndex(latestDisplayInfo.bufferIndex, MESSAGE_FETCH_AND_PUSH_VIDEO);
asyncFetchObj->SignalFetchAtIndex(latestDisplayInfo.bufferIndex, MESSAGE_FETCH_AND_PERFORM_ACTIONS);
}
}

View File

@ -354,7 +354,8 @@ enum
MESSAGE_SET_EMULATION_FLAGS,
// Video Messages
MESSAGE_FETCH_AND_PUSH_VIDEO,
MESSAGE_FETCH_ONLY,
MESSAGE_FETCH_AND_PERFORM_ACTIONS,
MESSAGE_RECEIVE_GPU_FRAME,
MESSAGE_CHANGE_VIEW_PROPERTIES,
MESSAGE_REDRAW_VIEW,