Program now needs a DriverApi
This will be needed soon so Program can check the feature level.
This commit is contained in:
committed by
Mathias Agopian
parent
3cc5f38da2
commit
22aa429059
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user