Add primitive topology to NXT API

This commit is contained in:
Austin Eng 2017-07-24 13:54:19 -04:00 committed by Austin Eng
parent c275f7cf9f
commit 3e9e315636
3 changed files with 66 additions and 34 deletions

View File

@ -691,6 +691,16 @@
} }
] ]
}, },
"primitive topology": {
"category": "enum",
"values": [
{"value": 0, "name": "point"},
{"value": 1, "name": "line"},
{"value": 2, "name": "line strip"},
{"value": 3, "name": "triangle"},
{"value": 4, "name": "triangle strip"}
]
},
"queue": { "queue": {
"category": "object", "category": "object",
"methods": [ "methods": [
@ -773,6 +783,18 @@
"name": "get result", "name": "get result",
"returns": "render pipeline" "returns": "render pipeline"
}, },
{
"name": "set depth stencil state",
"args": [
{"name": "depth stencil state", "type": "depth stencil state"}
]
},
{
"name": "set input state",
"args": [
{"name": "input", "type": "input state"}
]
},
{ {
"name": "set layout", "name": "set layout",
"args": [ "args": [
@ -780,10 +802,9 @@
] ]
}, },
{ {
"name": "set subpass", "name": "set primitive topology",
"args": [ "args": [
{"name": "render pass", "type": "render pass"}, {"name": "primitive topology", "type": "primitive topology"}
{"name": "subpass", "type": "uint32_t"}
] ]
}, },
{ {
@ -795,15 +816,10 @@
] ]
}, },
{ {
"name": "set input state", "name": "set subpass",
"args": [ "args": [
{"name": "input", "type": "input state"} {"name": "render pass", "type": "render pass"},
] {"name": "subpass", "type": "uint32_t"}
},
{
"name": "set depth stencil state",
"args": [
{"name": "depth stencil state", "type": "depth stencil state"}
] ]
} }
] ]

View File

@ -24,8 +24,11 @@ namespace backend {
// RenderPipelineBase // RenderPipelineBase
RenderPipelineBase::RenderPipelineBase(RenderPipelineBuilder* builder) RenderPipelineBase::RenderPipelineBase(RenderPipelineBuilder* builder)
: PipelineBase(builder), renderPass(std::move(builder->renderPass)), subpass(builder->subpass), : PipelineBase(builder),
inputState(std::move(builder->inputState)), depthStencilState(std::move(builder->depthStencilState)) { depthStencilState(std::move(builder->depthStencilState)),
inputState(std::move(builder->inputState)),
primitiveTopology(builder->primitiveTopology),
renderPass(std::move(builder->renderPass)), subpass(builder->subpass) {
if (GetStageMask() != (nxt::ShaderStageBit::Vertex | nxt::ShaderStageBit::Fragment)) { if (GetStageMask() != (nxt::ShaderStageBit::Vertex | nxt::ShaderStageBit::Fragment)) {
builder->HandleError("Render pipeline should have exactly a vertex and fragment stage"); builder->HandleError("Render pipeline should have exactly a vertex and fragment stage");
@ -45,20 +48,24 @@ namespace backend {
} }
} }
RenderPassBase* RenderPipelineBase::GetRenderPass() { DepthStencilStateBase* RenderPipelineBase::GetDepthStencilState() {
return renderPass.Get(); return depthStencilState.Get();
}
uint32_t RenderPipelineBase::GetSubPass() {
return subpass;
} }
InputStateBase* RenderPipelineBase::GetInputState() { InputStateBase* RenderPipelineBase::GetInputState() {
return inputState.Get(); return inputState.Get();
} }
DepthStencilStateBase* RenderPipelineBase::GetDepthStencilState() { nxt::PrimitiveTopology RenderPipelineBase::GetPrimitiveTopology() const {
return depthStencilState.Get(); return primitiveTopology;
}
RenderPassBase* RenderPipelineBase::GetRenderPass() {
return renderPass.Get();
}
uint32_t RenderPipelineBase::GetSubPass() {
return subpass;
} }
// RenderPipelineBuilder // RenderPipelineBuilder
@ -79,17 +86,21 @@ namespace backend {
return device->CreateRenderPipeline(this); return device->CreateRenderPipeline(this);
} }
void RenderPipelineBuilder::SetSubpass(RenderPassBase* renderPass, uint32_t subpass) { void RenderPipelineBuilder::SetDepthStencilState(DepthStencilStateBase* depthStencilState) {
this->renderPass = renderPass; this->depthStencilState = depthStencilState;
this->subpass = subpass;
} }
void RenderPipelineBuilder::SetInputState(InputStateBase* inputState) { void RenderPipelineBuilder::SetInputState(InputStateBase* inputState) {
this->inputState = inputState; this->inputState = inputState;
} }
void RenderPipelineBuilder::SetDepthStencilState(DepthStencilStateBase* depthStencilState) { void RenderPipelineBuilder::SetPrimitiveTopology(nxt::PrimitiveTopology primitiveTopology) {
this->depthStencilState = depthStencilState; this->primitiveTopology = primitiveTopology;
}
void RenderPipelineBuilder::SetSubpass(RenderPassBase* renderPass, uint32_t subpass) {
this->renderPass = renderPass;
this->subpass = subpass;
} }
} }

