mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 10:56:58 +02:00
render: use guest polygon modes
This commit is contained in:
@@ -540,16 +540,6 @@ static void McCheck(const HW::ModeControl& c) {
|
||||
// EXIT_NOT_IMPLEMENTED(c.cull_front != false);
|
||||
// EXIT_NOT_IMPLEMENTED(c.cull_back != false);
|
||||
// EXIT_NOT_IMPLEMENTED(c.face != false);
|
||||
if (c.poly_mode != 0) {
|
||||
static bool logged = false;
|
||||
if (!logged) {
|
||||
LOGF("\t temporary: PA_SU_SC_MODE_CNTL.POLY_MODE is not fully implemented; continuing "
|
||||
"with filled polygons\n");
|
||||
logged = true;
|
||||
}
|
||||
}
|
||||
EXIT_NOT_IMPLEMENTED(c.polymode_front_ptype != 0 && c.polymode_front_ptype != 2);
|
||||
EXIT_NOT_IMPLEMENTED(c.polymode_back_ptype != 0 && c.polymode_back_ptype != 2);
|
||||
if (c.vtx_window_offset_enable) {
|
||||
static bool logged = false;
|
||||
if (!logged) {
|
||||
|
||||
@@ -37,6 +37,28 @@ namespace Libs::Graphics {
|
||||
|
||||
namespace {
|
||||
|
||||
vk::PolygonMode ResolvePolygonMode(const HW::ModeControl& mode, bool cull_front, bool cull_back) {
|
||||
// CxPrimitiveSetup::PolygonMode disables both per-face modes when it is zero.
|
||||
if (mode.poly_mode == 0) {
|
||||
return vk::PolygonMode::eFill;
|
||||
}
|
||||
EXIT_NOT_IMPLEMENTED(mode.poly_mode != 1);
|
||||
if (cull_front && cull_back) {
|
||||
return vk::PolygonMode::eFill;
|
||||
}
|
||||
if (!cull_front && !cull_back && mode.polymode_front_ptype != mode.polymode_back_ptype) {
|
||||
EXIT("Pipeline: different polygon modes for two visible faces are unsupported\n");
|
||||
}
|
||||
// Vulkan has one polygon mode. A culled face does not constrain that mode.
|
||||
const auto polygon_mode = cull_front ? mode.polymode_back_ptype : mode.polymode_front_ptype;
|
||||
switch (polygon_mode) {
|
||||
case 0: return vk::PolygonMode::ePoint;
|
||||
case 1: return vk::PolygonMode::eLine;
|
||||
case 2: return vk::PolygonMode::eFill;
|
||||
default: EXIT("Pipeline: invalid polygon mode %u\n", polygon_mode);
|
||||
}
|
||||
}
|
||||
|
||||
std::string DriverCacheSignature(const vk::PhysicalDeviceProperties& properties) {
|
||||
constexpr char hex[] = "0123456789abcdef";
|
||||
std::string uuid(VK_UUID_SIZE * 2, '0');
|
||||
@@ -693,6 +715,8 @@ PipelineCache::Pipeline& PipelineCache::CreateGraphicsPipeline(
|
||||
static_params.cull_back = !rect_list && mc.cull_back;
|
||||
static_params.cull_front = !rect_list && mc.cull_front;
|
||||
static_params.face = mc.face;
|
||||
static_params.polygon_mode =
|
||||
ResolvePolygonMode(mc, static_params.cull_front, static_params.cull_back);
|
||||
|
||||
for (uint32_t i = 0; i < color_count; i++) {
|
||||
const auto& rt = ctx.GetRenderTarget(colors[i].target_slot);
|
||||
|
||||
@@ -49,6 +49,7 @@ struct PipelineStaticParameters {
|
||||
bool cull_front = false;
|
||||
bool cull_back = false;
|
||||
bool face = false;
|
||||
vk::PolygonMode polygon_mode = vk::PolygonMode::eFill;
|
||||
uint8_t color_srcblend[RENDER_COLOR_ATTACHMENTS_MAX] = {};
|
||||
uint8_t color_comb_fcn[RENDER_COLOR_ATTACHMENTS_MAX] = {};
|
||||
uint8_t color_destblend[RENDER_COLOR_ATTACHMENTS_MAX] = {};
|
||||
@@ -67,7 +68,7 @@ struct PipelineStaticParameters {
|
||||
static_assert(std::is_trivially_copyable_v<PipelineStaticParameters>);
|
||||
static_assert(std::is_standard_layout_v<PipelineStaticParameters>);
|
||||
static_assert(alignof(PipelineStaticParameters) == 1);
|
||||
static_assert(sizeof(PipelineStaticParameters) == 161);
|
||||
static_assert(sizeof(PipelineStaticParameters) == 165);
|
||||
|
||||
struct PipelineRenderingState {
|
||||
std::array<vk::Format, RENDER_COLOR_ATTACHMENTS_MAX> color_formats {};
|
||||
|
||||
@@ -597,6 +597,7 @@ void CreatePipelineInternal(
|
||||
#endif
|
||||
rasterizer.cullMode = cull_mode;
|
||||
rasterizer.frontFace = front_face;
|
||||
rasterizer.polygonMode = static_params.polygon_mode;
|
||||
rasterizer.lineWidth = 1.0f;
|
||||
|
||||
vk::PipelineMultisampleStateCreateInfo multisampling {};
|
||||
|
||||
Reference in New Issue
Block a user