[D3D12] Fake per-edge tessellation with continuous

This commit is contained in:
Triang3l
2018-12-12 22:08:20 +03:00
parent 19d7e0ce3d
commit 2b646ff425
38 changed files with 3382 additions and 598 deletions

View File

@@ -27,6 +27,13 @@ class DxbcShaderTranslator : public ShaderTranslator {
DxbcShaderTranslator(uint32_t vendor_id, bool edram_rov_used);
~DxbcShaderTranslator() override;
enum class VertexShaderType { kVertex, kTriangleDomain, kQuadDomain };
// Sets the type (shader model and input layout) of the next vertex shader
// that will be converted.
void SetVertexShaderType(VertexShaderType type) {
vertex_shader_type_ = type;
}
// Constant buffer bindings in space 0.
enum class CbufferRegister {
kSystemConstants,
@@ -301,6 +308,13 @@ class DxbcShaderTranslator : public ShaderTranslator {
uint32_t color_output_map[4];
// vec4 8
union {
struct {
float tessellation_factor_range_min;
float tessellation_factor_range_max;
};
float tessellation_factor_range[2];
};
union {
struct {
float edram_depth_range_scale;
@@ -308,6 +322,8 @@ class DxbcShaderTranslator : public ShaderTranslator {
};
float edram_depth_range[2];
};
// vec4 9
union {
struct {
float edram_poly_offset_front_scale;
@@ -315,8 +331,6 @@ class DxbcShaderTranslator : public ShaderTranslator {
};
float edram_poly_offset_front[2];
};
// vec4 9
union {
struct {
float edram_poly_offset_back_scale;
@@ -324,14 +338,12 @@ class DxbcShaderTranslator : public ShaderTranslator {
};
float edram_poly_offset_back[2];
};
uint32_t edram_resolution_scale_log2;
uint32_t padding_9;
// vec4 10
uint32_t edram_resolution_scale_log2;
uint32_t edram_stencil_reference;
uint32_t edram_stencil_read_mask;
uint32_t edram_stencil_write_mask;
uint32_t padding_10;
// vec4 11
union {
@@ -563,38 +575,45 @@ class DxbcShaderTranslator : public ShaderTranslator {
kSysConst_ColorOutputMap_Index = kSysConst_ColorExpBias_Index + 1,
kSysConst_ColorOutputMap_Vec = kSysConst_ColorExpBias_Vec + 1,
kSysConst_EDRAMDepthRange_Index = kSysConst_ColorOutputMap_Index + 1,
kSysConst_EDRAMDepthRange_Vec = kSysConst_ColorOutputMap_Vec + 1,
kSysConst_EDRAMDepthRangeScale_Comp = 0,
kSysConst_EDRAMDepthRangeOffset_Comp = 1,
kSysConst_EDRAMPolyOffsetFront_Index = kSysConst_EDRAMDepthRange_Index + 1,
kSysConst_EDRAMPolyOffsetFront_Vec = kSysConst_EDRAMDepthRange_Vec,
kSysConst_EDRAMPolyOffsetFrontScale_Comp = 2,
kSysConst_EDRAMPolyOffsetFrontOffset_Comp = 3,
kSysConst_TessellationFactorRange_Index =
kSysConst_ColorOutputMap_Index + 1,
kSysConst_TessellationFactorRange_Vec = kSysConst_ColorOutputMap_Vec + 1,
kSysConst_TessellationFactorRange_Comp = 0,
kSysConst_EDRAMDepthRange_Index =
kSysConst_TessellationFactorRange_Index + 1,
kSysConst_EDRAMDepthRange_Vec = kSysConst_TessellationFactorRange_Vec,
kSysConst_EDRAMDepthRangeScale_Comp = 2,
kSysConst_EDRAMDepthRangeOffset_Comp = 3,
kSysConst_EDRAMPolyOffsetFront_Index = kSysConst_EDRAMDepthRange_Index + 1,
kSysConst_EDRAMPolyOffsetFront_Vec = kSysConst_EDRAMDepthRange_Vec + 1,
kSysConst_EDRAMPolyOffsetFrontScale_Comp = 0,
kSysConst_EDRAMPolyOffsetFrontOffset_Comp = 1,
kSysConst_EDRAMPolyOffsetBack_Index =
kSysConst_EDRAMPolyOffsetFront_Index + 1,
kSysConst_EDRAMPolyOffsetBack_Vec = kSysConst_EDRAMPolyOffsetFront_Vec + 1,
kSysConst_EDRAMPolyOffsetBackScale_Comp = 0,
kSysConst_EDRAMPolyOffsetBackOffset_Comp = 1,
kSysConst_EDRAMPolyOffsetBack_Vec = kSysConst_EDRAMPolyOffsetFront_Vec,
kSysConst_EDRAMPolyOffsetBackScale_Comp = 2,
kSysConst_EDRAMPolyOffsetBackOffset_Comp = 3,
kSysConst_EDRAMResolutionScaleLog2_Index =
kSysConst_EDRAMPolyOffsetBack_Index + 1,
kSysConst_EDRAMResolutionScaleLog2_Vec = kSysConst_EDRAMPolyOffsetBack_Vec,
kSysConst_EDRAMResolutionScaleLog2_Comp = 2,
kSysConst_EDRAMResolutionScaleLog2_Vec =
kSysConst_EDRAMPolyOffsetBack_Vec + 1,
kSysConst_EDRAMResolutionScaleLog2_Comp = 0,
kSysConst_EDRAMStencilReference_Index =
kSysConst_EDRAMResolutionScaleLog2_Index + 1,
kSysConst_EDRAMStencilReference_Vec =
kSysConst_EDRAMResolutionScaleLog2_Vec + 1,
kSysConst_EDRAMStencilReference_Comp = 0,
kSysConst_EDRAMResolutionScaleLog2_Vec,
kSysConst_EDRAMStencilReference_Comp = 1,
kSysConst_EDRAMStencilReadMask_Index =
kSysConst_EDRAMStencilReference_Index + 1,
kSysConst_EDRAMStencilReadMask_Vec = kSysConst_EDRAMStencilReference_Vec,
kSysConst_EDRAMStencilReadMask_Comp = 1,
kSysConst_EDRAMStencilReadMask_Vec = kSysConst_EDRAMResolutionScaleLog2_Vec,
kSysConst_EDRAMStencilReadMask_Comp = 2,
kSysConst_EDRAMStencilWriteMask_Index =
kSysConst_EDRAMStencilReadMask_Index + 1,
kSysConst_EDRAMStencilWriteMask_Vec = kSysConst_EDRAMStencilReference_Vec,
kSysConst_EDRAMStencilWriteMask_Comp = 2,
kSysConst_EDRAMStencilWriteMask_Vec =
kSysConst_EDRAMResolutionScaleLog2_Vec,
kSysConst_EDRAMStencilWriteMask_Comp = 3,
kSysConst_EDRAMStencilFront_Index =
kSysConst_EDRAMStencilWriteMask_Index + 1,
@@ -757,9 +776,18 @@ class DxbcShaderTranslator : public ShaderTranslator {
// Use these instead of is_vertex_shader/is_pixel_shader because they don't
// take is_depth_only_pixel_shader_ into account.
inline bool IsDXBCVertexShader() const {
inline bool IsDXBCVertexOrDomainShader() const {
return !is_depth_only_pixel_shader_ && is_vertex_shader();
}
inline bool IsDXBCVertexShader() const {
return IsDXBCVertexOrDomainShader() &&
vertex_shader_type_ == VertexShaderType::kVertex;
}
inline bool IsDXBCDomainShader() const {
return IsDXBCVertexOrDomainShader() &&
(vertex_shader_type_ == VertexShaderType::kTriangleDomain ||
vertex_shader_type_ == VertexShaderType::kQuadDomain);
}
inline bool IsDXBCPixelShader() const {
return is_depth_only_pixel_shader_ || is_pixel_shader();
}
@@ -778,11 +806,12 @@ class DxbcShaderTranslator : public ShaderTranslator {
// Writing the prologue.
void StartVertexShader_LoadVertexIndex();
void StartVertexShader();
void StartVertexOrDomainShader();
void StartDomainShader();
void StartPixelShader();
// Writing the epilogue.
void CompleteVertexShader();
void CompleteVertexOrDomainShader();
// Converts four depth values to 24-bit unorm or float, depending on the flag
// value.
void CompletePixelShader_DepthTo24Bit(uint32_t depths_temp);
@@ -991,6 +1020,7 @@ class DxbcShaderTranslator : public ShaderTranslator {
void WriteResourceDefinitions();
void WriteInputSignature();
void WritePatchConstantSignature();
void WriteOutputSignature();
void WriteShaderCode();
@@ -1009,6 +1039,7 @@ class DxbcShaderTranslator : public ShaderTranslator {
// Whether the output merger should be emulated in pixel shaders.
bool edram_rov_used_;
VertexShaderType vertex_shader_type_ = VertexShaderType::kVertex;
// Is currently writing the empty depth-only pixel shader, for
// CompleteTranslation.
bool is_depth_only_pixel_shader_;