mirror of
https://github.com/overte-org/overte.git
synced 2025-04-15 12:28:51 +02:00
Backing up to master
This commit is contained in:
parent
5e3c79d197
commit
55611d2373
5 changed files with 2 additions and 128 deletions
|
@ -295,8 +295,7 @@ void DrawStateSortDeferred::run(const SceneContextPointer& sceneContext, const R
|
|||
batch.setUniformBuffer(render::ShapePipeline::Slot::LIGHTING_MODEL, lightingModel->getParametersBuffer());
|
||||
|
||||
if (_stateSort) {
|
||||
// renderStateSortShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn);
|
||||
renderStateSortShapesCapped(sceneContext, renderContext, _shapePlumber, inItems, _maxTimeBudget, _maxDrawn);
|
||||
renderStateSortShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn);
|
||||
} else {
|
||||
renderShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn);
|
||||
}
|
||||
|
|
|
@ -85,7 +85,6 @@ class DrawStateSortConfig : public render::Job::Config {
|
|||
Q_OBJECT
|
||||
Q_PROPERTY(int numDrawn READ getNumDrawn NOTIFY numDrawnChanged)
|
||||
Q_PROPERTY(int maxDrawn MEMBER maxDrawn NOTIFY dirty)
|
||||
Q_PROPERTY(float maxTimeBudget MEMBER maxTimeBudget NOTIFY dirty)
|
||||
Q_PROPERTY(bool stateSort MEMBER stateSort NOTIFY dirty)
|
||||
public:
|
||||
|
||||
|
@ -93,7 +92,6 @@ public:
|
|||
void setNumDrawn(int num) { numDrawn = num; emit numDrawnChanged(); }
|
||||
|
||||
int maxDrawn{ -1 };
|
||||
float maxTimeBudget { 8.0f }; // 8ms maximum
|
||||
bool stateSort{ true };
|
||||
|
||||
signals:
|
||||
|
@ -113,13 +111,12 @@ public:
|
|||
|
||||
DrawStateSortDeferred(render::ShapePlumberPointer shapePlumber) : _shapePlumber{ shapePlumber } {}
|
||||
|
||||
void configure(const Config& config) { _maxDrawn = config.maxDrawn; _maxTimeBudget = config.maxTimeBudget; _stateSort = config.stateSort; }
|
||||
void configure(const Config& config) { _maxDrawn = config.maxDrawn; _stateSort = config.stateSort; }
|
||||
void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs);
|
||||
|
||||
protected:
|
||||
render::ShapePlumberPointer _shapePlumber;
|
||||
int _maxDrawn; // initialized by Config
|
||||
float _maxTimeBudget; //ms time budget
|
||||
bool _stateSort;
|
||||
};
|
||||
|
||||
|
|
|
@ -123,111 +123,6 @@ void render::renderStateSortShapes(const SceneContextPointer& sceneContext, cons
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void render::renderStateSortShapesCapped(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, double mstimeBudget, int maxDrawnItems) {
|
||||
|
||||
auto& scene = sceneContext->_scene;
|
||||
RenderArgs* args = renderContext->args;
|
||||
auto now = usecTimestampNow();
|
||||
|
||||
int numItemsToDraw = (int)inItems.size();
|
||||
if (maxDrawnItems != -1) {
|
||||
numItemsToDraw = glm::min(numItemsToDraw, maxDrawnItems);
|
||||
}
|
||||
|
||||
using SortedPipelines = std::vector<render::ShapeKey>;
|
||||
using SortedShapes = std::unordered_map<render::ShapeKey, std::vector<Item>, render::ShapeKey::Hash, render::ShapeKey::KeyEqual>;
|
||||
SortedPipelines sortedPipelines;
|
||||
SortedShapes sortedShapes;
|
||||
std::vector<Item> ownPipelineBucket;
|
||||
|
||||
{
|
||||
PROFILE_RANGE(render_detail, "sort");
|
||||
|
||||
for (auto i = 0; i < numItemsToDraw; ++i) {
|
||||
auto item = scene->getItem(inItems[i].id);
|
||||
|
||||
{
|
||||
assert(item.getKey().isShape());
|
||||
const auto key = item.getShapeKey();
|
||||
if (key.isValid() && !key.hasOwnPipeline()) {
|
||||
auto& bucket = sortedShapes[key];
|
||||
if (bucket.empty()) {
|
||||
sortedPipelines.push_back(key);
|
||||
}
|
||||
bucket.push_back(item);
|
||||
} else if (key.hasOwnPipeline()) {
|
||||
ownPipelineBucket.push_back(item);
|
||||
} else {
|
||||
qCDebug(renderlogging) << "Item could not be rendered with invalid key" << key;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
PROFILE_RANGE(render_detail, "render");
|
||||
|
||||
// Then render
|
||||
quint64 usecHalfBudget = 1000 * 0.5 * mstimeBudget;
|
||||
quint64 usecBudget = 1000 * mstimeBudget;
|
||||
|
||||
int numDrawCalls = 0;
|
||||
int numDrawcallsChecks = 128;
|
||||
int numChecks = 0;
|
||||
int numChecksBudget = 4;
|
||||
|
||||
for (auto& pipelineKey : sortedPipelines) {
|
||||
auto& bucket = sortedShapes[pipelineKey];
|
||||
args->_pipeline = shapeContext->pickPipeline(args, pipelineKey);
|
||||
if (!args->_pipeline) {
|
||||
continue;
|
||||
}
|
||||
for (auto& item : bucket) {
|
||||
item.render(args);
|
||||
|
||||
numDrawCalls++;
|
||||
if ((numDrawCalls % numDrawcallsChecks) == 0) {
|
||||
auto newNow = usecTimestampNow();
|
||||
if ((newNow - now) > usecHalfBudget) {
|
||||
if ((newNow - now) > usecBudget) {
|
||||
return;
|
||||
}
|
||||
|
||||
usecHalfBudget += (usecHalfBudget / 2);
|
||||
numDrawcallsChecks / 2;
|
||||
numChecks++;
|
||||
if (numChecks > numChecksBudget) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
args->_pipeline = nullptr;
|
||||
for (auto& item : ownPipelineBucket) {
|
||||
item.render(args);
|
||||
|
||||
numDrawCalls++;
|
||||
if ((numDrawCalls % numDrawcallsChecks) == 0) {
|
||||
auto newNow = usecTimestampNow();
|
||||
if ((newNow - now) > usecHalfBudget) {
|
||||
if ((newNow - now) > usecBudget) {
|
||||
return;
|
||||
}
|
||||
|
||||
usecHalfBudget += (usecHalfBudget / 2);
|
||||
numDrawcallsChecks / 2;
|
||||
numChecks++;
|
||||
if (numChecks > numChecksBudget) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DrawLight::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inLights) {
|
||||
assert(renderContext->args);
|
||||
assert(renderContext->args->hasViewFrustum());
|
||||
|
|
|
@ -19,7 +19,6 @@ namespace render {
|
|||
void renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, int maxDrawnItems = -1);
|
||||
void renderShapes(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, int maxDrawnItems = -1);
|
||||
void renderStateSortShapes(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, int maxDrawnItems = -1);
|
||||
void renderStateSortShapesCapped(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, double mstimeBudget, int maxDrawnItems = -1);
|
||||
|
||||
|
||||
class DrawLightConfig : public Job::Config {
|
||||
|
|
|
@ -95,7 +95,6 @@ Column {
|
|||
|
||||
GroupBox {
|
||||
title: "Render Items"
|
||||
Column{
|
||||
|
||||
Column{
|
||||
Repeater {
|
||||
|
@ -111,20 +110,5 @@ Column {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
Column{
|
||||
Repeater {
|
||||
model: [ "Draw Opaque [ms]:DrawOpaqueDeferred" ]
|
||||
ConfigSlider {
|
||||
label: qsTr(modelData.split(":")[0])
|
||||
integral: false
|
||||
config: Render.getConfig(modelData.split(":")[1])
|
||||
property: "maxTimeBudget"
|
||||
max: 10.0
|
||||
min: 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue