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) void ClientDisplayPresenter::__InstanceInit(const ClientDisplayPresenterProperties &props)
{ {
_stagedProperty = props; _propsPending = props;
_renderProperty = _stagedProperty; _propsApplied = _propsPending;
_useDeposterize = false; _useDeposterize = false;
_pixelScaler = VideoFilterTypeID_None; _pixelScaler = VideoFilterTypeID_None;
@ -265,14 +265,14 @@ void ClientDisplayPresenter::_UpdateClientSize()
void ClientDisplayPresenter::_UpdateViewScale() void ClientDisplayPresenter::_UpdateViewScale()
{ {
double checkWidth = this->_renderProperty.normalWidth; double checkWidth = this->_propsApplied.normalWidth;
double checkHeight = this->_renderProperty.normalHeight; double checkHeight = this->_propsApplied.normalHeight;
ClientDisplayPresenter::ConvertNormalToTransformedBounds(1.0, this->_renderProperty.rotation, checkWidth, checkHeight); ClientDisplayPresenter::ConvertNormalToTransformedBounds(1.0, this->_propsApplied.rotation, checkWidth, checkHeight);
this->_renderProperty.viewScale = ClientDisplayPresenter::GetMaxScalarWithinBounds(checkWidth, checkHeight, this->_renderProperty.clientWidth, this->_renderProperty.clientHeight); 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 (this->_hudObjectScale > 1.74939175)
{ {
// If the view scale is <= 1.74939175, we scale the HUD objects linearly. Otherwise, we scale // 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 // NDS screen layout
const ClientDisplayPresenterProperties& ClientDisplayPresenter::GetPresenterProperties() const const ClientDisplayPresenterProperties& ClientDisplayPresenter::GetPresenterProperties() const
{ {
return this->_renderProperty; return this->_propsApplied;
} }
void ClientDisplayPresenter::CommitPresenterProperties(const ClientDisplayPresenterProperties &props) void ClientDisplayPresenter::CommitPresenterProperties(const ClientDisplayPresenterProperties &props)
{ {
this->_stagedProperty = props; this->_propsPending = props;
} }
void ClientDisplayPresenter::SetupPresenterProperties() void ClientDisplayPresenter::SetupPresenterProperties()
{ {
// Validate the staged properties. // Validate the staged properties.
this->_stagedProperty.gapDistance = (double)DS_DISPLAY_UNSCALED_GAP * this->_stagedProperty.gapScale; this->_propsPending.gapDistance = (double)DS_DISPLAY_UNSCALED_GAP * this->_propsPending.gapScale;
ClientDisplayPresenter::CalculateNormalSize(this->_stagedProperty.mode, this->_stagedProperty.layout, this->_stagedProperty.gapScale, this->_stagedProperty.normalWidth, this->_stagedProperty.normalHeight); 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) || const bool didNormalSizeChange = (this->_propsApplied.mode != this->_propsPending.mode) ||
(this->_renderProperty.layout != this->_stagedProperty.layout) || (this->_propsApplied.layout != this->_propsPending.layout) ||
(this->_renderProperty.gapScale != this->_stagedProperty.gapScale); (this->_propsApplied.gapScale != this->_propsPending.gapScale);
const bool didOrderChange = (this->_renderProperty.order != this->_stagedProperty.order); const bool didOrderChange = (this->_propsApplied.order != this->_propsPending.order);
const bool didRotationChange = (this->_renderProperty.rotation != this->_stagedProperty.rotation); const bool didRotationChange = (this->_propsApplied.rotation != this->_propsPending.rotation);
const bool didClientSizeChange = (this->_renderProperty.clientWidth != this->_stagedProperty.clientWidth) || (this->_renderProperty.clientHeight != this->_stagedProperty.clientHeight); const bool didClientSizeChange = (this->_propsApplied.clientWidth != this->_propsPending.clientWidth) || (this->_propsApplied.clientHeight != this->_propsPending.clientHeight);
// Copy the staged properties to the current rendering properties. // 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 // Update internal states based on the new render properties
this->_UpdateViewScale(); this->_UpdateViewScale();
@ -346,37 +346,37 @@ void ClientDisplayPresenter::SetupPresenterProperties()
double ClientDisplayPresenter::GetRotation() const double ClientDisplayPresenter::GetRotation() const
{ {
return this->_renderProperty.rotation; return this->_propsApplied.rotation;
} }
double ClientDisplayPresenter::GetViewScale() const double ClientDisplayPresenter::GetViewScale() const
{ {
return this->_renderProperty.viewScale; return this->_propsApplied.viewScale;
} }
ClientDisplayMode ClientDisplayPresenter::GetMode() const ClientDisplayMode ClientDisplayPresenter::GetMode() const
{ {
return this->_renderProperty.mode; return this->_propsApplied.mode;
} }
ClientDisplayLayout ClientDisplayPresenter::GetLayout() const ClientDisplayLayout ClientDisplayPresenter::GetLayout() const
{ {
return this->_renderProperty.layout; return this->_propsApplied.layout;
} }
ClientDisplayOrder ClientDisplayPresenter::GetOrder() const ClientDisplayOrder ClientDisplayPresenter::GetOrder() const
{ {
return this->_renderProperty.order; return this->_propsApplied.order;
} }
double ClientDisplayPresenter::GetGapScale() const double ClientDisplayPresenter::GetGapScale() const
{ {
return this->_renderProperty.gapScale; return this->_propsApplied.gapScale;
} }
double ClientDisplayPresenter::GetGapDistance() const double ClientDisplayPresenter::GetGapDistance() const
{ {
return this->_renderProperty.gapDistance; return this->_propsApplied.gapDistance;
} }
ClientDisplaySource ClientDisplayPresenter::GetDisplayVideoSource(const NDSDisplayID displayID) const ClientDisplaySource ClientDisplayPresenter::GetDisplayVideoSource(const NDSDisplayID displayID) const
@ -942,8 +942,8 @@ void ClientDisplayPresenter::LoadDisplays()
break; break;
} }
const bool loadMainScreen = this->_isSelectedDisplayEnabled[NDSDisplayID_Main] && ((this->_renderProperty.mode == ClientDisplayMode_Main) || (this->_renderProperty.mode == ClientDisplayMode_Dual)); 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->_renderProperty.mode == ClientDisplayMode_Touch) || (this->_renderProperty.mode == ClientDisplayMode_Dual)) && (this->_selectedSourceForDisplay[NDSDisplayID_Main] != this->_selectedSourceForDisplay[NDSDisplayID_Touch]); 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) 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 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 y = 191.0f - ((this->_ndsFrameInfo.inputStatesApplied.Touch == 0) ? this->_ndsFrameInfo.touchLocYApplied : this->_ndsFrameInfo.touchLocYPending);
const float w = this->_renderProperty.normalWidth / 2.0f; const float w = this->_propsApplied.normalWidth / 2.0f;
const float h = this->_renderProperty.normalHeight / 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: 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[0] = x; vtxBufferPtr[1] = h; // Vertical line, top left
vtxBufferPtr[2] = x + 1.0f; vtxBufferPtr[3] = h; // Vertical line, top right 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[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 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 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[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 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 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[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 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 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. 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[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 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) void ClientDisplay3DPresenter::SetScreenVertices(float *vtxBufferPtr)
{ {
const float w = this->_renderProperty.normalWidth / 2.0f; const float w = this->_propsApplied.normalWidth / 2.0f;
const float h = this->_renderProperty.normalHeight / 2.0f; const float h = this->_propsApplied.normalHeight / 2.0f;
const size_t f = (this->_renderProperty.order == ClientDisplayOrder_MainFirst) ? 0 : 8; 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: case ClientDisplayLayout_Horizontal:
{ {
@ -2100,7 +2100,7 @@ void ClientDisplay3DPresenter::SetScreenVertices(float *vtxBufferPtr)
case ClientDisplayLayout_Hybrid_16_9: 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[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 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: 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[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 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. 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[0+f] = -w; vtxBufferPtr[1+f] = h; // Top display, top left
vtxBufferPtr[2+f] = w; vtxBufferPtr[3+f] = h; // Top display, top right vtxBufferPtr[2+f] = w; vtxBufferPtr[3+f] = h; // Top display, top right

View File

@ -139,8 +139,8 @@ private:
void __InstanceInit(const ClientDisplayPresenterProperties &props); void __InstanceInit(const ClientDisplayPresenterProperties &props);
protected: protected:
ClientDisplayPresenterProperties _renderProperty; ClientDisplayPresenterProperties _propsPending;
ClientDisplayPresenterProperties _stagedProperty; ClientDisplayPresenterProperties _propsApplied;
GPUClientFetchObject *_fetchObject; GPUClientFetchObject *_fetchObject;
bool _useDeposterize; 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; if ((outInfo.frameIndex & 0xF) == 0xF)
this->_ndsFrameInfo.render3DFPS = GPU->GetFPSRender3D();
this->_ndsFrameInfo.lagFrameCount = TotalLagFrames;
if ((this->_ndsFrameInfo.frameIndex & 0xF) == 0xF)
{ {
NDS_GetCPULoadAverage(this->_ndsFrameInfo.cpuLoadAvgARM9, this->_ndsFrameInfo.cpuLoadAvgARM7); NDS_GetCPULoadAverage(outInfo.cpuLoadAvgARM9, outInfo.cpuLoadAvgARM7);
} }
char *tempBuffer = (char *)calloc(25, sizeof(char)); char *tempBuffer = (char *)calloc(25, sizeof(char));
rtcGetTimeAsString(tempBuffer); rtcGetTimeAsString(tempBuffer);
this->_ndsFrameInfo.rtcString = tempBuffer; outInfo.rtcString = std::string(tempBuffer);
free(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(); // If the passed in input handler is NULL then this method has
// the effect of clearing the input states of the NDS frame info.
this->_ndsFrameInfo.inputStatesApplied.A = (appliedInput[NDSInputID_A].isPressed) ? 0 : 1; return;
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();
} }
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); pthread_mutex_unlock(&this->_mutexOutputPostNDSExec);
} }

View File

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

View File

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

View File

@ -1056,7 +1056,7 @@ GPU3DInterface *core3DList[GPU_3D_RENDERER_COUNT+1] = {
#ifdef ENABLE_ASYNC_FETCH #ifdef ENABLE_ASYNC_FETCH
const u8 bufferIndex = GPU->GetDisplayInfo().bufferIndex; 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 #endif
} }
@ -1317,8 +1317,14 @@ void MacGPUFetchObjectAsync::RunFetchLoop()
pthread_cond_wait(&this->_condSignalFetch, &this->_mutexFetchExecute); pthread_cond_wait(&this->_condSignalFetch, &this->_mutexFetchExecute);
} }
const uint32_t lastMessageID = this->_threadMessageID;
this->FetchFromBufferIndex(this->_fetchIndex); this->FetchFromBufferIndex(this->_fetchIndex);
this->DoPostFetchActions();
if (lastMessageID == MESSAGE_FETCH_AND_PERFORM_ACTIONS)
{
this->DoPostFetchActions();
}
this->_threadMessageID = MESSAGE_NONE; this->_threadMessageID = MESSAGE_NONE;
[tempPool release]; [tempPool release];
@ -1716,7 +1722,7 @@ void GPUEventHandlerOSX::DidFrameEnd(bool isFrameSkipped, const NDSDisplayInfo &
if (!isFrameSkipped) 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, MESSAGE_SET_EMULATION_FLAGS,
// Video Messages // Video Messages
MESSAGE_FETCH_AND_PUSH_VIDEO, MESSAGE_FETCH_ONLY,
MESSAGE_FETCH_AND_PERFORM_ACTIONS,
MESSAGE_RECEIVE_GPU_FRAME, MESSAGE_RECEIVE_GPU_FRAME,
MESSAGE_CHANGE_VIEW_PROPERTIES, MESSAGE_CHANGE_VIEW_PROPERTIES,
MESSAGE_REDRAW_VIEW, MESSAGE_REDRAW_VIEW,