Merge pull request #6556 from Atlante45/graphics

First pass at live g-buffer debugging.
This commit is contained in:
samcake 2015-12-04 11:47:28 -08:00
commit 6e372e46a4
13 changed files with 189 additions and 21 deletions

View file

@ -66,6 +66,12 @@ var overlaysCounter = new CounterWidget(panel, "Overlays",
var showDisplayStatusFlag = 1; var showDisplayStatusFlag = 1;
var showNetworkStatusFlag = 2; var showNetworkStatusFlag = 2;
panel.newCheckbox("Debug deferred buffer",
function(value) { Scene.setEngineDisplayDebugDeferredBuffer(value > 0); },
function() { return Scene.doEngineDisplayDebugDeferredBuffer() > 0; },
function(value) { return value > 0; }
);
panel.newCheckbox("Display status", panel.newCheckbox("Display status",
function(value) { Scene.setEngineDisplayItemStatus(value ? function(value) { Scene.setEngineDisplayItemStatus(value ?
Scene.doEngineDisplayItemStatus() | showDisplayStatusFlag : Scene.doEngineDisplayItemStatus() | showDisplayStatusFlag :

View file

@ -3622,6 +3622,8 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se
renderContext._maxDrawnTransparentItems = sceneInterface->getEngineMaxDrawnTransparentItems(); renderContext._maxDrawnTransparentItems = sceneInterface->getEngineMaxDrawnTransparentItems();
renderContext._maxDrawnOverlay3DItems = sceneInterface->getEngineMaxDrawnOverlay3DItems(); renderContext._maxDrawnOverlay3DItems = sceneInterface->getEngineMaxDrawnOverlay3DItems();
renderContext._drawDebugDeferredBuffer = sceneInterface->doEngineDisplayDebugDeferredBuffer();
renderContext._drawItemStatus = sceneInterface->doEngineDisplayItemStatus(); renderContext._drawItemStatus = sceneInterface->doEngineDisplayItemStatus();
if (Menu::getInstance()->isOptionChecked(MenuOption::PhysicsShowOwned)) { if (Menu::getInstance()->isOptionChecked(MenuOption::PhysicsShowOwned)) {
renderContext._drawItemStatus |= render::showNetworkStatusFlag; renderContext._drawItemStatus |= render::showNetworkStatusFlag;

View file

@ -0,0 +1,70 @@
//
// DebugDeferredBuffer.cpp
// libraries/render-utils/src
//
// Created by Clement on 12/3/15.
// Copyright 2015 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "DebugDeferredBuffer.h"
#include <gpu/Batch.h>
#include <gpu/Context.h>
#include <render/Scene.h>
#include <ViewFrustum.h>
#include "GeometryCache.h"
#include "FramebufferCache.h"
#include "debug_deferred_buffer_vert.h"
#include "debug_deferred_buffer_frag.h"
using namespace render;
const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline() {
if (!_pipeline) {
auto vs = gpu::ShaderPointer(gpu::Shader::createVertex({ debug_deferred_buffer_vert }));
auto ps = gpu::ShaderPointer(gpu::Shader::createPixel({ debug_deferred_buffer_frag }));
auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps));
gpu::Shader::BindingSet slotBindings;
gpu::Shader::makeProgram(*program, slotBindings);
// Good to go add the brand new pipeline
_pipeline.reset(gpu::Pipeline::create(program, std::make_shared<gpu::State>()));
}
return _pipeline;
}
void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {
assert(renderContext->args);
assert(renderContext->args->_viewFrustum);
RenderArgs* args = renderContext->args;
gpu::doInBatch(args->_context, [&](gpu::Batch& batch) {
auto geometryBuffer = DependencyManager::get<GeometryCache>();
auto framebufferCache = DependencyManager::get<FramebufferCache>();
glm::mat4 projMat;
Transform viewMat;
args->_viewFrustum->evalProjectionMatrix(projMat);
args->_viewFrustum->evalViewTransform(viewMat);
batch.setProjectionTransform(projMat);
batch.setViewTransform(viewMat);
batch.setModelTransform(Transform());
batch.setPipeline(getPipeline());
batch.setResourceTexture(0, framebufferCache->getDeferredColorTexture());
glm::vec4 color(0.0f, 0.0f, 1.0f, 1.0f);
glm::vec2 bottomLeft(0.0f, -1.0f);
glm::vec2 topRight(1.0f, 1.0f);
geometryBuffer->renderQuad(batch, bottomLeft, topRight, color);
});
}

View file

@ -0,0 +1,29 @@
//
// DebugDeferredBuffer.h
// libraries/render-utils/src
//
// Created by Clement on 12/3/15.
// Copyright 2015 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#ifndef hifi_DebugDeferredBuffer_h
#define hifi_DebugDeferredBuffer_h
#include <render/DrawTask.h>
class DebugDeferredBuffer {
public:
using JobModel = render::Job::Model<DebugDeferredBuffer>;
void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext);
private:
const gpu::PipelinePointer& getPipeline();
gpu::PipelinePointer _pipeline;
};
#endif // hifi_DebugDeferredBuffer_h

View file

@ -14,6 +14,7 @@
#include <glm/gtc/random.hpp> #include <glm/gtc/random.hpp>
#include <DependencyManager.h>
#include <PathUtils.h> #include <PathUtils.h>
#include <SharedUtil.h> #include <SharedUtil.h>

View file

@ -9,11 +9,7 @@
#ifndef hifi_hitEffect_h #ifndef hifi_hitEffect_h
#define hifi_hitEffect_h #define hifi_hitEffect_h
#include <DependencyManager.h> #include <render/DrawTask.h>
#include "render/DrawTask.h"
class AbstractViewStateInterface;
class ProgramObject;
class HitEffect { class HitEffect {
public: public:

View file

@ -18,10 +18,11 @@
#include <gpu/Context.h> #include <gpu/Context.h>
#include <gpu/StandardShaderLib.h> #include <gpu/StandardShaderLib.h>
#include "FramebufferCache.h" #include "DebugDeferredBuffer.h"
#include "DeferredLightingEffect.h" #include "DeferredLightingEffect.h"
#include "TextureCache.h" #include "FramebufferCache.h"
#include "HitEffect.h" #include "HitEffect.h"
#include "TextureCache.h"
#include "render/DrawStatus.h" #include "render/DrawStatus.h"
#include "AmbientOcclusionEffect.h" #include "AmbientOcclusionEffect.h"
@ -112,6 +113,10 @@ RenderDeferredTask::RenderDeferredTask() : Task() {
_jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortTransparent", _jobs.back().getOutput(), DepthSortItems(false)))); _jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortTransparent", _jobs.back().getOutput(), DepthSortItems(false))));
_jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput()))); _jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput())));
_jobs.push_back(Job(new DebugDeferredBuffer::JobModel("DebugDeferredBuffer")));
_jobs.back().setEnabled(false);
_drawDebugDeferredBufferIndex = _jobs.size() - 1;
// Grab a texture map representing the different status icons and assign that to the drawStatsuJob // Grab a texture map representing the different status icons and assign that to the drawStatsuJob
auto iconMapPath = PathUtils::resourcesPath() + "icons/statusIconAtlas.svg"; auto iconMapPath = PathUtils::resourcesPath() + "icons/statusIconAtlas.svg";
@ -151,6 +156,9 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend
return; return;
} }
// Make sure we turn the deferred buffer debug on/off
setDrawDebugDeferredBuffer(renderContext->_drawDebugDeferredBuffer);
// Make sure we turn the displayItemStatus on/off // Make sure we turn the displayItemStatus on/off
setDrawItemStatus(renderContext->_drawItemStatus); setDrawItemStatus(renderContext->_drawItemStatus);

