mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-04 15:18:45 +00:00
WIP
This commit is contained in:
parent
5e98a3e1d8
commit
24a03edfb7
2 changed files with 42 additions and 8 deletions
|
@ -253,6 +253,13 @@ struct Liverpool {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ModeControl {
|
||||||
|
s32 msaa_enable : 1;
|
||||||
|
s32 vport_scissor_enable : 1;
|
||||||
|
s32 line_stripple_enable : 1;
|
||||||
|
s32 send_unlit_stiles_to_pkr : 1;
|
||||||
|
};
|
||||||
|
|
||||||
enum class ZOrder : u32 {
|
enum class ZOrder : u32 {
|
||||||
LateZ = 0,
|
LateZ = 0,
|
||||||
EarlyZLateZ = 1,
|
EarlyZLateZ = 1,
|
||||||
|
@ -573,6 +580,11 @@ struct Liverpool {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct WindowOffset {
|
||||||
|
s32 window_x_offset : 16;
|
||||||
|
s32 window_y_offset : 16;
|
||||||
|
};
|
||||||
|
|
||||||
struct ViewportScissor {
|
struct ViewportScissor {
|
||||||
union {
|
union {
|
||||||
BitField<0, 15, s32> top_left_x;
|
BitField<0, 15, s32> top_left_x;
|
||||||
|
@ -953,10 +965,14 @@ struct Liverpool {
|
||||||
Scissor screen_scissor;
|
Scissor screen_scissor;
|
||||||
INSERT_PADDING_WORDS(0xA010 - 0xA00C - 2);
|
INSERT_PADDING_WORDS(0xA010 - 0xA00C - 2);
|
||||||
DepthBuffer depth_buffer;
|
DepthBuffer depth_buffer;
|
||||||
INSERT_PADDING_WORDS(0xA08E - 0xA018);
|
INSERT_PADDING_WORDS(0xA080 - 0xA018);
|
||||||
|
WindowOffset window_offset;
|
||||||
|
ViewportScissor window_scissor;
|
||||||
|
INSERT_PADDING_WORDS(0xA08E - 0xA081 - 2);
|
||||||
ColorBufferMask color_target_mask;
|
ColorBufferMask color_target_mask;
|
||||||
ColorBufferMask color_shader_mask;
|
ColorBufferMask color_shader_mask;
|
||||||
INSERT_PADDING_WORDS(0xA094 - 0xA08E - 2);
|
ViewportScissor generic_scissor;
|
||||||
|
INSERT_PADDING_WORDS(2);
|
||||||
std::array<ViewportScissor, NumViewports> viewport_scissors;
|
std::array<ViewportScissor, NumViewports> viewport_scissors;
|
||||||
std::array<ViewportDepth, NumViewports> viewport_depths;
|
std::array<ViewportDepth, NumViewports> viewport_depths;
|
||||||
INSERT_PADDING_WORDS(0xA103 - 0xA0D4);
|
INSERT_PADDING_WORDS(0xA103 - 0xA0D4);
|
||||||
|
@ -994,7 +1010,9 @@ struct Liverpool {
|
||||||
PolygonControl polygon_control;
|
PolygonControl polygon_control;
|
||||||
ViewportControl viewport_control;
|
ViewportControl viewport_control;
|
||||||
VsOutputControl vs_output_control;
|
VsOutputControl vs_output_control;
|
||||||
INSERT_PADDING_WORDS(0xA29E - 0xA207 - 2);
|
INSERT_PADDING_WORDS(0xA292 - 0xA207 - 1);
|
||||||
|
ModeControl mode_control;
|
||||||
|
INSERT_PADDING_WORDS(0xA29D - 0xA292 - 1);
|
||||||
u32 index_size;
|
u32 index_size;
|
||||||
u32 max_index_size;
|
u32 max_index_size;
|
||||||
IndexBufferType index_buffer_type;
|
IndexBufferType index_buffer_type;
|
||||||
|
@ -1206,8 +1224,11 @@ static_assert(GFX6_3D_REG_INDEX(depth_htile_data_base) == 0xA005);
|
||||||
static_assert(GFX6_3D_REG_INDEX(screen_scissor) == 0xA00C);
|
static_assert(GFX6_3D_REG_INDEX(screen_scissor) == 0xA00C);
|
||||||
static_assert(GFX6_3D_REG_INDEX(depth_buffer.z_info) == 0xA010);
|
static_assert(GFX6_3D_REG_INDEX(depth_buffer.z_info) == 0xA010);
|
||||||
static_assert(GFX6_3D_REG_INDEX(depth_buffer.depth_slice) == 0xA017);
|
static_assert(GFX6_3D_REG_INDEX(depth_buffer.depth_slice) == 0xA017);
|
||||||
|
static_assert(GFX6_3D_REG_INDEX(window_offset) == 0xA080);
|
||||||
|
static_assert(GFX6_3D_REG_INDEX(window_scissor) == 0xA081);
|
||||||
static_assert(GFX6_3D_REG_INDEX(color_target_mask) == 0xA08E);
|
static_assert(GFX6_3D_REG_INDEX(color_target_mask) == 0xA08E);
|
||||||
static_assert(GFX6_3D_REG_INDEX(color_shader_mask) == 0xA08F);
|
static_assert(GFX6_3D_REG_INDEX(color_shader_mask) == 0xA08F);
|
||||||
|
static_assert(GFX6_3D_REG_INDEX(generic_scissor) == 0xA090);
|
||||||
static_assert(GFX6_3D_REG_INDEX(viewport_scissors) == 0xA094);
|
static_assert(GFX6_3D_REG_INDEX(viewport_scissors) == 0xA094);
|
||||||
static_assert(GFX6_3D_REG_INDEX(primitive_restart_index) == 0xA103);
|
static_assert(GFX6_3D_REG_INDEX(primitive_restart_index) == 0xA103);
|
||||||
static_assert(GFX6_3D_REG_INDEX(stencil_control) == 0xA10B);
|
static_assert(GFX6_3D_REG_INDEX(stencil_control) == 0xA10B);
|
||||||
|
@ -1227,6 +1248,7 @@ static_assert(GFX6_3D_REG_INDEX(color_control) == 0xA202);
|
||||||
static_assert(GFX6_3D_REG_INDEX(clipper_control) == 0xA204);
|
static_assert(GFX6_3D_REG_INDEX(clipper_control) == 0xA204);
|
||||||
static_assert(GFX6_3D_REG_INDEX(viewport_control) == 0xA206);
|
static_assert(GFX6_3D_REG_INDEX(viewport_control) == 0xA206);
|
||||||
static_assert(GFX6_3D_REG_INDEX(vs_output_control) == 0xA207);
|
static_assert(GFX6_3D_REG_INDEX(vs_output_control) == 0xA207);
|
||||||
|
static_assert(GFX6_3D_REG_INDEX(mode_control) == 0xA292);
|
||||||
static_assert(GFX6_3D_REG_INDEX(index_size) == 0xA29D);
|
static_assert(GFX6_3D_REG_INDEX(index_size) == 0xA29D);
|
||||||
static_assert(GFX6_3D_REG_INDEX(index_buffer_type) == 0xA29F);
|
static_assert(GFX6_3D_REG_INDEX(index_buffer_type) == 0xA29F);
|
||||||
static_assert(GFX6_3D_REG_INDEX(enable_primitive_id) == 0xA2A1);
|
static_assert(GFX6_3D_REG_INDEX(enable_primitive_id) == 0xA2A1);
|
||||||
|
|
|
@ -368,11 +368,23 @@ void Rasterizer::UpdateViewportScissorState() {
|
||||||
.maxDepth = vp.zscale + vp.zoffset,
|
.maxDepth = vp.zscale + vp.zoffset,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!regs.mode_control.vport_scissor_enable) {
|
||||||
const auto& sc = regs.screen_scissor;
|
const auto& sc = regs.screen_scissor;
|
||||||
scissors.push_back({
|
scissors.push_back({
|
||||||
.offset = {sc.top_left_x, sc.top_left_y},
|
.offset = {sc.top_left_x, sc.top_left_y},
|
||||||
.extent = {sc.GetWidth(), sc.GetHeight()},
|
.extent = {sc.GetWidth(), sc.GetHeight()},
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
for (u32 i = 0; i < Liverpool::NumViewports; i++) {
|
||||||
|
const auto& scsrs = regs.viewport_scissors[i];
|
||||||
|
scissors.push_back({
|
||||||
|
.offset = {scsrs.top_left_x, scsrs.top_left_y},
|
||||||
|
.extent = {scsrs.GetWidth(), scsrs.GetHeight()},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const auto cmdbuf = scheduler.CommandBuffer();
|
const auto cmdbuf = scheduler.CommandBuffer();
|
||||||
cmdbuf.setViewport(0, viewports);
|
cmdbuf.setViewport(0, viewports);
|
||||||
cmdbuf.setScissor(0, scissors);
|
cmdbuf.setScissor(0, scissors);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue