mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-16 00:17:03 +00:00
Descriptorize ComputePipeline
Change-Id: Ic9d7014ba44d927d7f9ddf81a8870432c68941e8
This commit is contained in:
committed by
Corentin Wallez
parent
eb7d64a17f
commit
8e335a5585
@@ -14,10 +14,16 @@
|
||||
|
||||
#include "dawn_native/opengl/ComputePipelineGL.h"
|
||||
|
||||
#include "dawn_native/opengl/DeviceGL.h"
|
||||
|
||||
namespace dawn_native { namespace opengl {
|
||||
|
||||
ComputePipeline::ComputePipeline(ComputePipelineBuilder* builder)
|
||||
: ComputePipelineBase(builder), PipelineGL(this, builder) {
|
||||
ComputePipeline::ComputePipeline(Device* device, const ComputePipelineDescriptor* descriptor)
|
||||
: ComputePipelineBase(device, descriptor) {
|
||||
PerStage<const ShaderModule*> modules(nullptr);
|
||||
modules[dawn::ShaderStage::Compute] = ToBackend(descriptor->module);
|
||||
|
||||
PipelineGL::Initialize(ToBackend(descriptor->layout), modules);
|
||||
}
|
||||
|
||||
void ComputePipeline::ApplyNow() {
|
||||
|
||||
@@ -23,9 +23,11 @@
|
||||
|
||||
namespace dawn_native { namespace opengl {
|
||||
|
||||
class Device;
|
||||
|
||||
class ComputePipeline : public ComputePipelineBase, public PipelineGL {
|
||||
public:
|
||||
ComputePipeline(ComputePipelineBuilder* builder);
|
||||
ComputePipeline(Device* device, const ComputePipelineDescriptor* descriptor);
|
||||
|
||||
void ApplyNow();
|
||||
};
|
||||
|
||||
@@ -65,8 +65,9 @@ namespace dawn_native { namespace opengl {
|
||||
CommandBufferBase* Device::CreateCommandBuffer(CommandBufferBuilder* builder) {
|
||||
return new CommandBuffer(builder);
|
||||
}
|
||||
ComputePipelineBase* Device::CreateComputePipeline(ComputePipelineBuilder* builder) {
|
||||
return new ComputePipeline(builder);
|
||||
ResultOrError<ComputePipelineBase*> Device::CreateComputePipelineImpl(
|
||||
const ComputePipelineDescriptor* descriptor) {
|
||||
return new ComputePipeline(this, descriptor);
|
||||
}
|
||||
DepthStencilStateBase* Device::CreateDepthStencilState(DepthStencilStateBuilder* builder) {
|
||||
return new DepthStencilState(builder);
|
||||
|
||||
@@ -36,7 +36,6 @@ namespace dawn_native { namespace opengl {
|
||||
BlendStateBase* CreateBlendState(BlendStateBuilder* builder) override;
|
||||
BufferViewBase* CreateBufferView(BufferViewBuilder* builder) override;
|
||||
CommandBufferBase* CreateCommandBuffer(CommandBufferBuilder* builder) override;
|
||||
ComputePipelineBase* CreateComputePipeline(ComputePipelineBuilder* builder) override;
|
||||
DepthStencilStateBase* CreateDepthStencilState(DepthStencilStateBuilder* builder) override;
|
||||
InputStateBase* CreateInputState(InputStateBuilder* builder) override;
|
||||
RenderPassDescriptorBase* CreateRenderPassDescriptor(
|
||||
@@ -51,6 +50,8 @@ namespace dawn_native { namespace opengl {
|
||||
ResultOrError<BindGroupLayoutBase*> CreateBindGroupLayoutImpl(
|
||||
const BindGroupLayoutDescriptor* descriptor) override;
|
||||
ResultOrError<BufferBase*> CreateBufferImpl(const BufferDescriptor* descriptor) override;
|
||||
ResultOrError<ComputePipelineBase*> CreateComputePipelineImpl(
|
||||
const ComputePipelineDescriptor* descriptor) override;
|
||||
ResultOrError<PipelineLayoutBase*> CreatePipelineLayoutImpl(
|
||||
const PipelineLayoutDescriptor* descriptor) override;
|
||||
ResultOrError<QueueBase*> CreateQueueImpl() override;
|
||||
|
||||
@@ -43,7 +43,11 @@ namespace dawn_native { namespace opengl {
|
||||
|
||||
} // namespace
|
||||
|
||||
PipelineGL::PipelineGL(PipelineBase* parent, PipelineBuilder* builder) {
|
||||
PipelineGL::PipelineGL() {
|
||||
}
|
||||
|
||||
void PipelineGL::Initialize(const PipelineLayout* layout,
|
||||
const PerStage<const ShaderModule*>& modules) {
|
||||
auto CreateShader = [](GLenum type, const char* source) -> GLuint {
|
||||
GLuint shader = glCreateShader(type);
|
||||
glShaderSource(shader, 1, &source, nullptr);
|
||||
@@ -91,10 +95,15 @@ namespace dawn_native { namespace opengl {
|
||||
|
||||
mProgram = glCreateProgram();
|
||||
|
||||
for (auto stage : IterateStages(parent->GetStageMask())) {
|
||||
const ShaderModule* module = ToBackend(builder->GetStageInfo(stage).module.Get());
|
||||
dawn::ShaderStageBit activeStages = dawn::ShaderStageBit::None;
|
||||
for (dawn::ShaderStage stage : IterateStages(kAllStages)) {
|
||||
if (modules[stage] != nullptr) {
|
||||
activeStages |= StageBit(stage);
|
||||
}
|
||||
}
|
||||
|
||||
GLuint shader = CreateShader(GLShaderType(stage), module->GetSource());
|
||||
for (dawn::ShaderStage stage : IterateStages(activeStages)) {
|
||||
GLuint shader = CreateShader(GLShaderType(stage), modules[stage]->GetSource());
|
||||
glAttachShader(mProgram, shader);
|
||||
}
|
||||
|
||||
@@ -114,16 +123,14 @@ namespace dawn_native { namespace opengl {
|
||||
}
|
||||
}
|
||||
|
||||
for (auto stage : IterateStages(parent->GetStageMask())) {
|
||||
const ShaderModule* module = ToBackend(builder->GetStageInfo(stage).module.Get());
|
||||
FillPushConstants(module, &mGlPushConstants[stage], mProgram);
|
||||
for (dawn::ShaderStage stage : IterateStages(activeStages)) {
|
||||
FillPushConstants(modules[stage], &mGlPushConstants[stage], mProgram);
|
||||
}
|
||||
|
||||
glUseProgram(mProgram);
|
||||
|
||||
// The uniforms are part of the program state so we can pre-bind buffer units, texture units
|
||||
// etc.
|
||||
const auto& layout = ToBackend(parent->GetLayout());
|
||||
const auto& indices = layout->GetBindingIndexInfo();
|
||||
|
||||
for (uint32_t group : IterateBitSet(layout->GetBindGroupLayoutsMask())) {
|
||||
@@ -159,10 +166,8 @@ namespace dawn_native { namespace opengl {
|
||||
// Compute links between stages for combined samplers, then bind them to texture units
|
||||
{
|
||||
std::set<CombinedSampler> combinedSamplersSet;
|
||||
for (auto stage : IterateStages(parent->GetStageMask())) {
|
||||
const auto& module = ToBackend(builder->GetStageInfo(stage).module);
|
||||
|
||||
for (const auto& combined : module->GetCombinedSamplerInfo()) {
|
||||
for (dawn::ShaderStage stage : IterateStages(activeStages)) {
|
||||
for (const auto& combined : modules[stage]->GetCombinedSamplerInfo()) {
|
||||
combinedSamplersSet.insert(combined);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,11 +25,14 @@ namespace dawn_native { namespace opengl {
|
||||
|
||||
class Device;
|
||||
class PersistentPipelineState;
|
||||
class PipelineLayout;
|
||||
class ShaderModule;
|
||||
|
||||
class PipelineGL {
|
||||
public:
|
||||
PipelineGL(PipelineBase* parent, PipelineBuilder* builder);
|
||||
PipelineGL();
|
||||
|
||||
void Initialize(const PipelineLayout* layout, const PerStage<const ShaderModule*>& modules);
|
||||
|
||||
using GLPushConstantInfo = std::array<GLint, kMaxPushConstants>;
|
||||
using BindingLocations =
|
||||
|
||||
@@ -43,8 +43,13 @@ namespace dawn_native { namespace opengl {
|
||||
|
||||
RenderPipeline::RenderPipeline(RenderPipelineBuilder* builder)
|
||||
: RenderPipelineBase(builder),
|
||||
PipelineGL(this, builder),
|
||||
mGlPrimitiveTopology(GLPrimitiveTopology(GetPrimitiveTopology())) {
|
||||
PerStage<const ShaderModule*> modules(nullptr);
|
||||
for (dawn::ShaderStage stage : IterateStages(GetStageMask())) {
|
||||
modules[stage] = ToBackend(builder->GetStageInfo(stage).module.Get());
|
||||
}
|
||||
|
||||
PipelineGL::Initialize(ToBackend(GetLayout()), modules);
|
||||
}
|
||||
|
||||
GLenum RenderPipeline::GetGLPrimitiveTopology() const {
|
||||
|
||||
Reference in New Issue
Block a user