View file

@ -94,15 +94,22 @@ public:
render::Jobs _jobs; render::Jobs _jobs;
int _drawDebugDeferredBufferIndex = -1;
int _drawStatusJobIndex = -1; int _drawStatusJobIndex = -1;
int _drawHitEffectJobIndex = -1; int _drawHitEffectJobIndex = -1;
void setDrawDebugDeferredBuffer(int draw) {
if (_drawDebugDeferredBufferIndex >= 0) {
_jobs[_drawDebugDeferredBufferIndex].setEnabled(draw > 0);
}
}
bool doDrawDebugDeferredBuffer() const { if (_drawDebugDeferredBufferIndex >= 0) { return _jobs[_drawDebugDeferredBufferIndex].isEnabled(); } else { return false; } }
void setDrawItemStatus(int draw) { void setDrawItemStatus(int draw) {
if (_drawStatusJobIndex >= 0) { if (_drawStatusJobIndex >= 0) {
_jobs[_drawStatusJobIndex].setEnabled(draw > 0); _jobs[_drawStatusJobIndex].setEnabled(draw > 0);
} }
} }
bool doDrawItemStatus() const { if (_drawStatusJobIndex >= 0) { return _jobs[_drawStatusJobIndex].isEnabled(); } else { return false; } } bool doDrawItemStatus() const { if (_drawStatusJobIndex >= 0) { return _jobs[_drawStatusJobIndex].isEnabled(); } else { return false; } }
void setDrawHitEffect(bool draw) { if (_drawHitEffectJobIndex >= 0) { _jobs[_drawHitEffectJobIndex].setEnabled(draw); } } void setDrawHitEffect(bool draw) { if (_drawHitEffectJobIndex >= 0) { _jobs[_drawHitEffectJobIndex].setEnabled(draw); } }

