temporary solution for 0x10 byte gpucmd alignment

fixes A LOT of gpu related issues

(temporary solution because big gpu refactor is coming soon)
This commit is contained in:
smea 2014-12-09 21:49:18 -08:00
parent 8cb3fad657
commit c282d4262e
3 changed files with 4 additions and 14 deletions

View File

@ -96,6 +96,7 @@ void GPUCMD_Finalize()
GPUCMD_AddSingleParam(0x000F0111, 0x00000001); GPUCMD_AddSingleParam(0x000F0111, 0x00000001);
GPUCMD_AddSingleParam(0x000F0110, 0x00000001); GPUCMD_AddSingleParam(0x000F0110, 0x00000001);
GPUCMD_AddSingleParam(0x000F0010, 0x12345678); GPUCMD_AddSingleParam(0x000F0010, 0x12345678);
GPUCMD_AddSingleParam(0x000F0010, 0x12345678); //not the cleanest way of guaranteeing 0x10-byte size but whatever good enough for now
} }
extern u32 gpuResetSequence[]; extern u32 gpuResetSequence[];

View File

@ -71,18 +71,6 @@ s8 SHDR_GetUniformRegister(DVLB_s* dvlb, char* name, u8 programID)
return -1; return -1;
} }
//hm
static inline u8 minu8(u8 a, u8 b)
{
if(a<b)return a;
return b;
}
static inline u8 maxu8(u8 a, u8 b)
{
if(a<b)return b;
return a;
}
void DVLP_SendCode(DVLP_s* dvlp) void DVLP_SendCode(DVLP_s* dvlp)
{ {
if(!dvlp)return; if(!dvlp)return;
@ -90,8 +78,7 @@ void DVLP_SendCode(DVLP_s* dvlp)
GPUCMD_AddSingleParam(0x000F02CB, 0x00000000); GPUCMD_AddSingleParam(0x000F02CB, 0x00000000);
int i; int i;
// for(i=0;i<dvlp->codeSize;i+=0x80)GPUCMD_Add(0x000F02CC, &dvlp->codeData[i], ((dvlp->codeSize-i)<0x80)?(dvlp->codeSize-i):0x80); for(i=0;i<dvlp->codeSize;i+=0x80)GPUCMD_Add(0x000F02CC, &dvlp->codeData[i], ((dvlp->codeSize-i)<0x80)?(dvlp->codeSize-i):0x80);
for(i=0;i<dvlp->codeSize;i+=0x80)GPUCMD_Add(0x000F02CC, &dvlp->codeData[i], maxu8(minu8(dvlp->codeSize-i,0x80),0x37)); //not sure why, but anything smaller than 0x37 seems to break stuff atm...
GPUCMD_AddSingleParam(0x000F02BF, 0x00000001); GPUCMD_AddSingleParam(0x000F02BF, 0x00000001);
} }

View File

@ -10,6 +10,7 @@
Handle gspGpuHandle=0; Handle gspGpuHandle=0;
Handle gspEvents[GSPEVENT_MAX]; Handle gspEvents[GSPEVENT_MAX];
u32 gspEventCounts[GSPEVENT_MAX];
u64 gspEventStack[GSP_EVENT_STACK_SIZE/sizeof(u64)]; //u64 so that it's 8-byte aligned u64 gspEventStack[GSP_EVENT_STACK_SIZE/sizeof(u64)]; //u64 so that it's 8-byte aligned
volatile bool gspRunEvents; volatile bool gspRunEvents;
Handle gspEventThread; Handle gspEventThread;
@ -97,6 +98,7 @@ void gspEventThreadMain(u32 arg)
if (cur >= 0x34) cur -= 0x34; if (cur >= 0x34) cur -= 0x34;
if (curEvt >= GSPEVENT_MAX) continue; if (curEvt >= GSPEVENT_MAX) continue;
svcSignalEvent(gspEvents[curEvt]); svcSignalEvent(gspEvents[curEvt]);
gspEventCounts[curEvt]++;
} }
gspEventData[0] = last; gspEventData[0] = last;