mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-07-05 04:36:02 +00:00
Implement rasterization state for render pipeline - Part 1
This change adds rasterization state into dawn.json. It includes back face culling and depth bias. It also adds validation code and default values for rasterization state in ComboRenderPipelineDesc to pass dawn_unittests. Validation for back face culling and depth bias related parameters is quite easy, so unittests are not needed. BUG=dawn:43 Change-Id: I332cbf3f72545cfa8e62b3534d5a6a6e8fdc6d2a Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/6460 Commit-Queue: Kai Ninomiya <kainino@chromium.org> Reviewed-by: Kai Ninomiya <kainino@chromium.org>
This commit is contained in:
parent
fbf7092ab3
commit
c33a8c1885
31
dawn.json
31
dawn.json
@ -378,6 +378,14 @@
|
|||||||
{"name": "compute stage", "type": "pipeline stage descriptor", "annotation": "const*"}
|
{"name": "compute stage", "type": "pipeline stage descriptor", "annotation": "const*"}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"cull mode": {
|
||||||
|
"category": "enum",
|
||||||
|
"values": [
|
||||||
|
{"value": 0, "name": "none"},
|
||||||
|
{"value": 1, "name": "front"},
|
||||||
|
{"value": 2, "name": "back"}
|
||||||
|
]
|
||||||
|
},
|
||||||
"device": {
|
"device": {
|
||||||
"category": "object",
|
"category": "object",
|
||||||
"methods": [
|
"methods": [
|
||||||
@ -550,6 +558,13 @@
|
|||||||
"float": {
|
"float": {
|
||||||
"category": "native"
|
"category": "native"
|
||||||
},
|
},
|
||||||
|
"front face": {
|
||||||
|
"category": "enum",
|
||||||
|
"values": [
|
||||||
|
{"value": 0, "name": "CCW"},
|
||||||
|
{"value": 1, "name": "CW"}
|
||||||
|
]
|
||||||
|
},
|
||||||
"index format": {
|
"index format": {
|
||||||
"category": "enum",
|
"category": "enum",
|
||||||
"values": [
|
"values": [
|
||||||
@ -671,6 +686,18 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"rasterization state descriptor": {
|
||||||
|
"category": "structure",
|
||||||
|
"extensible": true,
|
||||||
|
"members": [
|
||||||
|
{"name": "front face", "type": "front face"},
|
||||||
|
{"name": "cull mode", "type": "cull mode"},
|
||||||
|
{"name": "depth bias", "type": "int32_t"},
|
||||||
|
{"name": "depth bias slope scale", "type": "float"},
|
||||||
|
{"name": "depth bias clamp", "type": "float"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
"render pass color attachment descriptor": {
|
"render pass color attachment descriptor": {
|
||||||
"category": "structure",
|
"category": "structure",
|
||||||
"members": [
|
"members": [
|
||||||
@ -824,6 +851,7 @@
|
|||||||
{"name": "fragment stage", "type": "pipeline stage descriptor", "annotation": "const*"},
|
{"name": "fragment stage", "type": "pipeline stage descriptor", "annotation": "const*"},
|
||||||
{"name": "input state", "type": "input state descriptor", "annotation": "const*"},
|
{"name": "input state", "type": "input state descriptor", "annotation": "const*"},
|
||||||
{"name": "primitive topology", "type": "primitive topology"},
|
{"name": "primitive topology", "type": "primitive topology"},
|
||||||
|
{"name": "rasterization state", "type": "rasterization state descriptor", "annotation": "const*"},
|
||||||
{"name": "sample count", "type": "uint32_t"},
|
{"name": "sample count", "type": "uint32_t"},
|
||||||
{"name": "depth stencil state", "type": "depth stencil state descriptor", "annotation": "const*", "optional": true},
|
{"name": "depth stencil state", "type": "depth stencil state descriptor", "annotation": "const*", "optional": true},
|
||||||
{"name": "color state count", "type": "uint32_t"},
|
{"name": "color state count", "type": "uint32_t"},
|
||||||
@ -1094,6 +1122,9 @@
|
|||||||
"uint32_t": {
|
"uint32_t": {
|
||||||
"category": "native"
|
"category": "native"
|
||||||
},
|
},
|
||||||
|
"int32_t": {
|
||||||
|
"category": "native"
|
||||||
|
},
|
||||||
"uint64_t": {
|
"uint64_t": {
|
||||||
"category": "native"
|
"category": "native"
|
||||||
},
|
},
|
||||||
|
@ -102,6 +102,15 @@ void init() {
|
|||||||
inputState.attributes = nullptr;
|
inputState.attributes = nullptr;
|
||||||
descriptor.inputState = &inputState;
|
descriptor.inputState = &inputState;
|
||||||
|
|
||||||
|
DawnRasterizationStateDescriptor rasterizationState;
|
||||||
|
rasterizationState.nextInChain = nullptr;
|
||||||
|
rasterizationState.frontFace = DAWN_FRONT_FACE_CCW;
|
||||||
|
rasterizationState.cullMode = DAWN_CULL_MODE_NONE;
|
||||||
|
rasterizationState.depthBias = 0;
|
||||||
|
rasterizationState.depthBiasSlopeScale = 0.0;
|
||||||
|
rasterizationState.depthBiasClamp = 0.0;
|
||||||
|
descriptor.rasterizationState = &rasterizationState;
|
||||||
|
|
||||||
descriptor.primitiveTopology = DAWN_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
|
descriptor.primitiveTopology = DAWN_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
|
||||||
|
|
||||||
descriptor.depthStencilState = nullptr;
|
descriptor.depthStencilState = nullptr;
|
||||||
|
@ -97,6 +97,16 @@ namespace dawn_native {
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MaybeError ValidateRasterizationStateDescriptor(
|
||||||
|
const RasterizationStateDescriptor* descriptor) {
|
||||||
|
if (descriptor->nextInChain != nullptr) {
|
||||||
|
return DAWN_VALIDATION_ERROR("nextInChain must be nullptr");
|
||||||
|
}
|
||||||
|
DAWN_TRY(ValidateFrontFace(descriptor->frontFace));
|
||||||
|
DAWN_TRY(ValidateCullMode(descriptor->cullMode));
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
MaybeError ValidateColorStateDescriptor(const ColorStateDescriptor* descriptor) {
|
MaybeError ValidateColorStateDescriptor(const ColorStateDescriptor* descriptor) {
|
||||||
if (descriptor->nextInChain != nullptr) {
|
if (descriptor->nextInChain != nullptr) {
|
||||||
return DAWN_VALIDATION_ERROR("nextInChain must be nullptr");
|
return DAWN_VALIDATION_ERROR("nextInChain must be nullptr");
|
||||||
@ -264,6 +274,7 @@ namespace dawn_native {
|
|||||||
descriptor->layout, dawn::ShaderStage::Vertex));
|
descriptor->layout, dawn::ShaderStage::Vertex));
|
||||||
DAWN_TRY(ValidatePipelineStageDescriptor(device, descriptor->fragmentStage,
|
DAWN_TRY(ValidatePipelineStageDescriptor(device, descriptor->fragmentStage,
|
||||||
descriptor->layout, dawn::ShaderStage::Fragment));
|
descriptor->layout, dawn::ShaderStage::Fragment));
|
||||||
|
DAWN_TRY(ValidateRasterizationStateDescriptor(descriptor->rasterizationState));
|
||||||
|
|
||||||
if ((descriptor->vertexStage->module->GetUsedVertexAttributes() & ~attributesSetMask)
|
if ((descriptor->vertexStage->module->GetUsedVertexAttributes() & ~attributesSetMask)
|
||||||
.any()) {
|
.any()) {
|
||||||
@ -323,6 +334,7 @@ namespace dawn_native {
|
|||||||
dawn::ShaderStageBit::Vertex | dawn::ShaderStageBit::Fragment),
|
dawn::ShaderStageBit::Vertex | dawn::ShaderStageBit::Fragment),
|
||||||
mInputState(*descriptor->inputState),
|
mInputState(*descriptor->inputState),
|
||||||
mPrimitiveTopology(descriptor->primitiveTopology),
|
mPrimitiveTopology(descriptor->primitiveTopology),
|
||||||
|
mRasterizationState(*descriptor->rasterizationState),
|
||||||
mHasDepthStencilAttachment(descriptor->depthStencilState != nullptr),
|
mHasDepthStencilAttachment(descriptor->depthStencilState != nullptr),
|
||||||
mSampleCount(descriptor->sampleCount) {
|
mSampleCount(descriptor->sampleCount) {
|
||||||
uint32_t location = 0;
|
uint32_t location = 0;
|
||||||
|
@ -75,6 +75,7 @@ namespace dawn_native {
|
|||||||
std::bitset<kMaxVertexInputs> mInputsSetMask;
|
std::bitset<kMaxVertexInputs> mInputsSetMask;
|
||||||
std::array<VertexInputDescriptor, kMaxVertexInputs> mInputInfos;
|
std::array<VertexInputDescriptor, kMaxVertexInputs> mInputInfos;
|
||||||
dawn::PrimitiveTopology mPrimitiveTopology;
|
dawn::PrimitiveTopology mPrimitiveTopology;
|
||||||
|
RasterizationStateDescriptor mRasterizationState;
|
||||||
DepthStencilStateDescriptor mDepthStencilState;
|
DepthStencilStateDescriptor mDepthStencilState;
|
||||||
std::array<ColorStateDescriptor, kMaxColorAttachments> mColorStates;
|
std::array<ColorStateDescriptor, kMaxColorAttachments> mColorStates;
|
||||||
|
|
||||||
|
@ -105,6 +105,15 @@ TEST_F(WireArgumentTests, CStringArgument) {
|
|||||||
inputState.numAttributes = 0;
|
inputState.numAttributes = 0;
|
||||||
inputState.attributes = nullptr;
|
inputState.attributes = nullptr;
|
||||||
|
|
||||||
|
// Create the rasterization state
|
||||||
|
DawnRasterizationStateDescriptor rasterizationState;
|
||||||
|
rasterizationState.nextInChain = nullptr;
|
||||||
|
rasterizationState.frontFace = DAWN_FRONT_FACE_CCW;
|
||||||
|
rasterizationState.cullMode = DAWN_CULL_MODE_NONE;
|
||||||
|
rasterizationState.depthBias = 0;
|
||||||
|
rasterizationState.depthBiasSlopeScale = 0.0;
|
||||||
|
rasterizationState.depthBiasClamp = 0.0;
|
||||||
|
|
||||||
// Create the depth-stencil state
|
// Create the depth-stencil state
|
||||||
DawnStencilStateFaceDescriptor stencilFace;
|
DawnStencilStateFaceDescriptor stencilFace;
|
||||||
stencilFace.compare = DAWN_COMPARE_FUNCTION_ALWAYS;
|
stencilFace.compare = DAWN_COMPARE_FUNCTION_ALWAYS;
|
||||||
@ -155,6 +164,7 @@ TEST_F(WireArgumentTests, CStringArgument) {
|
|||||||
pipelineDescriptor.layout = layout;
|
pipelineDescriptor.layout = layout;
|
||||||
pipelineDescriptor.inputState = &inputState;
|
pipelineDescriptor.inputState = &inputState;
|
||||||
pipelineDescriptor.primitiveTopology = DAWN_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
|
pipelineDescriptor.primitiveTopology = DAWN_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
|
||||||
|
pipelineDescriptor.rasterizationState = &rasterizationState;
|
||||||
pipelineDescriptor.depthStencilState = &depthStencilState;
|
pipelineDescriptor.depthStencilState = &depthStencilState;
|
||||||
|
|
||||||
dawnDeviceCreateRenderPipeline(device, &pipelineDescriptor);
|
dawnDeviceCreateRenderPipeline(device, &pipelineDescriptor);
|
||||||
|
@ -95,6 +95,15 @@ TEST_F(WireOptionalTests, OptionalStructPointer) {
|
|||||||
inputState.numAttributes = 0;
|
inputState.numAttributes = 0;
|
||||||
inputState.attributes = nullptr;
|
inputState.attributes = nullptr;
|
||||||
|
|
||||||
|
// Create the rasterization state
|
||||||
|
DawnRasterizationStateDescriptor rasterizationState;
|
||||||
|
rasterizationState.nextInChain = nullptr;
|
||||||
|
rasterizationState.frontFace = DAWN_FRONT_FACE_CCW;
|
||||||
|
rasterizationState.cullMode = DAWN_CULL_MODE_NONE;
|
||||||
|
rasterizationState.depthBias = 0;
|
||||||
|
rasterizationState.depthBiasSlopeScale = 0.0;
|
||||||
|
rasterizationState.depthBiasClamp = 0.0;
|
||||||
|
|
||||||
// Create the depth-stencil state
|
// Create the depth-stencil state
|
||||||
DawnStencilStateFaceDescriptor stencilFace;
|
DawnStencilStateFaceDescriptor stencilFace;
|
||||||
stencilFace.compare = DAWN_COMPARE_FUNCTION_ALWAYS;
|
stencilFace.compare = DAWN_COMPARE_FUNCTION_ALWAYS;
|
||||||
@ -145,6 +154,7 @@ TEST_F(WireOptionalTests, OptionalStructPointer) {
|
|||||||
pipelineDescriptor.layout = layout;
|
pipelineDescriptor.layout = layout;
|
||||||
pipelineDescriptor.inputState = &inputState;
|
pipelineDescriptor.inputState = &inputState;
|
||||||
pipelineDescriptor.primitiveTopology = DAWN_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
|
pipelineDescriptor.primitiveTopology = DAWN_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
|
||||||
|
pipelineDescriptor.rasterizationState = &rasterizationState;
|
||||||
|
|
||||||
// First case: depthStencilState is not null.
|
// First case: depthStencilState is not null.
|
||||||
pipelineDescriptor.depthStencilState = &depthStencilState;
|
pipelineDescriptor.depthStencilState = &depthStencilState;
|
||||||
|
@ -68,6 +68,17 @@ namespace utils {
|
|||||||
// Set defaults for the input state descriptors.
|
// Set defaults for the input state descriptors.
|
||||||
descriptor->inputState = &cInputState;
|
descriptor->inputState = &cInputState;
|
||||||
|
|
||||||
|
// Set defaults for the rasterization state descriptor.
|
||||||
|
{
|
||||||
|
cRasterizationState.frontFace = dawn::FrontFace::CCW;
|
||||||
|
cRasterizationState.cullMode = dawn::CullMode::None;
|
||||||
|
|
||||||
|
cRasterizationState.depthBias = 0;
|
||||||
|
cRasterizationState.depthBiasSlopeScale = 0.0;
|
||||||
|
cRasterizationState.depthBiasClamp = 0.0;
|
||||||
|
descriptor->rasterizationState = &cRasterizationState;
|
||||||
|
}
|
||||||
|
|
||||||
// Set defaults for the color state descriptors.
|
// Set defaults for the color state descriptors.
|
||||||
{
|
{
|
||||||
descriptor->colorStateCount = 1;
|
descriptor->colorStateCount = 1;
|
||||||
|
@ -39,6 +39,7 @@ namespace utils {
|
|||||||
dawn::PipelineStageDescriptor cFragmentStage;
|
dawn::PipelineStageDescriptor cFragmentStage;
|
||||||
|
|
||||||
ComboInputStateDescriptor cInputState;
|
ComboInputStateDescriptor cInputState;
|
||||||
|
dawn::RasterizationStateDescriptor cRasterizationState;
|
||||||
std::array<dawn::ColorStateDescriptor*, kMaxColorAttachments> cColorStates;
|
std::array<dawn::ColorStateDescriptor*, kMaxColorAttachments> cColorStates;
|
||||||
dawn::DepthStencilStateDescriptor cDepthStencilState;
|
dawn::DepthStencilStateDescriptor cDepthStencilState;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user