View File

@ -25,16 +25,18 @@ namespace backend {
public: public:
RenderPipelineBase(RenderPipelineBuilder* builder); RenderPipelineBase(RenderPipelineBuilder* builder);
DepthStencilStateBase* GetDepthStencilState();
InputStateBase* GetInputState();
nxt::PrimitiveTopology GetPrimitiveTopology() const;
RenderPassBase* GetRenderPass(); RenderPassBase* GetRenderPass();
uint32_t GetSubPass(); uint32_t GetSubPass();
InputStateBase* GetInputState();
DepthStencilStateBase* GetDepthStencilState();
private: private:
Ref<DepthStencilStateBase> depthStencilState;
Ref<InputStateBase> inputState;
nxt::PrimitiveTopology primitiveTopology;
Ref<RenderPassBase> renderPass; Ref<RenderPassBase> renderPass;
uint32_t subpass; uint32_t subpass;
Ref<InputStateBase> inputState;
Ref<DepthStencilStateBase> depthStencilState;
}; };
class RenderPipelineBuilder : public Builder<RenderPipelineBase>, public PipelineBuilder { class RenderPipelineBuilder : public Builder<RenderPipelineBase>, public PipelineBuilder {
@ -42,19 +44,22 @@ namespace backend {
RenderPipelineBuilder(DeviceBase* device); RenderPipelineBuilder(DeviceBase* device);
// NXT API // NXT API
void SetSubpass(RenderPassBase* renderPass, uint32_t subpass);
void SetInputState(InputStateBase* inputState);
void SetDepthStencilState(DepthStencilStateBase* depthStencilState); void SetDepthStencilState(DepthStencilStateBase* depthStencilState);
void SetPrimitiveTopology(nxt::PrimitiveTopology primitiveTopology);
void SetInputState(InputStateBase* inputState);
void SetSubpass(RenderPassBase* renderPass, uint32_t subpass);
private: private:
friend class RenderPipelineBase; friend class RenderPipelineBase;
RenderPipelineBase* GetResultImpl() override; RenderPipelineBase* GetResultImpl() override;
Ref<DepthStencilStateBase> depthStencilState;
Ref<InputStateBase> inputState;
// TODO(enga@google.com): Remove default when we validate that all required properties are set
nxt::PrimitiveTopology primitiveTopology = nxt::PrimitiveTopology::Triangle;
Ref<RenderPassBase> renderPass; Ref<RenderPassBase> renderPass;
uint32_t subpass; uint32_t subpass;
Ref<InputStateBase> inputState;
Ref<DepthStencilStateBase> depthStencilState;
}; };
} }