Program now needs a DriverApi

This will be needed soon so Program can check the feature level.
This commit is contained in:
Mathias Agopian
2022-08-19 16:23:39 -07:00
committed by Mathias Agopian
parent 3cc5f38da2
commit 22aa429059
16 changed files with 55 additions and 33 deletions
@@ -24,6 +24,8 @@
#include <utils/Log.h>
#include <utils/ostream.h>
#include <private/backend/DriverApiForward.h>
#include <backend/DriverEnums.h>
#include <array>
@@ -51,11 +53,14 @@ public:
using SamplerGroupInfo = std::array<SamplerGroupData, BINDING_COUNT>;
using UniformBlockInfo = std::array<utils::CString, BINDING_COUNT>;
Program() noexcept;
explicit Program(DriverApi& driver) noexcept;
Program(const Program& rhs) = delete;
Program& operator=(const Program& rhs) = delete;
Program(Program&& rhs) noexcept;
Program& operator=(Program&& rhs) noexcept;
~Program() noexcept;
// sets the material name and variant for diagnostic purposes only
@@ -65,7 +70,7 @@ public:
// sets one of the program's shader (e.g. vertex, fragment)
// string-based shaders are null terminated, consequently the size parameter must include the
// null terminating character.
Program& shader(ShaderType shader, void const* data, size_t size) noexcept;
Program& shader(ShaderType shader, void const* data, size_t size);
// sets the 'bindingPoint' uniform block's name for this program.
//
@@ -112,6 +117,7 @@ public:
private:
friend utils::io::ostream& operator<<(utils::io::ostream& out, const Program& builder);
DriverApi& mDriverApi;
UniformBlockInfo mUniformBlocks = {};
SamplerGroupInfo mSamplerGroups = {};
ShaderSource mShadersSource;
+17 -4
View File
@@ -20,10 +20,23 @@ using namespace utils;
namespace filament::backend {
// We want these in the .cpp file so they're not inlined (not worth it)
Program::Program() noexcept {} // = default; does not work with msvc because of noexcept
// We want these in the .cpp file, so they're not inlined (not worth it)
Program::Program(DriverApi& driver) noexcept
: mDriverApi(driver) {
}
Program::Program(Program&& rhs) noexcept = default;
Program& Program::operator=(Program&& rhs) noexcept = default;
Program& Program::operator=(Program&& rhs) noexcept {
mUniformBlocks.operator=(std::move(rhs.mUniformBlocks));
mSamplerGroups.operator=(std::move(rhs.mSamplerGroups));
mShadersSource.operator=(std::move(rhs.mShadersSource));
mHasSamplers = rhs.mHasSamplers;
mName.operator=(std::move(rhs.mName));
mLogger.operator=(std::move(rhs.mLogger));
return *this;
}
Program::~Program() noexcept = default;
Program& Program::diagnostics(utils::CString const& name,
@@ -33,7 +46,7 @@ Program& Program::diagnostics(utils::CString const& name,
return *this;
}
Program& Program::shader(ShaderType shader, void const* data, size_t size) noexcept {
Program& Program::shader(ShaderType shader, void const* data, size_t size) {
ShaderBlob blob(size);
std::copy_n((const uint8_t *)data, size, blob.data());
mShadersSource[size_t(shader)] = std::move(blob);
+2 -2
View File
@@ -180,8 +180,8 @@ ShaderGenerator::Blob ShaderGenerator::transpileShader(Backend backend, bool isM
return {};
}
Program ShaderGenerator::getProgram() noexcept {
Program program;
Program ShaderGenerator::getProgram(filament::backend::DriverApi& driverApi) noexcept {
Program program(driverApi);
program.shader(ShaderType::VERTEX, mVertexBlob.data(), mVertexBlob.size());
program.shader(ShaderType::FRAGMENT, mFragmentBlob.data(), mFragmentBlob.size());
return program;
+3 -2
View File
@@ -20,6 +20,7 @@
#include "PlatformRunner.h"
#include "private/backend/DriverApi.h"
#include "private/backend/Program.h"
#include <string>
@@ -35,14 +36,14 @@ public:
/**
* Generates shaders transpiled for the given backend / mobile combination.
* @param vertex The vertex shader, written in GLSL 450 core.
* @param fragment The framgnet shader, written in GLSL 450 core.
* @param fragment The fragment shader, written in GLSL 450 core.
*/
ShaderGenerator(std::string vertex, std::string fragment, Backend backend, bool isMobile) noexcept;
ShaderGenerator(const ShaderGenerator& rhs) = delete;
ShaderGenerator& operator=(const ShaderGenerator& rhs) = delete;
filament::backend::Program getProgram() noexcept;
filament::backend::Program getProgram(filament::backend::DriverApi& driverApi) noexcept;
private:
+3 -3
View File
@@ -416,7 +416,7 @@ TEST_F(BackendTest, DepthMinify) {
ProgramHandle program;
{
ShaderGenerator shaderGen(triangleVs, triangleFs, sBackend, sIsMobilePlatform);
Program prog = shaderGen.getProgram();
Program prog = shaderGen.getProgram(api);
Program::Sampler psamplers[] = { utils::CString("tex"), 0, false };
prog.setSamplerGroup(0, ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0]));
prog.setUniformBlock(1, "params");
@@ -558,7 +558,7 @@ TEST_F(BackendTest, ColorResolve) {
ProgramHandle program;
{
ShaderGenerator shaderGen(triangleVs, triangleFs, sBackend, sIsMobilePlatform);
Program prog = shaderGen.getProgram();
Program prog = shaderGen.getProgram(api);
Program::Sampler psamplers[] = { utils::CString("tex"), 0, false };
prog.setSamplerGroup(0, ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0]));
prog.setUniformBlock(1, "params");
@@ -666,7 +666,7 @@ TEST_F(BackendTest, DepthResolve) {
ProgramHandle program;
{
ShaderGenerator shaderGen(triangleVs, triangleFs, sBackend, sIsMobilePlatform);
Program prog = shaderGen.getProgram();
Program prog = shaderGen.getProgram(api);
Program::Sampler psamplers[] = { utils::CString("tex"), 0, false };
prog.setSamplerGroup(0, ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0]));
prog.setUniformBlock(1, "params");
+2 -2
View File
@@ -95,7 +95,7 @@ TEST_F(BackendTest, VertexBufferUpdate) {
// Create a program.
ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform);
Program p = shaderGen.getProgram();
Program p = shaderGen.getProgram(getDriverApi());
auto program = getDriverApi().createProgram(std::move(p));
auto defaultRenderTarget = getDriverApi().createDefaultRenderTarget(0);
@@ -201,7 +201,7 @@ TEST_F(BackendTest, BufferObjectUpdateWithOffset) {
// Create a program.
ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform);
Program p = shaderGen.getProgram();
Program p = shaderGen.getProgram(getDriverApi());
p.setUniformBlock(1, "params");
auto program = getDriverApi().createProgram(std::move(p));
+1 -1
View File
@@ -132,7 +132,7 @@ TEST_F(BackendTest, FeedbackLoops) {
ProgramHandle program;
{
ShaderGenerator shaderGen(fullscreenVs, fullscreenFs, sBackend, sIsMobilePlatform);
Program prog = shaderGen.getProgram();
Program prog = shaderGen.getProgram(api);
Program::Sampler psamplers[] = { utils::CString("tex"), 0, false };
prog.setSamplerGroup(0, ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0]));
prog.setUniformBlock(1, "params");
+4 -4
View File
@@ -347,7 +347,7 @@ TEST_F(BackendTest, UpdateImage2D) {
std::string fragment = stringReplace("{samplerType}",
getSamplerTypeName(t.textureFormat), fragmentTemplate);
ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform);
Program prog = shaderGen.getProgram();
Program prog = shaderGen.getProgram(api);
Program::Sampler psamplers[] = { utils::CString("tex"), 0, false };
prog.setSamplerGroup(0, ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0]));
program = api.createProgram(std::move(prog));
@@ -426,7 +426,7 @@ TEST_F(BackendTest, UpdateImageSRGB) {
std::string fragment = stringReplace("{samplerType}",
getSamplerTypeName(textureFormat), fragmentTemplate);
ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform);
Program prog = shaderGen.getProgram();
Program prog = shaderGen.getProgram(api);
Program::Sampler psamplers[] = { utils::CString("tex"), 0, false };
prog.setSamplerGroup(0, ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0]));
ProgramHandle program = api.createProgram(std::move(prog));
@@ -512,7 +512,7 @@ TEST_F(BackendTest, UpdateImageMipLevel) {
std::string fragment = stringReplace("{samplerType}",
getSamplerTypeName(textureFormat), fragmentUpdateImageMip);
ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform);
Program prog = shaderGen.getProgram();
Program prog = shaderGen.getProgram(api);
Program::Sampler psamplers[] = { utils::CString("tex"), 0, false };
prog.setSamplerGroup(0, ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0]));
ProgramHandle program = api.createProgram(std::move(prog));
@@ -584,7 +584,7 @@ TEST_F(BackendTest, UpdateImage3D) {
std::string fragment = stringReplace("{samplerType}",
getSamplerTypeName(samplerType), fragmentUpdateImage3DTemplate);
ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform);
Program prog = shaderGen.getProgram();
Program prog = shaderGen.getProgram(api);
Program::Sampler psamplers[] = { utils::CString("tex"), 0, false };
prog.setSamplerGroup(0, ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0]));
ProgramHandle program = api.createProgram(std::move(prog));
+1 -1
View File
@@ -69,7 +69,7 @@ TEST_F(BackendTest, MRT) {
// Create a program.
ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform);
Program p = shaderGen.getProgram();
Program p = shaderGen.getProgram(getDriverApi());
auto program = getDriverApi().createProgram(std::move(p));
TrianglePrimitive triangle(getDriverApi());
@@ -76,7 +76,7 @@ TEST_F(BackendTest, MissingRequiredAttributes) {
// Create a program.
ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform);
Program p = shaderGen.getProgram();
Program p = shaderGen.getProgram(getDriverApi());
auto program = getDriverApi().createProgram(std::move(p));
auto defaultRenderTarget = getDriverApi().createDefaultRenderTarget(0);
+3 -3
View File
@@ -238,12 +238,12 @@ TEST_F(ReadPixelsTest, ReadPixels) {
Handle<HwProgram> programFloat, programUint;
{
ShaderGenerator shaderGen(vertex, fragmentFloat, sBackend, sIsMobilePlatform);
Program p = shaderGen.getProgram();
Program p = shaderGen.getProgram(getDriverApi());
programFloat = getDriverApi().createProgram(std::move(p));
}
{
ShaderGenerator shaderGen(vertex, fragmentUint, sBackend, sIsMobilePlatform);
Program p = shaderGen.getProgram();
Program p = shaderGen.getProgram(getDriverApi());
programUint = getDriverApi().createProgram(std::move(p));
}
@@ -385,7 +385,7 @@ TEST_F(ReadPixelsTest, ReadPixelsPerformance) {
// Create a program.
ShaderGenerator shaderGen(vertex, fragmentFloat, sBackend, sIsMobilePlatform);
Program p = shaderGen.getProgram();
Program p = shaderGen.getProgram(getDriverApi());
auto program = getDriverApi().createProgram(std::move(p));
// Create a Texture and RenderTarget to render into.
@@ -66,7 +66,7 @@ TEST_F(BackendTest, RenderExternalImageWithoutSet) {
ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform);
// Create a program that samples a texture.
Program p = shaderGen.getProgram();
Program p = shaderGen.getProgram(getDriverApi());
Program::Sampler sampler { utils::CString("tex"), 6 };
p.setSamplerGroup(0, ALL_SHADER_STAGE_FLAGS, &sampler, 1);
backend::Handle<HwProgram> program = getDriverApi().createProgram(std::move(p));
@@ -140,7 +140,7 @@ TEST_F(BackendTest, RenderExternalImage) {
ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform);
// Create a program that samples a texture.
Program p = shaderGen.getProgram();
Program p = shaderGen.getProgram(getDriverApi());
Program::Sampler sampler { utils::CString("tex"), 6 };
p.setSamplerGroup(0, ALL_SHADER_STAGE_FLAGS, &sampler, 1);
auto program = getDriverApi().createProgram(std::move(p));
+1 -1
View File
@@ -85,7 +85,7 @@ TEST_F(BackendTest, ScissorViewportRegion) {
// Create a program.
ShaderGenerator shaderGen(triangleVs, triangleFs, sBackend, sIsMobilePlatform);
Program p = shaderGen.getProgram();
Program p = shaderGen.getProgram(api);
ProgramHandle program = api.createProgram(std::move(p));
// Create source color and depth textures.
+1 -1
View File
@@ -75,7 +75,7 @@ public:
// Create a program.
ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform);
Program p = shaderGen.getProgram();
Program p = shaderGen.getProgram(api);
program = api.createProgram(std::move(p));
}
+3 -1
View File
@@ -136,7 +136,7 @@ public:
~FEngine() noexcept;
backend::Driver& getDriver() const noexcept { return *mDriver; }
backend::ShaderModel getShaderModel() const noexcept { return getDriver().getShaderModel(); }
DriverApi& getDriverApi() noexcept {
return *std::launder(reinterpret_cast<DriverApi*>(&mDriverApiStorage));
@@ -384,6 +384,8 @@ private:
int loop();
void flushCommandBuffer(backend::CommandBufferQueue& commandBufferQueue);
backend::Driver& getDriver() const noexcept { return *mDriver; }
template<typename T>
bool terminateAndDestroy(const T* p, ResourceList<T>& list);
+3 -3
View File
@@ -108,7 +108,7 @@ Material* Material::Builder::build(Engine& engine) {
utils::bitset32 shaderModels;
shaderModels.setValue(v);
ShaderModel shaderModel = upcast(engine).getDriver().getShaderModel();
ShaderModel shaderModel = upcast(engine).getShaderModel();
if (!shaderModels.test(static_cast<uint32_t>(shaderModel))) {
CString name;
materialParser->getName(&name);
@@ -424,7 +424,7 @@ Program FMaterial::getProgramBuilderWithVariants(
Variant variant,
Variant vertexVariant,
Variant fragmentVariant) const noexcept {
const ShaderModel sm = mEngine.getDriver().getShaderModel();
const ShaderModel sm = mEngine.getShaderModel();
const bool isNoop = mEngine.getBackend() == Backend::NOOP;
/*
@@ -455,7 +455,7 @@ Program FMaterial::getProgramBuilderWithVariants(
"GLSL or SPIR-V chunks for the fragment shader (variant=0x%x, filtered=0x%x).",
mName.c_str(), variant.key, fragmentVariant.key);
Program pb;
Program pb(mEngine.getDriverApi());
pb.diagnostics(mName,
[this, variant](io::ostream& out) -> io::ostream& {
return out << mName.c_str_safe()