Update existing UBOs instead of replacing (#1198)

This commit is contained in:
mwilsnd
2023-06-02 14:51:07 -05:00
committed by Bart Louwers
parent 5dab47a5a2
commit 0f321fb11e
7 changed files with 70 additions and 16 deletions

View File

@@ -18,6 +18,7 @@ protected:
public:
virtual ~UniformBuffer() = default;
virtual void update(const void* data, std::size_t size_) = 0;
std::size_t getSize() const { return size; }

View File

@@ -16,6 +16,7 @@ public:
~UniformBufferGL() override;
BufferID getID() const { return id; }
void update(const void* data, std::size_t size_) override;
protected:
BufferID id = 0;

View File

@@ -1,7 +1,9 @@
#include <mbgl/gl/uniform_buffer_gl.hpp>
#include <mbgl/gl/defines.hpp>
#include <mbgl/platform/gl_functions.hpp>
#include <mbgl/util/logging.hpp>
#include <cassert>
namespace mbgl {
namespace gl {
@@ -12,7 +14,7 @@ UniformBufferGL::UniformBufferGL(const void* data, std::size_t size_)
: UniformBuffer(size_) {
MBGL_CHECK_ERROR(glGenBuffers(1, &id));
MBGL_CHECK_ERROR(glBindBuffer(GL_UNIFORM_BUFFER, id));
MBGL_CHECK_ERROR(glBufferData(GL_UNIFORM_BUFFER, size, data, GL_STATIC_DRAW));
MBGL_CHECK_ERROR(glBufferData(GL_UNIFORM_BUFFER, size, data, GL_DYNAMIC_DRAW));
MBGL_CHECK_ERROR(glBindBuffer(GL_UNIFORM_BUFFER, 0));
}
@@ -23,5 +25,19 @@ UniformBufferGL::~UniformBufferGL() {
}
}
void UniformBufferGL::update(const void* data, std::size_t size_) {
assert(size == size_);
if (size != size_) {
Log::Error(
Event::General,
"Mismatched size given to UBO update, expected " + std::to_string(size) + ", got " + std::to_string(size_));
return;
}
MBGL_CHECK_ERROR(glBindBuffer(GL_UNIFORM_BUFFER, id));
MBGL_CHECK_ERROR(glBufferSubData(GL_UNIFORM_BUFFER, 0, size_, data));
MBGL_CHECK_ERROR(glBindBuffer(GL_UNIFORM_BUFFER, 0));
}
} // namespace gl
} // namespace mbgl

View File

@@ -82,10 +82,14 @@ void BackgroundLayerTweaker::execute(LayerGroup& layerGroup, const RenderTree&,
BackgroundDrawableUBO drawableUBO;
drawableUBO.matrix = util::cast<float>(matrix);
auto drawableUniformBuffer = parameters.context.createUniformBuffer(&drawableUBO, sizeof(drawableUBO));
drawable.mutableUniformBuffers().addOrReplace("BackgroundDrawableUBO", std::move(drawableUniformBuffer));
gfx::UniformBufferPtr layerUniformBuffer;
if (auto& ubo = drawable.mutableUniformBuffers().get("BackgroundDrawableUBO")) {
ubo->update(&drawableUBO, sizeof(drawableUBO));
} else {
drawable.mutableUniformBuffers().addOrReplace(
"BackgroundDrawableUBO", parameters.context.createUniformBuffer(&drawableUBO, sizeof(drawableUBO)));
}
if (hasPattern) {
// TODO: add when raster is merged
// curShader->getSamplerLocation("u_image");
@@ -117,17 +121,29 @@ void BackgroundLayerTweaker::execute(LayerGroup& layerGroup, const RenderTree&,
/* .opacity = */ evaluated.get<BackgroundOpacity>(),
/* .pad = */ {0},
};
// TODO: Update UBOs in-place
layerUniformBuffer = parameters.context.createUniformBuffer(&layerUBO, sizeof(layerUBO));
if (auto& ubo = drawable.mutableUniformBuffers().get("BackgroundLayerUBO");
ubo->getSize() == sizeof(layerUBO)) {
ubo->update(&drawableUBO, sizeof(drawableUBO));
} else {
drawable.mutableUniformBuffers().addOrReplace(
"BackgroundLayerUBO", parameters.context.createUniformBuffer(&layerUBO, sizeof(layerUBO)));
}
} else {
const BackgroundLayerUBO layerUBO = {
/* .color = */ evaluated.get<BackgroundColor>(),
/* .opacity = */ evaluated.get<BackgroundOpacity>(),
/* .pad = */ {0, 0, 0},
};
layerUniformBuffer = parameters.context.createUniformBuffer(&layerUBO, sizeof(layerUBO));
if (auto& ubo = drawable.mutableUniformBuffers().get("BackgroundLayerUBO");
ubo->getSize() == sizeof(layerUBO)) {
ubo->update(&drawableUBO, sizeof(drawableUBO));
} else {
drawable.mutableUniformBuffers().addOrReplace(
"BackgroundLayerUBO", parameters.context.createUniformBuffer(&layerUBO, sizeof(layerUBO)));
}
}
drawable.mutableUniformBuffers().addOrReplace("BackgroundLayerUBO", std::move(layerUniformBuffer));
});
}

