softgpu: Cache line drawing state.

This commit is contained in:
Unknown W. Brackets 2022-01-15 13:17:40 -08:00
parent 58455c8cf1
commit a2abf9402b
2 changed files with 7 additions and 3 deletions

View file

@ -136,6 +136,7 @@ void ComputeRasterizerState(RasterizerState *state) {
state->mipFilt = gstate.isMipmapFilteringEnabled(); state->mipFilt = gstate.isMipmapFilteringEnabled();
state->minFilt = gstate.isMinifyFilteringEnabled(); state->minFilt = gstate.isMinifyFilteringEnabled();
state->magFilt = gstate.isMagnifyFilteringEnabled(); state->magFilt = gstate.isMagnifyFilteringEnabled();
state->antialiasLines = gstate.isAntiAliasEnabled();
#if defined(SOFTGPU_MEMORY_TAGGING_DETAILED) || defined(SOFTGPU_MEMORY_TAGGING_BASIC) #if defined(SOFTGPU_MEMORY_TAGGING_DETAILED) || defined(SOFTGPU_MEMORY_TAGGING_BASIC)
DisplayList currentList{}; DisplayList currentList{};
@ -1233,6 +1234,8 @@ void DrawLine(const VertexData &v0, const VertexData &v1, const BinCoords &range
auto &pixelID = state.pixelID; auto &pixelID = state.pixelID;
auto &samplerID = state.samplerID; auto &samplerID = state.samplerID;
const bool interpolateColor = !state.shadeGouraud || (v0.color0 == v1.color0 && v0.color1 == v1.color1);
#if defined(SOFTGPU_MEMORY_TAGGING_DETAILED) || defined(SOFTGPU_MEMORY_TAGGING_BASIC) #if defined(SOFTGPU_MEMORY_TAGGING_DETAILED) || defined(SOFTGPU_MEMORY_TAGGING_BASIC)
std::string tag = StringFromFormat("DisplayListL_%08x", state.listPC); std::string tag = StringFromFormat("DisplayListL_%08x", state.listPC);
std::string ztag = StringFromFormat("DisplayListLZ_%08x", state.listPC); std::string ztag = StringFromFormat("DisplayListLZ_%08x", state.listPC);
@ -1247,7 +1250,7 @@ void DrawLine(const VertexData &v0, const VertexData &v1, const BinCoords &range
// Interpolate between the two points. // Interpolate between the two points.
Vec4<int> prim_color; Vec4<int> prim_color;
Vec3<int> sec_color; Vec3<int> sec_color;
if (gstate.getShadeMode() == GE_SHADE_GOURAUD) { if (interpolateColor) {
prim_color = (v0.color0 * (steps - i) + v1.color0 * i) / steps1; prim_color = (v0.color0 * (steps - i) + v1.color0 * i) / steps1;
sec_color = (v0.color1 * (steps - i) + v1.color1 * i) / steps1; sec_color = (v0.color1 * (steps - i) + v1.color1 * i) / steps1;
} else { } else {
@ -1260,7 +1263,7 @@ void DrawLine(const VertexData &v0, const VertexData &v1, const BinCoords &range
fog = ClampFogDepth((v0.fogdepth * (float)(steps - i) + v1.fogdepth * (float)i) / steps1); fog = ClampFogDepth((v0.fogdepth * (float)(steps - i) + v1.fogdepth * (float)i) / steps1);
} }
if (gstate.isAntiAliasEnabled()) { if (state.antialiasLines) {
// TODO: Clearmode? // TODO: Clearmode?
// TODO: Calculate. // TODO: Calculate.
prim_color.a() = 0x7F; prim_color.a() = 0x7F;
@ -1292,7 +1295,7 @@ void DrawLine(const VertexData &v0, const VertexData &v1, const BinCoords &range
bool texBilinear; bool texBilinear;
CalculateSamplingParams(ds, dt, state, texLevel, texLevelFrac, texBilinear); CalculateSamplingParams(ds, dt, state, texLevel, texLevelFrac, texBilinear);
if (gstate.isAntiAliasEnabled()) { if (state.antialiasLines) {
// TODO: This is a niave and wrong implementation. // TODO: This is a niave and wrong implementation.
DrawingCoords p0 = TransformUnit::ScreenToDrawing(ScreenCoords((int)x, (int)y, (int)z)); DrawingCoords p0 = TransformUnit::ScreenToDrawing(ScreenCoords((int)x, (int)y, (int)z));
s = ((float)p0.x + xinc / 32.0f) / 512.0f; s = ((float)p0.x + xinc / 32.0f) / 512.0f;

View file

@ -52,6 +52,7 @@ struct RasterizerState {
bool mipFilt : 1; bool mipFilt : 1;
bool minFilt : 1; bool minFilt : 1;
bool magFilt : 1; bool magFilt : 1;
bool antialiasLines : 1;
}; };
#if defined(SOFTGPU_MEMORY_TAGGING_DETAILED) || defined(SOFTGPU_MEMORY_TAGGING_BASIC) #if defined(SOFTGPU_MEMORY_TAGGING_DETAILED) || defined(SOFTGPU_MEMORY_TAGGING_BASIC)