View file

@ -0,0 +1,22 @@
<@include gpu/Config.slh@>
<$VERSION_HEADER$>
// Generated on <$_SCRIBE_DATE$>
//
// debug_deferred_buffer.slf
// fragment shader
//
// Created by Clement on 12/3
// Copyright 2015 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
<@include DeferredBuffer.slh@>
in vec2 uv;
out vec4 outFragColor;
void main(void) {
outFragColor = texture(diffuseMap, uv);
}

View file

@ -0,0 +1,22 @@
<@include gpu/Config.slh@>
<$VERSION_HEADER$>
// Generated on <$_SCRIBE_DATE$>
//
// debug_deferred_buffer.slv
// vertex shader
//
// Created by Clement on 12/3
// Copyright 2015 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
<@include gpu/Inputs.slh@>
out vec2 uv;
void main(void) {
uv = (inPosition.xy + 1.0) * 0.5;
gl_Position = inPosition;
}

View file

@ -53,6 +53,7 @@ public:
int _numDrawnOverlay3DItems = 0; int _numDrawnOverlay3DItems = 0;
int _maxDrawnOverlay3DItems = -1; int _maxDrawnOverlay3DItems = -1;
int _drawDebugDeferredBuffer = 0;
int _drawItemStatus = 0; int _drawItemStatus = 0;
bool _drawHitEffect = false; bool _drawHitEffect = false;

View file

@ -107,6 +107,9 @@ public:
Q_INVOKABLE void setEngineMaxDrawnOverlay3DItems(int count) { _maxDrawnOverlay3DItems = count; } Q_INVOKABLE void setEngineMaxDrawnOverlay3DItems(int count) { _maxDrawnOverlay3DItems = count; }
Q_INVOKABLE int getEngineMaxDrawnOverlay3DItems() { return _maxDrawnOverlay3DItems; } Q_INVOKABLE int getEngineMaxDrawnOverlay3DItems() { return _maxDrawnOverlay3DItems; }
Q_INVOKABLE void setEngineDisplayDebugDeferredBuffer(int display) { _drawDebugDeferredBuffer = display; }
Q_INVOKABLE int doEngineDisplayDebugDeferredBuffer() { return _drawDebugDeferredBuffer; }
Q_INVOKABLE void setEngineDisplayItemStatus(int display) { _drawItemStatus = display; } Q_INVOKABLE void setEngineDisplayItemStatus(int display) { _drawItemStatus = display; }
Q_INVOKABLE int doEngineDisplayItemStatus() { return _drawItemStatus; } Q_INVOKABLE int doEngineDisplayItemStatus() { return _drawItemStatus; }
@ -143,6 +146,7 @@ protected:
int _maxDrawnTransparentItems = -1; int _maxDrawnTransparentItems = -1;
int _maxDrawnOverlay3DItems = -1; int _maxDrawnOverlay3DItems = -1;
int _drawDebugDeferredBuffer = 0;
int _drawItemStatus = 0; int _drawItemStatus = 0;
bool _drawHitEffect = false; bool _drawHitEffect = false;