diff --git a/src/xenia/gpu/d3d12/pipeline_cache.cc b/src/xenia/gpu/d3d12/pipeline_cache.cc index 9b39be885..97606a3cf 100644 --- a/src/xenia/gpu/d3d12/pipeline_cache.cc +++ b/src/xenia/gpu/d3d12/pipeline_cache.cc @@ -1444,7 +1444,7 @@ bool PipelineCache::GetCurrentStateDescription( poly_offset_scale = regs[XE_GPU_REG_PA_SU_POLY_OFFSET_BACK_SCALE].f32; } } - if (pa_su_sc_mode_cntl.poly_mode == xenos::PolygonModeEnable::kDisabled) { + if (pa_su_sc_mode_cntl.poly_mode != xenos::PolygonModeEnable::kDualMode) { description_out.fill_mode_wireframe = 0; } } else { diff --git a/src/xenia/gpu/registers.h b/src/xenia/gpu/registers.h index e8c3ee127..9ff038d89 100644 --- a/src/xenia/gpu/registers.h +++ b/src/xenia/gpu/registers.h @@ -334,7 +334,11 @@ union alignas(uint32_t) PA_SU_SC_MODE_CNTL { uint32_t cull_front : 1; // +0 uint32_t cull_back : 1; // +1 // 0 - front is CCW, 1 - front is CW. - uint32_t face : 1; // +2 + uint32_t face : 1; // +2 + // The game Fuse uses poly_mode 2 for triangles, which is "reserved" on R6xx + // and not defined on Adreno 2xx, but polymode_front/back_ptype are 0 + // (points) in this case in Fuse, which should not be respected for + // non-kDualMode as the game wants to draw filled triangles. xenos::PolygonModeEnable poly_mode : 2; // +3 xenos::PolygonType polymode_front_ptype : 3; // +5 xenos::PolygonType polymode_back_ptype : 3; // +8 diff --git a/src/xenia/gpu/xenos.h b/src/xenia/gpu/xenos.h index 4da491772..97d668513 100644 --- a/src/xenia/gpu/xenos.h +++ b/src/xenia/gpu/xenos.h @@ -753,6 +753,10 @@ enum class TessellationMode : uint32_t { enum class PolygonModeEnable : uint32_t { kDisabled = 0, // Render triangles. kDualMode = 1, // Send 2 sets of 3 polygons with the specified polygon type. + // The game Fuse uses 2 for triangles, which is "reserved" on R6xx and not + // defined on Adreno 2xx, but polymode_front/back_ptype are 0 (points) in this + // case in Fuse, which should not be respected for non-kDualMode as the game + // wants to draw filled triangles. }; enum class PolygonType : uint32_t {