mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 10:17:40 +02:00
Merge pull request #12892 from SimonWalton-HiFi/batch-compile-shaders
Batch compile shaders
This commit is contained in:
commit
86c9b8c61d
6 changed files with 65 additions and 56 deletions
|
@ -142,15 +142,18 @@ void DrawHaze::run(const render::RenderContextPointer& renderContext, const Inpu
|
||||||
// Mask out haze on the tablet
|
// Mask out haze on the tablet
|
||||||
PrepareStencil::testMask(*state);
|
PrepareStencil::testMask(*state);
|
||||||
|
|
||||||
gpu::Shader::BindingSet slotBindings;
|
|
||||||
slotBindings.insert(gpu::Shader::Binding(std::string("hazeBuffer"), HazeEffect_ParamsSlot));
|
|
||||||
slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), HazeEffect_TransformBufferSlot));
|
|
||||||
slotBindings.insert(gpu::Shader::Binding(std::string("colorMap"), HazeEffect_ColorMapSlot));
|
|
||||||
slotBindings.insert(gpu::Shader::Binding(std::string("linearDepthMap"), HazeEffect_LinearDepthMapSlot));
|
|
||||||
slotBindings.insert(gpu::Shader::Binding(std::string("keyLightBuffer"), HazeEffect_LightingMapSlot));
|
|
||||||
gpu::Shader::makeProgram(*program, slotBindings);
|
|
||||||
|
|
||||||
_hazePipeline = gpu::PipelinePointer(gpu::Pipeline::create(program, state));
|
_hazePipeline = gpu::PipelinePointer(gpu::Pipeline::create(program, state));
|
||||||
|
gpu::doInBatch("DrawHaze::build", args->_context, [program](gpu::Batch& batch) {
|
||||||
|
batch.runLambda([program]() {
|
||||||
|
gpu::Shader::BindingSet slotBindings;
|
||||||
|
slotBindings.insert(gpu::Shader::Binding(std::string("hazeBuffer"), HazeEffect_ParamsSlot));
|
||||||
|
slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), HazeEffect_TransformBufferSlot));
|
||||||
|
slotBindings.insert(gpu::Shader::Binding(std::string("colorMap"), HazeEffect_ColorMapSlot));
|
||||||
|
slotBindings.insert(gpu::Shader::Binding(std::string("linearDepthMap"), HazeEffect_LinearDepthMapSlot));
|
||||||
|
slotBindings.insert(gpu::Shader::Binding(std::string("keyLightBuffer"), HazeEffect_LightingMapSlot));
|
||||||
|
gpu::Shader::makeProgram(*program, slotBindings);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
auto sourceFramebufferSize = glm::ivec2(inputBuffer->getDimensions());
|
auto sourceFramebufferSize = glm::ivec2(inputBuffer->getDimensions());
|
||||||
|
|
|
@ -311,9 +311,6 @@ void diffuseProfileGPU(gpu::TexturePointer& profileMap, RenderArgs* args) {
|
||||||
auto ps = subsurfaceScattering_makeProfile_frag::getShader();
|
auto ps = subsurfaceScattering_makeProfile_frag::getShader();
|
||||||
gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps);
|
gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps);
|
||||||
|
|
||||||
gpu::Shader::BindingSet slotBindings;
|
|
||||||
gpu::Shader::makeProgram(*program, slotBindings);
|
|
||||||
|
|
||||||
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
||||||
|
|
||||||
makePipeline = gpu::Pipeline::create(program, state);
|
makePipeline = gpu::Pipeline::create(program, state);
|
||||||
|
@ -342,26 +339,27 @@ void diffuseScatterGPU(const gpu::TexturePointer& profileMap, gpu::TexturePointe
|
||||||
int height = lut->getHeight();
|
int height = lut->getHeight();
|
||||||
|
|
||||||
gpu::PipelinePointer makePipeline;
|
gpu::PipelinePointer makePipeline;
|
||||||
{
|
|
||||||
auto vs = gpu::StandardShaderLib::getDrawUnitQuadTexcoordVS();
|
auto vs = gpu::StandardShaderLib::getDrawUnitQuadTexcoordVS();
|
||||||
auto ps = subsurfaceScattering_makeLUT_frag::getShader();
|
auto ps = subsurfaceScattering_makeLUT_frag::getShader();
|
||||||
gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps);
|
gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps);
|
||||||
|
|
||||||
gpu::Shader::BindingSet slotBindings;
|
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
||||||
slotBindings.insert(gpu::Shader::Binding(std::string("scatteringProfile"), 0));
|
|
||||||
gpu::Shader::makeProgram(*program, slotBindings);
|
|
||||||
|
|
||||||
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
|
||||||
|
|
||||||
makePipeline = gpu::Pipeline::create(program, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
makePipeline = gpu::Pipeline::create(program, state);
|
||||||
|
|
||||||
auto makeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("diffuseScatter"));
|
auto makeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("diffuseScatter"));
|
||||||
makeFramebuffer->setRenderBuffer(0, lut);
|
makeFramebuffer->setRenderBuffer(0, lut);
|
||||||
|
|
||||||
gpu::doInBatch("SubsurfaceScattering::diffuseScatterGPU", args->_context, [=](gpu::Batch& batch) {
|
gpu::doInBatch("SubsurfaceScattering::diffuseScatterGPU", args->_context, [=](gpu::Batch& batch) {
|
||||||
batch.enableStereo(false);
|
batch.enableStereo(false);
|
||||||
|
|
||||||
|
batch.runLambda([program] (){
|
||||||
|
gpu::Shader::BindingSet slotBindings;
|
||||||
|
slotBindings.insert(gpu::Shader::Binding(std::string("scatteringProfile"), 0));
|
||||||
|
gpu::Shader::makeProgram(*program, slotBindings);
|
||||||
|
});
|
||||||
|
|
||||||
batch.setViewportTransform(glm::ivec4(0, 0, width, height));
|
batch.setViewportTransform(glm::ivec4(0, 0, width, height));
|
||||||
|
|
||||||
batch.setFramebuffer(makeFramebuffer);
|
batch.setFramebuffer(makeFramebuffer);
|
||||||
|
@ -385,9 +383,6 @@ void computeSpecularBeckmannGPU(gpu::TexturePointer& beckmannMap, RenderArgs* ar
|
||||||
auto ps = subsurfaceScattering_makeSpecularBeckmann_frag::getShader();
|
auto ps = subsurfaceScattering_makeSpecularBeckmann_frag::getShader();
|
||||||
gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps);
|
gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps);
|
||||||
|
|
||||||
gpu::Shader::BindingSet slotBindings;
|
|
||||||
gpu::Shader::makeProgram(*program, slotBindings);
|
|
||||||
|
|
||||||
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
||||||
|
|
||||||
makePipeline = gpu::Pipeline::create(program, state);
|
makePipeline = gpu::Pipeline::create(program, state);
|
||||||
|
@ -495,7 +490,6 @@ gpu::PipelinePointer DebugSubsurfaceScattering::getShowLUTPipeline() {
|
||||||
gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps);
|
gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps);
|
||||||
|
|
||||||
gpu::Shader::BindingSet slotBindings;
|
gpu::Shader::BindingSet slotBindings;
|
||||||
gpu::Shader::makeProgram(*program, slotBindings);
|
|
||||||
|
|
||||||
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
||||||
|
|
||||||
|
|
|
@ -167,7 +167,7 @@ void LinearDepthPass::run(const render::RenderContextPointer& renderContext, con
|
||||||
outputs.edit3() = halfLinearDepthTexture;
|
outputs.edit3() = halfLinearDepthTexture;
|
||||||
outputs.edit4() = halfNormalTexture;
|
outputs.edit4() = halfNormalTexture;
|
||||||
|
|
||||||
auto linearDepthPipeline = getLinearDepthPipeline();
|
auto linearDepthPipeline = getLinearDepthPipeline(renderContext);
|
||||||
auto downsamplePipeline = getDownsamplePipeline();
|
auto downsamplePipeline = getDownsamplePipeline();
|
||||||
|
|
||||||
auto depthViewport = args->_viewport;
|
auto depthViewport = args->_viewport;
|
||||||
|
@ -209,17 +209,12 @@ void LinearDepthPass::run(const render::RenderContextPointer& renderContext, con
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const gpu::PipelinePointer& LinearDepthPass::getLinearDepthPipeline() {
|
const gpu::PipelinePointer& LinearDepthPass::getLinearDepthPipeline(const render::RenderContextPointer& renderContext) {
|
||||||
|
gpu::ShaderPointer program;
|
||||||
if (!_linearDepthPipeline) {
|
if (!_linearDepthPipeline) {
|
||||||
auto vs = gpu::StandardShaderLib::getDrawViewportQuadTransformTexcoordVS();
|
auto vs = gpu::StandardShaderLib::getDrawViewportQuadTransformTexcoordVS();
|
||||||
auto ps = surfaceGeometry_makeLinearDepth_frag::getShader();
|
auto ps = surfaceGeometry_makeLinearDepth_frag::getShader();
|
||||||
gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps);
|
program = gpu::Shader::createProgram(vs, ps);
|
||||||
|
|
||||||
gpu::Shader::BindingSet slotBindings;
|
|
||||||
slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), DepthLinearPass_FrameTransformSlot));
|
|
||||||
slotBindings.insert(gpu::Shader::Binding(std::string("depthMap"), DepthLinearPass_DepthMapSlot));
|
|
||||||
gpu::Shader::makeProgram(*program, slotBindings);
|
|
||||||
|
|
||||||
|
|
||||||
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
||||||
|
|
||||||
|
@ -230,8 +225,18 @@ const gpu::PipelinePointer& LinearDepthPass::getLinearDepthPipeline() {
|
||||||
|
|
||||||
// Good to go add the brand new pipeline
|
// Good to go add the brand new pipeline
|
||||||
_linearDepthPipeline = gpu::Pipeline::create(program, state);
|
_linearDepthPipeline = gpu::Pipeline::create(program, state);
|
||||||
|
|
||||||
|
gpu::doInBatch("LinearDepthPass::run", renderContext->args->_context, [program](gpu::Batch& batch) {
|
||||||
|
batch.runLambda([program]() {
|
||||||
|
gpu::Shader::BindingSet slotBindings;
|
||||||
|
slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), DepthLinearPass_FrameTransformSlot));
|
||||||
|
slotBindings.insert(gpu::Shader::Binding(std::string("depthMap"), DepthLinearPass_DepthMapSlot));
|
||||||
|
gpu::Shader::makeProgram(*program, slotBindings);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return _linearDepthPipeline;
|
return _linearDepthPipeline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,7 +460,7 @@ void SurfaceGeometryPass::run(const render::RenderContextPointer& renderContext,
|
||||||
outputs.edit2() = curvatureFramebuffer;
|
outputs.edit2() = curvatureFramebuffer;
|
||||||
outputs.edit3() = lowCurvatureFramebuffer;
|
outputs.edit3() = lowCurvatureFramebuffer;
|
||||||
|
|
||||||
auto curvaturePipeline = getCurvaturePipeline();
|
auto curvaturePipeline = getCurvaturePipeline(renderContext);
|
||||||
auto diffuseVPipeline = _diffusePass.getBlurVPipeline();
|
auto diffuseVPipeline = _diffusePass.getBlurVPipeline();
|
||||||
auto diffuseHPipeline = _diffusePass.getBlurHPipeline();
|
auto diffuseHPipeline = _diffusePass.getBlurHPipeline();
|
||||||
|
|
||||||
|
@ -536,21 +541,12 @@ void SurfaceGeometryPass::run(const render::RenderContextPointer& renderContext,
|
||||||
config->setGPUBatchRunTime(_gpuTimer->getGPUAverage(), _gpuTimer->getBatchAverage());
|
config->setGPUBatchRunTime(_gpuTimer->getGPUAverage(), _gpuTimer->getBatchAverage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const gpu::PipelinePointer& SurfaceGeometryPass::getCurvaturePipeline(const render::RenderContextPointer& renderContext) {
|
||||||
const gpu::PipelinePointer& SurfaceGeometryPass::getCurvaturePipeline() {
|
|
||||||
if (!_curvaturePipeline) {
|
if (!_curvaturePipeline) {
|
||||||
auto vs = gpu::StandardShaderLib::getDrawViewportQuadTransformTexcoordVS();
|
auto vs = gpu::StandardShaderLib::getDrawViewportQuadTransformTexcoordVS();
|
||||||
auto ps = surfaceGeometry_makeCurvature_frag::getShader();
|
auto ps = surfaceGeometry_makeCurvature_frag::getShader();
|
||||||
gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps);
|
gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps);
|
||||||
|
|
||||||
gpu::Shader::BindingSet slotBindings;
|
|
||||||
slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), SurfaceGeometryPass_FrameTransformSlot));
|
|
||||||
slotBindings.insert(gpu::Shader::Binding(std::string("surfaceGeometryParamsBuffer"), SurfaceGeometryPass_ParamsSlot));
|
|
||||||
slotBindings.insert(gpu::Shader::Binding(std::string("depthMap"), SurfaceGeometryPass_DepthMapSlot));
|
|
||||||
slotBindings.insert(gpu::Shader::Binding(std::string("normalMap"), SurfaceGeometryPass_NormalMapSlot));
|
|
||||||
gpu::Shader::makeProgram(*program, slotBindings);
|
|
||||||
|
|
||||||
|
|
||||||
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
||||||
|
|
||||||
#ifdef USE_STENCIL_TEST
|
#ifdef USE_STENCIL_TEST
|
||||||
|
@ -559,6 +555,17 @@ const gpu::PipelinePointer& SurfaceGeometryPass::getCurvaturePipeline() {
|
||||||
#endif
|
#endif
|
||||||
// Good to go add the brand new pipeline
|
// Good to go add the brand new pipeline
|
||||||
_curvaturePipeline = gpu::Pipeline::create(program, state);
|
_curvaturePipeline = gpu::Pipeline::create(program, state);
|
||||||
|
|
||||||
|
gpu::doInBatch("SurfaceGeometryPass::CurvaturePipeline", renderContext->args->_context, [program](gpu::Batch& batch) {
|
||||||
|
batch.runLambda([program]() {
|
||||||
|
gpu::Shader::BindingSet slotBindings;
|
||||||
|
slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), SurfaceGeometryPass_FrameTransformSlot));
|
||||||
|
slotBindings.insert(gpu::Shader::Binding(std::string("surfaceGeometryParamsBuffer"), SurfaceGeometryPass_ParamsSlot));
|
||||||
|
slotBindings.insert(gpu::Shader::Binding(std::string("depthMap"), SurfaceGeometryPass_DepthMapSlot));
|
||||||
|
slotBindings.insert(gpu::Shader::Binding(std::string("normalMap"), SurfaceGeometryPass_NormalMapSlot));
|
||||||
|
gpu::Shader::makeProgram(*program, slotBindings);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return _curvaturePipeline;
|
return _curvaturePipeline;
|
||||||
|
|
|
@ -81,7 +81,7 @@ private:
|
||||||
|
|
||||||
LinearDepthFramebufferPointer _linearDepthFramebuffer;
|
LinearDepthFramebufferPointer _linearDepthFramebuffer;
|
||||||
|
|
||||||
const gpu::PipelinePointer& getLinearDepthPipeline();
|
const gpu::PipelinePointer& getLinearDepthPipeline(const render::RenderContextPointer& renderContext);
|
||||||
gpu::PipelinePointer _linearDepthPipeline;
|
gpu::PipelinePointer _linearDepthPipeline;
|
||||||
|
|
||||||
const gpu::PipelinePointer& getDownsamplePipeline();
|
const gpu::PipelinePointer& getDownsamplePipeline();
|
||||||
|
@ -195,7 +195,7 @@ private:
|
||||||
|
|
||||||
SurfaceGeometryFramebufferPointer _surfaceGeometryFramebuffer;
|
SurfaceGeometryFramebufferPointer _surfaceGeometryFramebuffer;
|
||||||
|
|
||||||
const gpu::PipelinePointer& getCurvaturePipeline();
|
const gpu::PipelinePointer& getCurvaturePipeline(const render::RenderContextPointer& renderContext);
|
||||||
|
|
||||||
gpu::PipelinePointer _curvaturePipeline;
|
gpu::PipelinePointer _curvaturePipeline;
|
||||||
|
|
||||||
|
|
|
@ -27,19 +27,24 @@ ToneMappingEffect::ToneMappingEffect() {
|
||||||
_parametersBuffer = gpu::BufferView(std::make_shared<gpu::Buffer>(sizeof(Parameters), (const gpu::Byte*) ¶meters));
|
_parametersBuffer = gpu::BufferView(std::make_shared<gpu::Buffer>(sizeof(Parameters), (const gpu::Byte*) ¶meters));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToneMappingEffect::init() {
|
void ToneMappingEffect::init(RenderArgs* args) {
|
||||||
auto blitPS = toneMapping_frag::getShader();
|
auto blitPS = toneMapping_frag::getShader();
|
||||||
|
|
||||||
auto blitVS = gpu::StandardShaderLib::getDrawViewportQuadTransformTexcoordVS();
|
auto blitVS = gpu::StandardShaderLib::getDrawViewportQuadTransformTexcoordVS();
|
||||||
auto blitProgram = gpu::ShaderPointer(gpu::Shader::createProgram(blitVS, blitPS));
|
auto blitProgram = gpu::ShaderPointer(gpu::Shader::createProgram(blitVS, blitPS));
|
||||||
|
|
||||||
gpu::Shader::BindingSet slotBindings;
|
|
||||||
slotBindings.insert(gpu::Shader::Binding(std::string("toneMappingParamsBuffer"), ToneMappingEffect_ParamsSlot));
|
|
||||||
slotBindings.insert(gpu::Shader::Binding(std::string("colorMap"), ToneMappingEffect_LightingMapSlot));
|
|
||||||
gpu::Shader::makeProgram(*blitProgram, slotBindings);
|
|
||||||
auto blitState = std::make_shared<gpu::State>();
|
auto blitState = std::make_shared<gpu::State>();
|
||||||
blitState->setColorWriteMask(true, true, true, true);
|
blitState->setColorWriteMask(true, true, true, true);
|
||||||
_blitLightBuffer = gpu::PipelinePointer(gpu::Pipeline::create(blitProgram, blitState));
|
_blitLightBuffer = gpu::PipelinePointer(gpu::Pipeline::create(blitProgram, blitState));
|
||||||
|
|
||||||
|
gpu::doInBatch("ToneMappingEffect::toneMapping", args->_context, [blitProgram](gpu::Batch& batch) {
|
||||||
|
batch.runLambda([blitProgram]() {
|
||||||
|
gpu::Shader::BindingSet slotBindings;
|
||||||
|
slotBindings.insert(gpu::Shader::Binding(std::string("toneMappingParamsBuffer"), ToneMappingEffect_ParamsSlot));
|
||||||
|
slotBindings.insert(gpu::Shader::Binding(std::string("colorMap"), ToneMappingEffect_LightingMapSlot));
|
||||||
|
gpu::Shader::makeProgram(*blitProgram, slotBindings);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToneMappingEffect::setExposure(float exposure) {
|
void ToneMappingEffect::setExposure(float exposure) {
|
||||||
|
@ -59,7 +64,7 @@ void ToneMappingEffect::setToneCurve(ToneCurve curve) {
|
||||||
|
|
||||||
void ToneMappingEffect::render(RenderArgs* args, const gpu::TexturePointer& lightingBuffer, const gpu::FramebufferPointer& requestedDestinationFramebuffer) {
|
void ToneMappingEffect::render(RenderArgs* args, const gpu::TexturePointer& lightingBuffer, const gpu::FramebufferPointer& requestedDestinationFramebuffer) {
|
||||||
if (!_blitLightBuffer) {
|
if (!_blitLightBuffer) {
|
||||||
init();
|
init(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto destinationFramebuffer = requestedDestinationFramebuffer;
|
auto destinationFramebuffer = requestedDestinationFramebuffer;
|
||||||
|
|
|
@ -59,7 +59,7 @@ private:
|
||||||
typedef gpu::BufferView UniformBufferView;
|
typedef gpu::BufferView UniformBufferView;
|
||||||
gpu::BufferView _parametersBuffer;
|
gpu::BufferView _parametersBuffer;
|
||||||
|
|
||||||
void init();
|
void init(RenderArgs* args);
|
||||||
};
|
};
|
||||||
|
|
||||||
class ToneMappingConfig : public render::Job::Config {
|
class ToneMappingConfig : public render::Job::Config {
|
||||||
|
|
Loading…
Reference in a new issue