View File

@@ -60,7 +60,12 @@ void CircleLayerTweaker::execute(LayerGroup& layerGroup,
CirclePaintParamsUBO paintParamsUBO;
paintParamsUBO.camera_to_center_distance = parameters.state.getCameraToCenterDistance();
paintParamsUBO.device_pixel_ratio = parameters.pixelRatio;
auto paintParamsUniformBuffer = parameters.context.createUniformBuffer(&paintParamsUBO, sizeof(paintParamsUBO));
if (!paintParamsUniformBuffer) {
paintParamsUniformBuffer = parameters.context.createUniformBuffer(&paintParamsUBO, sizeof(paintParamsUBO));
} else {
paintParamsUniformBuffer->update(&paintParamsUBO, sizeof(CirclePaintParamsUBO));
}
const bool pitchWithMap = evaluated.get<CirclePitchAlignment>() == AlignmentType::Map;
@@ -87,7 +92,12 @@ void CircleLayerTweaker::execute(LayerGroup& layerGroup,
interpolateUBO.stroke_color_t = 0;
interpolateUBO.stroke_width_t = 0;
interpolateUBO.stroke_opacity_t = 0;
auto interpolateUniformBuffer = parameters.context.createUniformBuffer(&interpolateUBO, sizeof(interpolateUBO));
if (!interpolateUniformBuffer) {
interpolateUniformBuffer = parameters.context.createUniformBuffer(&interpolateUBO, sizeof(interpolateUBO));
} else {
interpolateUniformBuffer->update(&interpolateUBO, sizeof(CircleInterpolateUBO));
}
layerGroup.observeDrawables([&](gfx::Drawable& drawable) {
drawable.mutableUniformBuffers().addOrReplace("CirclePaintParamsUBO", paintParamsUniformBuffer);
@@ -112,8 +122,13 @@ void CircleLayerTweaker::execute(LayerGroup& layerGroup,
? std::array<float, 2>{{tileID.pixelsToTileUnits(1.0f, static_cast<float>(parameters.state.getZoom())),
tileID.pixelsToTileUnits(1.0f, static_cast<float>(parameters.state.getZoom()))}}
: parameters.pixelsToGLUnits;
auto drawableUniformBuffer = parameters.context.createUniformBuffer(&drawableUBO, sizeof(drawableUBO));
drawable.mutableUniformBuffers().addOrReplace("CircleDrawableUBO", drawableUniformBuffer);
if (auto& ubo = drawable.mutableUniformBuffers().get("CircleDrawableUBO")) {
ubo->update(&drawableUBO, sizeof(drawableUBO));
} else {
auto drawableUniformBuffer = parameters.context.createUniformBuffer(&drawableUBO, sizeof(drawableUBO));
drawable.mutableUniformBuffers().addOrReplace("CircleDrawableUBO", drawableUniformBuffer);
}
});
}

View File

@@ -23,7 +23,9 @@ public:
void execute(LayerGroup&, const RenderTree&, const PaintParameters&) override;
protected:
gfx::UniformBufferPtr paintParamsUniformBuffer = nullptr;
gfx::UniformBufferPtr evaluatedPropsUniformBuffer = nullptr;
gfx::UniformBufferPtr interpolateUniformBuffer = nullptr;
};
} // namespace mbgl

View File

@@ -115,9 +115,12 @@ void FillLayerTweaker::execute(LayerGroup& layerGroup,
/*.image=*/ // TextureAttachment(tile.getIconAtlasTexture().getResource(), Linear)
};
auto drawableUniformBuffer = parameters.context.createUniformBuffer(&drawableUBO, sizeof(drawableUBO));
drawable.mutableUniformBuffers().addOrReplace("FillDrawableUBO", drawableUniformBuffer);
if (auto& ubo = drawable.mutableUniformBuffers().get("FillDrawableUBO")) {
ubo->update(&drawableUBO, sizeof(drawableUBO));
} else {
drawable.mutableUniformBuffers().addOrReplace(
"FillDrawableUBO", parameters.context.createUniformBuffer(&drawableUBO, sizeof(drawableUBO)));
}
});
}
} // namespace mbgl