mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-02-20 14:11:42 +00:00
GPU: Fix crash on imm vert triangles.
Was crashing because the frag and vert shaders didn't match up.
This commit is contained in:
parent
97002692c4
commit
9f84cde062
@ -215,17 +215,29 @@ void DrawEngineCommon::DispatchSubmitImm(GEPrimitiveType prim, TransformedVertex
|
||||
int vtype = GE_VTYPE_TC_FLOAT | GE_VTYPE_POS_FLOAT | GE_VTYPE_COL_8888 | GE_VTYPE_THROUGH;
|
||||
// TODO: Handle fog and secondary color somehow?
|
||||
|
||||
if (gstate.isFogEnabled()) {
|
||||
if (gstate.isFogEnabled() && !gstate.isModeThrough()) {
|
||||
WARN_LOG_REPORT_ONCE(geimmfog, G3D, "Imm vertex used fog");
|
||||
}
|
||||
if (color1Used != 0 && gstate.isUsingSecondaryColor()) {
|
||||
if (color1Used != 0 && gstate.isUsingSecondaryColor() && !gstate.isModeThrough()) {
|
||||
WARN_LOG_REPORT_ONCE(geimmcolor1, G3D, "Imm vertex used secondary color");
|
||||
}
|
||||
|
||||
bool prevThrough = gstate.isModeThrough();
|
||||
// Code checks this reg directly, not just the vtype ID.
|
||||
if (!prevThrough) {
|
||||
gstate.vertType |= GE_VTYPE_THROUGH;
|
||||
gstate_c.Dirty(DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE | DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_UVSCALEOFFSET | DIRTY_CULLRANGE);
|
||||
}
|
||||
|
||||
int bytesRead;
|
||||
uint32_t vertTypeID = GetVertTypeID(vtype, 0);
|
||||
SubmitPrim(&temp[0], nullptr, prim, vertexCount, vertTypeID, cullMode, &bytesRead);
|
||||
DispatchFlush();
|
||||
|
||||
if (!prevThrough) {
|
||||
gstate.vertType &= ~GE_VTYPE_THROUGH;
|
||||
gstate_c.Dirty(DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE | DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_UVSCALEOFFSET | DIRTY_CULLRANGE);
|
||||
}
|
||||
}
|
||||
|
||||
// This code has plenty of potential for optimization.
|
||||
|
@ -89,7 +89,7 @@ const CommonCommandTableEntry commonCommandTable[] = {
|
||||
// These affect the fragment shader so need flushing.
|
||||
{ GE_CMD_CLEARMODE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_CULLRANGE | DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE },
|
||||
{ GE_CMD_TEXTUREMAPENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE },
|
||||
{ GE_CMD_FOGENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE},
|
||||
{ GE_CMD_FOGENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE },
|
||||
{ GE_CMD_TEXMODE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_TEXTURE_PARAMS | DIRTY_FRAGMENTSHADER_STATE },
|
||||
{ GE_CMD_TEXSHADELS, FLAG_FLUSHBEFOREONCHANGE, DIRTY_VERTEXSHADER_STATE },
|
||||
// Raster state for Direct3D 9, uncommon.
|
||||
@ -2457,7 +2457,9 @@ void GPUCommon::FlushImm() {
|
||||
WARN_LOG_REPORT_ONCE(geimmclipvalue, G3D, "Imm vertex used clip value, flags=%06x", immFlags_);
|
||||
}
|
||||
|
||||
if (texturing != prevTexturing || cullEnable != prevCullEnable || dither != prevDither || prevShading != shading || prevFog != fog) {
|
||||
bool changed = texturing != prevTexturing || cullEnable != prevCullEnable || dither != prevDither;
|
||||
changed = changed || prevShading != shading || prevFog != fog;
|
||||
if (changed) {
|
||||
DispatchFlush();
|
||||
gstate.antiAliasEnable = (GE_CMD_ANTIALIASENABLE << 24) | (int)antialias;
|
||||
gstate.shademodel = (GE_CMD_SHADEMODE << 24) | (int)shading;
|
||||
@ -2465,20 +2467,23 @@ void GPUCommon::FlushImm() {
|
||||
gstate.textureMapEnable = (GE_CMD_TEXTUREMAPENABLE << 24) | (int)texturing;
|
||||
gstate.fogEnable = (GE_CMD_FOGENABLE << 24) | (int)fog;
|
||||
gstate.ditherEnable = (GE_CMD_DITHERENABLE << 24) | (int)dither;
|
||||
gstate_c.Dirty(DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE | DIRTY_RASTER_STATE);
|
||||
gstate_c.Dirty(DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE | DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_UVSCALEOFFSET | DIRTY_CULLRANGE);
|
||||
}
|
||||
|
||||
drawEngineCommon_->DispatchSubmitImm(immPrim_, immBuffer_, immCount_, cullMode, immFirstSent_);
|
||||
immCount_ = 0;
|
||||
immFirstSent_ = true;
|
||||
|
||||
gstate.antiAliasEnable = (GE_CMD_ANTIALIASENABLE << 24) | (int)prevAntialias;
|
||||
gstate.shademodel = (GE_CMD_SHADEMODE << 24) | (int)prevShading;
|
||||
gstate.cullfaceEnable = (GE_CMD_CULLFACEENABLE << 24) | (int)prevCullEnable;
|
||||
gstate.textureMapEnable = (GE_CMD_TEXTUREMAPENABLE << 24) | (int)prevTexturing;
|
||||
gstate.fogEnable = (GE_CMD_FOGENABLE << 24) | (int)prevFog;
|
||||
gstate.ditherEnable = (GE_CMD_DITHERENABLE << 24) | (int)prevDither;
|
||||
gstate_c.Dirty(DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE | DIRTY_RASTER_STATE);
|
||||
if (changed) {
|
||||
DispatchFlush();
|
||||
gstate.antiAliasEnable = (GE_CMD_ANTIALIASENABLE << 24) | (int)prevAntialias;
|
||||
gstate.shademodel = (GE_CMD_SHADEMODE << 24) | (int)prevShading;
|
||||
gstate.cullfaceEnable = (GE_CMD_CULLFACEENABLE << 24) | (int)prevCullEnable;
|
||||
gstate.textureMapEnable = (GE_CMD_TEXTUREMAPENABLE << 24) | (int)prevTexturing;
|
||||
gstate.fogEnable = (GE_CMD_FOGENABLE << 24) | (int)prevFog;
|
||||
gstate.ditherEnable = (GE_CMD_DITHERENABLE << 24) | (int)prevDither;
|
||||
gstate_c.Dirty(DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE | DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_UVSCALEOFFSET | DIRTY_CULLRANGE);
|
||||
}
|
||||
}
|
||||
|
||||
void GPUCommon::ExecuteOp(u32 op, u32 diff) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user