[D3D12] Adaptive tessellation of triangle patches

This commit is contained in:
Triang3l
2018-12-29 20:53:41 +03:00
parent 14476e5453
commit 928e46c8b2
29 changed files with 2181 additions and 1507 deletions

View File

@@ -26,6 +26,10 @@
DEFINE_bool(d3d12_dxbc_disasm, false,
"Disassemble DXBC shaders after generation.");
DEFINE_bool(
d3d12_tessellation_adaptive, true,
"Allow games to use adaptive tessellation - may be disabled if the game "
"has issues with memexport, the maximum factor will be used in this case.");
DEFINE_bool(d3d12_tessellation_wireframe, false,
"Display tessellated surfaces as wireframe for debugging.");
@@ -34,6 +38,7 @@ namespace gpu {
namespace d3d12 {
// Generated with `xb buildhlsl`.
#include "xenia/gpu/d3d12/shaders/dxbc/adaptive_triangle_hs.h"
#include "xenia/gpu/d3d12/shaders/dxbc/continuous_quad_hs.h"
#include "xenia/gpu/d3d12/shaders/dxbc/continuous_triangle_hs.h"
#include "xenia/gpu/d3d12/shaders/dxbc/discrete_quad_hs.h"
@@ -351,6 +356,10 @@ PipelineCache::UpdateStatus PipelineCache::UpdateShaderStages(
primitive_type == PrimitiveType::kQuadPatch) {
tessellation_mode = TessellationMode(
register_file_->values[XE_GPU_REG_VGT_HOS_CNTL].u32 & 0x3);
if (!FLAGS_d3d12_tessellation_adaptive &&
tessellation_mode == TessellationMode::kAdaptive) {
tessellation_mode = TessellationMode::kContinuous;
}
}
} else {
dirty |= regs.hs_gs_ds_primitive_type != PrimitiveType::kNone;
@@ -422,10 +431,12 @@ PipelineCache::UpdateStatus PipelineCache::UpdateShaderStages(
if (tessellation_mode == TessellationMode::kDiscrete) {
update_desc_.HS.pShaderBytecode = discrete_triangle_hs;
update_desc_.HS.BytecodeLength = sizeof(discrete_triangle_hs);
} else if (tessellation_mode == TessellationMode::kAdaptive) {
update_desc_.HS.pShaderBytecode = adaptive_triangle_hs;
update_desc_.HS.BytecodeLength = sizeof(adaptive_triangle_hs);
} else {
update_desc_.HS.pShaderBytecode = continuous_triangle_hs;
update_desc_.HS.BytecodeLength = sizeof(continuous_triangle_hs);
// TODO(Triang3l): True adaptive tessellation when memexport is added.
}
break;
case PrimitiveType::kQuadPatch:
@@ -435,7 +446,7 @@ PipelineCache::UpdateStatus PipelineCache::UpdateShaderStages(
} else {
update_desc_.HS.pShaderBytecode = continuous_quad_hs;
update_desc_.HS.BytecodeLength = sizeof(continuous_quad_hs);
// TODO(Triang3l): True adaptive tessellation when memexport is added.
// TODO(Triang3l): True adaptive tessellation when properly tested.
}
break;
default: