gpu: handle primitive restart index register (#438)
This commit is contained in:
parent
a0fb47b0ab
commit
d45563f92c
|
@ -932,7 +932,9 @@ struct Liverpool {
|
||||||
INSERT_PADDING_WORDS(0xA094 - 0xA08E - 2);
|
INSERT_PADDING_WORDS(0xA094 - 0xA08E - 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(0xA105 - 0xA0D4);
|
INSERT_PADDING_WORDS(0xA103 - 0xA0D4);
|
||||||
|
u32 primitive_reset_index;
|
||||||
|
INSERT_PADDING_WORDS(1);
|
||||||
BlendConstants blend_constants;
|
BlendConstants blend_constants;
|
||||||
INSERT_PADDING_WORDS(0xA10B - 0xA105 - 4);
|
INSERT_PADDING_WORDS(0xA10B - 0xA105 - 4);
|
||||||
StencilControl stencil_control;
|
StencilControl stencil_control;
|
||||||
|
@ -1158,6 +1160,7 @@ static_assert(GFX6_3D_REG_INDEX(depth_buffer.depth_slice) == 0xA017);
|
||||||
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(viewport_scissors) == 0xA094);
|
static_assert(GFX6_3D_REG_INDEX(viewport_scissors) == 0xA094);
|
||||||
|
static_assert(GFX6_3D_REG_INDEX(primitive_reset_index) == 0xA103);
|
||||||
static_assert(GFX6_3D_REG_INDEX(stencil_control) == 0xA10B);
|
static_assert(GFX6_3D_REG_INDEX(stencil_control) == 0xA10B);
|
||||||
static_assert(GFX6_3D_REG_INDEX(viewports) == 0xA10F);
|
static_assert(GFX6_3D_REG_INDEX(viewports) == 0xA10F);
|
||||||
static_assert(GFX6_3D_REG_INDEX(clip_user_data) == 0xA16F);
|
static_assert(GFX6_3D_REG_INDEX(clip_user_data) == 0xA16F);
|
||||||
|
|
|
@ -86,8 +86,10 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul
|
||||||
|
|
||||||
const vk::PipelineInputAssemblyStateCreateInfo input_assembly = {
|
const vk::PipelineInputAssemblyStateCreateInfo input_assembly = {
|
||||||
.topology = LiverpoolToVK::PrimitiveType(key.prim_type),
|
.topology = LiverpoolToVK::PrimitiveType(key.prim_type),
|
||||||
.primitiveRestartEnable = false,
|
.primitiveRestartEnable = key.prim_restart_index != 0,
|
||||||
};
|
};
|
||||||
|
ASSERT_MSG(key.prim_restart_index == 0 || key.prim_restart_index == 0xFFFF,
|
||||||
|
"Primitive restart index other than 0xFFFF is not supported");
|
||||||
|
|
||||||
const vk::PipelineRasterizationStateCreateInfo raster_state = {
|
const vk::PipelineRasterizationStateCreateInfo raster_state = {
|
||||||
.depthClampEnable = false,
|
.depthClampEnable = false,
|
||||||
|
|
|
@ -39,6 +39,7 @@ struct GraphicsPipelineKey {
|
||||||
Liverpool::StencilRefMask stencil_ref_front;
|
Liverpool::StencilRefMask stencil_ref_front;
|
||||||
Liverpool::StencilRefMask stencil_ref_back;
|
Liverpool::StencilRefMask stencil_ref_back;
|
||||||
Liverpool::PrimitiveType prim_type;
|
Liverpool::PrimitiveType prim_type;
|
||||||
|
u32 prim_restart_index;
|
||||||
Liverpool::PolygonMode polygon_mode;
|
Liverpool::PolygonMode polygon_mode;
|
||||||
Liverpool::CullMode cull_mode;
|
Liverpool::CullMode cull_mode;
|
||||||
Liverpool::FrontFace front_face;
|
Liverpool::FrontFace front_face;
|
||||||
|
|
|
@ -165,6 +165,7 @@ void PipelineCache::RefreshGraphicsKey() {
|
||||||
key.stencil_ref_front = regs.stencil_ref_front;
|
key.stencil_ref_front = regs.stencil_ref_front;
|
||||||
key.stencil_ref_back = regs.stencil_ref_back;
|
key.stencil_ref_back = regs.stencil_ref_back;
|
||||||
key.prim_type = regs.primitive_type;
|
key.prim_type = regs.primitive_type;
|
||||||
|
key.prim_restart_index = regs.primitive_reset_index;
|
||||||
key.polygon_mode = regs.polygon_control.PolyMode();
|
key.polygon_mode = regs.polygon_control.PolyMode();
|
||||||
key.cull_mode = regs.polygon_control.CullingMode();
|
key.cull_mode = regs.polygon_control.CullingMode();
|
||||||
key.clip_space = regs.clipper_control.clip_space;
|
key.clip_space = regs.clipper_control.clip_space;
|
||||||
|
|
Loading…
Reference in New Issue