From b271542b73b0446e656e016e829adfd2d13c50af Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 7 Dec 2015 12:06:49 -0800 Subject: [PATCH 1/7] Save DebugMode to setting, restore on script start --- examples/utilities/tools/renderEngineDebug.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/examples/utilities/tools/renderEngineDebug.js b/examples/utilities/tools/renderEngineDebug.js index 2c0dc352b4..5e4eded640 100755 --- a/examples/utilities/tools/renderEngineDebug.js +++ b/examples/utilities/tools/renderEngineDebug.js @@ -1,6 +1,7 @@ // -// SunLightExample.js -// examples +// renderEngineDebug.js +// examples/utilities/tools +// // Sam Gateau // Copyright 2015 High Fidelity, Inc. // @@ -12,6 +13,7 @@ Script.include("cookies.js"); var MENU = "Developer>Render>Debug Deferred Buffer"; var ACTIONS = ["Off", "Diffuse", "Alpha", "Specular", "Roughness", "Normal", "Depth", "Lighting", "Custom"]; +var SETTINGS_KEY = "EngineDebugScript.DebugMode"; Number.prototype.clamp = function(min, max) { return Math.min(Math.max(this, min), max); @@ -69,6 +71,9 @@ var overlaysCounter = new CounterWidget(panel, "Overlays", ); var resizing = false; +var previousMode = Settings.getValue(SETTINGS_KEY, -1); +Menu.addActionGroup(MENU, ACTIONS, ACTIONS[previousMode + 1]); +Scene.setEngineDeferredDebugMode(previousMode); Scene.setEngineDeferredDebugSize({ x: 0.0, y: -1.0, z: 1.0, w: 1.0 }); // Reset to default size function setEngineDeferredDebugSize(eventX) { @@ -152,11 +157,11 @@ Controller.mousePressEvent.connect(mousePressEvent); Controller.mouseReleaseEvent.connect(mouseReleaseEvent); Menu.menuItemEvent.connect(menuItemEvent); -Menu.addActionGroup(MENU, ACTIONS, ACTIONS[0]); function scriptEnding() { panel.destroy(); Menu.removeActionGroup(MENU); + Settings.setValue(SETTINGS_KEY, Scene.getEngineDeferredDebugMode()); Scene.setEngineDeferredDebugMode(-1); Scene.setEngineDeferredDebugSize({ x: 0.0, y: -1.0, z: 1.0, w: 1.0 }); // Reset to default size } From 06d7de7106c4b87e0f5fd83d840a58135acdf3a4 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 7 Dec 2015 15:16:37 -0800 Subject: [PATCH 2/7] Make Shader interface take more consts --- libraries/gpu/src/gpu/Shader.cpp | 4 ++-- libraries/gpu/src/gpu/Shader.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/gpu/src/gpu/Shader.cpp b/libraries/gpu/src/gpu/Shader.cpp index ddb3a0d755..74b7734618 100755 --- a/libraries/gpu/src/gpu/Shader.cpp +++ b/libraries/gpu/src/gpu/Shader.cpp @@ -23,7 +23,7 @@ Shader::Shader(Type type, const Source& source): { } -Shader::Shader(Type type, Pointer& vertex, Pointer& pixel): +Shader::Shader(Type type, const Pointer& vertex, const Pointer& pixel): _type(type) { _shaders.resize(2); @@ -44,7 +44,7 @@ Shader::Pointer Shader::createPixel(const Source& source) { return Pointer(new Shader(PIXEL, source)); } -Shader::Pointer Shader::createProgram(Pointer& vertexShader, Pointer& pixelShader) { +Shader::Pointer Shader::createProgram(const Pointer& vertexShader, const Pointer& pixelShader) { if (vertexShader && vertexShader->getType() == VERTEX && pixelShader && pixelShader->getType() == PIXEL) { return Pointer(new Shader(PROGRAM, vertexShader, pixelShader)); diff --git a/libraries/gpu/src/gpu/Shader.h b/libraries/gpu/src/gpu/Shader.h index bceb00c71e..b737a42e12 100755 --- a/libraries/gpu/src/gpu/Shader.h +++ b/libraries/gpu/src/gpu/Shader.h @@ -111,7 +111,7 @@ public: static Pointer createVertex(const Source& source); static Pointer createPixel(const Source& source); - static Pointer createProgram(Pointer& vertexShader, Pointer& pixelShader); + static Pointer createProgram(const Pointer& vertexShader, const Pointer& pixelShader); ~Shader(); @@ -157,7 +157,7 @@ public: protected: Shader(Type type, const Source& source); - Shader(Type type, Pointer& vertex, Pointer& pixel); + Shader(Type type, const Pointer& vertex, const Pointer& pixel); Shader(const Shader& shader); // deep copy of the sysmem shader Shader& operator=(const Shader& shader); // deep copy of the sysmem texture From 9d6618c341236d81d12a4153baa09a82fc4beca8 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 7 Dec 2015 15:17:03 -0800 Subject: [PATCH 3/7] Cleanup DebugDeferredBuffer code --- examples/utilities/tools/renderEngineDebug.js | 1 - .../render-utils/src/DebugDeferredBuffer.cpp | 115 ++++++++---------- .../render-utils/src/DebugDeferredBuffer.h | 10 +- .../src/debug_deferred_buffer.slf | 6 +- 4 files changed, 57 insertions(+), 75 deletions(-) diff --git a/examples/utilities/tools/renderEngineDebug.js b/examples/utilities/tools/renderEngineDebug.js index 5e4eded640..5e89bff53b 100755 --- a/examples/utilities/tools/renderEngineDebug.js +++ b/examples/utilities/tools/renderEngineDebug.js @@ -90,7 +90,6 @@ function menuItemEvent(menuItem) { var index = ACTIONS.indexOf(menuItem); if (index >= 0) { Scene.setEngineDeferredDebugMode(index - 1); - print(menuItem); } } diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp index 169ae0b58e..2046a48d4a 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.cpp +++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp @@ -11,8 +11,6 @@ #include "DebugDeferredBuffer.h" -#include - #include #include #include @@ -31,73 +29,62 @@ enum Slots { Normal, Specular, Depth, - Lighting, - - NUM_SLOTS + Lighting }; -static const std::array SLOT_NAMES {{ - "diffuseMap", - "normalMap", - "specularMap", - "depthMap", - "lightingMap" -}}; -static const std::string COMPUTE_PLACEHOLDER { "/*COMPUTE_PLACEHOLDER*/" }; // required -static const std::string FUNCTIONS_PLACEHOLDER { "/*FUNCTIONS_PLACEHOLDER*/" }; // optional - -std::string DebugDeferredBuffer::getCode(Modes mode) { +std::string DebugDeferredBuffer::getShaderSourceCode(Modes mode) { switch (mode) { - case DiffuseMode: { - QString code = "return vec4(pow(texture(%1, uv).xyz, vec3(1.0 / 2.2)), 1.0);"; - return code.arg(SLOT_NAMES[Diffuse].c_str()).toStdString(); - } - case AlphaMode: { - QString code = "return vec4(vec3(texture(%1, uv).a), 1.0);"; - return code.arg(SLOT_NAMES[Diffuse].c_str()).toStdString(); - } - case SpecularMode: { - QString code = "return vec4(texture(%1, uv).xyz, 1.0);"; - return code.arg(SLOT_NAMES[Specular].c_str()).toStdString(); - } - case RoughnessMode: { - QString code = "return vec4(vec3(texture(%1, uv).a), 1.0);"; - return code.arg(SLOT_NAMES[Specular].c_str()).toStdString(); - } - case NormalMode: { - QString code = "return vec4(texture(%1, uv).xyz, 1.0);"; - return code.arg(SLOT_NAMES[Normal].c_str()).toStdString(); - } - case DepthMode: { - QString code = "return vec4(vec3(texture(%1, uv).x), 1.0);"; - return code.arg(SLOT_NAMES[Depth].c_str()).toStdString(); - } - case LightingMode: { - QString code = "return vec4(pow(texture(%1, uv).xyz, vec3(1.0 / 2.2)), 1.0);"; - return code.arg(SLOT_NAMES[Lighting].c_str()).toStdString(); - } + case DiffuseMode: + return "vec4 getFragmentColor() { return vec4(pow(texture(diffuseMap, uv).xyz, vec3(1.0 / 2.2)), 1.0); }"; + case AlphaMode: + return "vec4 getFragmentColor() { return vec4(vec3(texture(diffuseMap, uv).a), 1.0); }"; + case SpecularMode: + return "vec4 getFragmentColor() { return vec4(texture(specularMap, uv).xyz, 1.0); }"; + case RoughnessMode: + return "vec4 getFragmentColor() { return vec4(vec3(texture(specularMap, uv).a), 1.0); }"; + case NormalMode: + return "vec4 getFragmentColor() { return vec4(texture(normalMap, uv).xyz, 1.0); }"; + case DepthMode: + return "vec4 getFragmentColor() { return vec4(vec3(texture(depthMap, uv).x), 1.0); }"; + case LightingMode: + return "vec4 getFragmentColor() { return vec4(pow(texture(lightingMap, uv).xyz, vec3(1.0 / 2.2)), 1.0); }"; case CustomMode: - return std::string("return vec4(1.0);"); - case NUM_MODES: - Q_UNIMPLEMENTED(); - return std::string("return vec4(1.0);"); + return "vec4 getFragmentColor() { return vec4(1.0); }"; } } +bool DebugDeferredBuffer::pipelineNeedsUpdate(Modes mode) const { + if (mode != CustomMode) { + return !_pipelines[mode]; + } + + + + return true; +} + const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(Modes mode) { - if (!_pipelines[mode]) { - std::string fragmentShader = debug_deferred_buffer_frag; - fragmentShader.replace(fragmentShader.find(COMPUTE_PLACEHOLDER), COMPUTE_PLACEHOLDER.size(), - getCode(mode)); + if (pipelineNeedsUpdate(mode)) { + static const std::string VERTEX_SHADER { debug_deferred_buffer_vert }; + static const std::string FRAGMENT_SHADER { debug_deferred_buffer_frag }; + static const std::string SOURCE_PLACEHOLDER { "//SOURCE_PLACEHOLDER" }; + static const auto SOURCE_PLACEHOLDER_INDEX = FRAGMENT_SHADER.find(SOURCE_PLACEHOLDER); + Q_ASSERT_X(SOURCE_PLACEHOLDER_INDEX != std::string::npos, Q_FUNC_INFO, "Could not find source placeholder"); - auto vs = gpu::ShaderPointer(gpu::Shader::createVertex({ debug_deferred_buffer_vert })); - auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(fragmentShader)); - auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps)); + auto bakedFragmentShader = FRAGMENT_SHADER; + bakedFragmentShader.replace(SOURCE_PLACEHOLDER_INDEX, SOURCE_PLACEHOLDER.size(), + getShaderSourceCode(mode)); + + const auto vs = gpu::Shader::createVertex(VERTEX_SHADER); + const auto ps = gpu::Shader::createPixel(bakedFragmentShader); + const auto program = gpu::Shader::createProgram(vs, ps); gpu::Shader::BindingSet slotBindings; - for (int slot = 0; slot < NUM_SLOTS; ++slot) { - slotBindings.insert(gpu::Shader::Binding(SLOT_NAMES[slot], slot)); - } + slotBindings.insert(gpu::Shader::Binding("diffuseMap", Diffuse)); + slotBindings.insert(gpu::Shader::Binding("normalMap", Normal)); + slotBindings.insert(gpu::Shader::Binding("specularMap", Specular)); + slotBindings.insert(gpu::Shader::Binding("depthMap", Depth)); + slotBindings.insert(gpu::Shader::Binding("lightingMap", Lighting)); gpu::Shader::makeProgram(*program, slotBindings); // Good to go add the brand new pipeline @@ -110,10 +97,10 @@ const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(Modes mode) { void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { assert(renderContext->args); assert(renderContext->args->_viewFrustum); - RenderArgs* args = renderContext->args; + const RenderArgs* args = renderContext->args; gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { - auto geometryBuffer = DependencyManager::get(); - auto framebufferCache = DependencyManager::get(); + const auto geometryBuffer = DependencyManager::get(); + const auto framebufferCache = DependencyManager::get(); glm::mat4 projMat; @@ -132,9 +119,9 @@ void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const Ren batch.setResourceTexture(Depth, framebufferCache->getPrimaryDepthTexture()); batch.setResourceTexture(Lighting, framebufferCache->getLightingTexture()); - glm::vec4 color(1.0f, 1.0f, 1.0f, 1.0f); - glm::vec2 bottomLeft(renderContext->_deferredDebugSize.x, renderContext->_deferredDebugSize.y); - glm::vec2 topRight(renderContext->_deferredDebugSize.z, renderContext->_deferredDebugSize.w); + const glm::vec4 color(1.0f, 1.0f, 1.0f, 1.0f); + const glm::vec2 bottomLeft(renderContext->_deferredDebugSize.x, renderContext->_deferredDebugSize.y); + const glm::vec2 topRight(renderContext->_deferredDebugSize.z, renderContext->_deferredDebugSize.w); geometryBuffer->renderQuad(batch, bottomLeft, topRight, color); }); } \ No newline at end of file diff --git a/libraries/render-utils/src/DebugDeferredBuffer.h b/libraries/render-utils/src/DebugDeferredBuffer.h index 8628d9e21e..144a72571c 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.h +++ b/libraries/render-utils/src/DebugDeferredBuffer.h @@ -21,7 +21,7 @@ public: void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); private: - enum Modes : int { + enum Modes : uint8_t { DiffuseMode = 0, AlphaMode, SpecularMode, @@ -29,15 +29,15 @@ private: NormalMode, DepthMode, LightingMode, - CustomMode, - NUM_MODES + CustomMode // Needs to stay last }; + bool pipelineNeedsUpdate(Modes mode) const; const gpu::PipelinePointer& getPipeline(Modes mode); - std::string getCode(Modes mode); + std::string getShaderSourceCode(Modes mode); - std::array _pipelines; + std::array _pipelines; }; #endif // hifi_DebugDeferredBuffer_h \ No newline at end of file diff --git a/libraries/render-utils/src/debug_deferred_buffer.slf b/libraries/render-utils/src/debug_deferred_buffer.slf index d8ff6e71a9..375972cdc3 100644 --- a/libraries/render-utils/src/debug_deferred_buffer.slf +++ b/libraries/render-utils/src/debug_deferred_buffer.slf @@ -17,11 +17,7 @@ in vec2 uv; out vec4 outFragColor; -/*FUNCTIONS_PLACEHOLDER*/ - -vec4 getFragmentColor() { - /*COMPUTE_PLACEHOLDER*/ -} +//SOURCE_PLACEHOLDER void main(void) { outFragColor = getFragmentColor(); From d8a389ff925f795ad364e7e1f425b0784af65955 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 16 Dec 2015 17:20:51 -0800 Subject: [PATCH 4/7] First cut at custom pipelines --- libraries/render-utils/src/DebugDeferredBuffer.cpp | 14 +++++++++++--- libraries/render-utils/src/DebugDeferredBuffer.h | 2 ++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp index 2046a48d4a..7dbeddd07a 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.cpp +++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp @@ -11,6 +11,8 @@ #include "DebugDeferredBuffer.h" +#include + #include #include #include @@ -32,6 +34,14 @@ enum Slots { Lighting }; +static std::string getFileContent(std::string fileName, std::string defaultContent = std::string()) { + QFile customFile(QString::fromStdString(fileName)); + if (customFile.open(QIODevice::ReadOnly)) { + return customFile.readAll().toStdString(); + } + return defaultContent; +} + std::string DebugDeferredBuffer::getShaderSourceCode(Modes mode) { switch (mode) { case DiffuseMode: @@ -49,7 +59,7 @@ std::string DebugDeferredBuffer::getShaderSourceCode(Modes mode) { case LightingMode: return "vec4 getFragmentColor() { return vec4(pow(texture(lightingMap, uv).xyz, vec3(1.0 / 2.2)), 1.0); }"; case CustomMode: - return "vec4 getFragmentColor() { return vec4(1.0); }"; + return getFileContent(CUSTOM_FILE, "vec4 getFragmentColor() { return vec4(1.0); }"); } } @@ -58,8 +68,6 @@ bool DebugDeferredBuffer::pipelineNeedsUpdate(Modes mode) const { return !_pipelines[mode]; } - - return true; } diff --git a/libraries/render-utils/src/DebugDeferredBuffer.h b/libraries/render-utils/src/DebugDeferredBuffer.h index 144a72571c..a0df42c05a 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.h +++ b/libraries/render-utils/src/DebugDeferredBuffer.h @@ -33,6 +33,8 @@ private: CustomMode // Needs to stay last }; + const std::string CUSTOM_FILE { "/Users/clement/Desktop/custom.slh" }; + bool pipelineNeedsUpdate(Modes mode) const; const gpu::PipelinePointer& getPipeline(Modes mode); std::string getShaderSourceCode(Modes mode); From f41ca9fc50752913984400514cc15aab32f692d5 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 17 Dec 2015 15:13:09 -0800 Subject: [PATCH 5/7] More custom debug work --- .../render-utils/src/DebugDeferredBuffer.cpp | 115 +++++++++++++++--- .../render-utils/src/DebugDeferredBuffer.h | 21 +++- 2 files changed, 111 insertions(+), 25 deletions(-) diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp index 7dbeddd07a..6bdfbb57ff 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.cpp +++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp @@ -34,56 +34,119 @@ enum Slots { Lighting }; +static const std::string DEEFAULT_DIFFUSE_SHADER { + "vec4 getFragmentColor() {" + " return vec4(pow(texture(diffuseMap, uv).xyz, vec3(1.0 / 2.2)), 1.0);" + " }" +}; +static const std::string DEEFAULT_ALPHA_SHADER { + "vec4 getFragmentColor() {" + " return vec4(vec3(texture(diffuseMap, uv).a), 1.0);" + " }" +}; +static const std::string DEEFAULT_SPECULAR_SHADER { + "vec4 getFragmentColor() {" + " return vec4(texture(specularMap, uv).xyz, 1.0);" + " }" +}; +static const std::string DEEFAULT_ROUGHNESS_SHADER { + "vec4 getFragmentColor() {" + " return vec4(vec3(texture(specularMap, uv).a), 1.0);" + " }" +}; +static const std::string DEEFAULT_NORMAL_SHADER { + "vec4 getFragmentColor() {" + " return vec4(texture(normalMap, uv).xyz, 1.0);" + " }" +}; +static const std::string DEEFAULT_DEPTH_SHADER { + "vec4 getFragmentColor() {" + " return vec4(vec3(texture(depthMap, uv).x), 1.0);" + " }" +}; +static const std::string DEEFAULT_LIGHTING_SHADER { + "vec4 getFragmentColor() {" + " return vec4(pow(texture(lightingMap, uv).xyz, vec3(1.0 / 2.2)), 1.0);" + " }" +}; +static const std::string DEEFAULT_CUSTOM_SHADER { + "vec4 getFragmentColor() {" + " return vec4(1.0, 0.0, 0.0, 1.0);" + " }" +}; + static std::string getFileContent(std::string fileName, std::string defaultContent = std::string()) { - QFile customFile(QString::fromStdString(fileName)); + QFile customFile(QUrl(QString::fromStdString(fileName)).toLocalFile()); if (customFile.open(QIODevice::ReadOnly)) { return customFile.readAll().toStdString(); } + qWarning() << "DebugDeferredBuffer::getFileContent(): Could not open" + << QUrl(QString::fromStdString(fileName)).toLocalFile(); return defaultContent; } -std::string DebugDeferredBuffer::getShaderSourceCode(Modes mode) { +#include // TODO REMOVE: Temporary until UI +DebugDeferredBuffer::DebugDeferredBuffer() { + // TODO REMOVE: Temporary until UI + static const auto DESKTOP_PATH = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); + static const auto CUSTOM_FILE = "file://" + DESKTOP_PATH.toStdString() + "/custom.slh"; + CustomPipeline pipeline; + pipeline.info = QFileInfo(DESKTOP_PATH + "/custom.slh"); + _customPipelines.emplace(CUSTOM_FILE, pipeline); +} + +std::string DebugDeferredBuffer::getShaderSourceCode(Modes mode, std::string customFile) { switch (mode) { case DiffuseMode: - return "vec4 getFragmentColor() { return vec4(pow(texture(diffuseMap, uv).xyz, vec3(1.0 / 2.2)), 1.0); }"; + return DEEFAULT_DIFFUSE_SHADER; case AlphaMode: - return "vec4 getFragmentColor() { return vec4(vec3(texture(diffuseMap, uv).a), 1.0); }"; + return DEEFAULT_ALPHA_SHADER; case SpecularMode: - return "vec4 getFragmentColor() { return vec4(texture(specularMap, uv).xyz, 1.0); }"; + return DEEFAULT_SPECULAR_SHADER; case RoughnessMode: - return "vec4 getFragmentColor() { return vec4(vec3(texture(specularMap, uv).a), 1.0); }"; + return DEEFAULT_ROUGHNESS_SHADER; case NormalMode: - return "vec4 getFragmentColor() { return vec4(texture(normalMap, uv).xyz, 1.0); }"; + return DEEFAULT_NORMAL_SHADER; case DepthMode: - return "vec4 getFragmentColor() { return vec4(vec3(texture(depthMap, uv).x), 1.0); }"; + return DEEFAULT_DEPTH_SHADER; case LightingMode: - return "vec4 getFragmentColor() { return vec4(pow(texture(lightingMap, uv).xyz, vec3(1.0 / 2.2)), 1.0); }"; + return DEEFAULT_LIGHTING_SHADER; case CustomMode: - return getFileContent(CUSTOM_FILE, "vec4 getFragmentColor() { return vec4(1.0); }"); + return getFileContent(customFile, DEEFAULT_CUSTOM_SHADER); } } -bool DebugDeferredBuffer::pipelineNeedsUpdate(Modes mode) const { +bool DebugDeferredBuffer::pipelineNeedsUpdate(Modes mode, std::string customFile) const { if (mode != CustomMode) { return !_pipelines[mode]; } + auto it = _customPipelines.find(customFile); + if (it != _customPipelines.end() && it->second.pipeline) { + auto& info = it->second.info; + + auto lastModified = info.lastModified(); + info.refresh(); + return lastModified != info.lastModified(); + } + return true; } -const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(Modes mode) { - if (pipelineNeedsUpdate(mode)) { +const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(Modes mode, std::string customFile) { + if (pipelineNeedsUpdate(mode, customFile)) { static const std::string VERTEX_SHADER { debug_deferred_buffer_vert }; static const std::string FRAGMENT_SHADER { debug_deferred_buffer_frag }; static const std::string SOURCE_PLACEHOLDER { "//SOURCE_PLACEHOLDER" }; static const auto SOURCE_PLACEHOLDER_INDEX = FRAGMENT_SHADER.find(SOURCE_PLACEHOLDER); - Q_ASSERT_X(SOURCE_PLACEHOLDER_INDEX != std::string::npos, Q_FUNC_INFO, "Could not find source placeholder"); + Q_ASSERT_X(SOURCE_PLACEHOLDER_INDEX != std::string::npos, Q_FUNC_INFO, + "Could not find source placeholder"); auto bakedFragmentShader = FRAGMENT_SHADER; bakedFragmentShader.replace(SOURCE_PLACEHOLDER_INDEX, SOURCE_PLACEHOLDER.size(), - getShaderSourceCode(mode)); + getShaderSourceCode(mode, customFile)); - const auto vs = gpu::Shader::createVertex(VERTEX_SHADER); + static const auto vs = gpu::Shader::createVertex(VERTEX_SHADER); const auto ps = gpu::Shader::createPixel(bakedFragmentShader); const auto program = gpu::Shader::createProgram(vs, ps); @@ -95,10 +158,21 @@ const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(Modes mode) { slotBindings.insert(gpu::Shader::Binding("lightingMap", Lighting)); gpu::Shader::makeProgram(*program, slotBindings); + auto pipeline = gpu::Pipeline::create(program, std::make_shared()); + // Good to go add the brand new pipeline - _pipelines[mode] = gpu::Pipeline::create(program, std::make_shared()); + if (mode != CustomMode) { + _pipelines[mode] = pipeline; + } else { + _customPipelines[customFile].pipeline = pipeline; + } + } + + if (mode != CustomMode) { + return _pipelines[mode]; + } else { + return _customPipelines[customFile].pipeline; } - return _pipelines[mode]; } @@ -118,8 +192,11 @@ void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const Ren batch.setProjectionTransform(projMat); batch.setViewTransform(viewMat); batch.setModelTransform(Transform()); + + // TODO REMOVE: Temporary until UI + auto first = _customPipelines.begin()->first; - batch.setPipeline(getPipeline(Modes(renderContext->_deferredDebugMode))); + batch.setPipeline(getPipeline(Modes(renderContext->_deferredDebugMode), first)); batch.setResourceTexture(Diffuse, framebufferCache->getDeferredColorTexture()); batch.setResourceTexture(Normal, framebufferCache->getDeferredNormalTexture()); diff --git a/libraries/render-utils/src/DebugDeferredBuffer.h b/libraries/render-utils/src/DebugDeferredBuffer.h index a0df42c05a..682888b2af 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.h +++ b/libraries/render-utils/src/DebugDeferredBuffer.h @@ -12,12 +12,16 @@ #ifndef hifi_DebugDeferredBuffer_h #define hifi_DebugDeferredBuffer_h +#include + #include class DebugDeferredBuffer { public: using JobModel = render::Job::Model; + DebugDeferredBuffer(); + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); private: @@ -32,14 +36,19 @@ private: CustomMode // Needs to stay last }; + struct CustomPipeline { + gpu::PipelinePointer pipeline; + mutable QFileInfo info; + }; + using StandardPipelines = std::array; + using CustomPipelines = std::unordered_map; - const std::string CUSTOM_FILE { "/Users/clement/Desktop/custom.slh" }; + bool pipelineNeedsUpdate(Modes mode, std::string customFile = std::string()) const; + const gpu::PipelinePointer& getPipeline(Modes mode, std::string customFile = std::string()); + std::string getShaderSourceCode(Modes mode, std::string customFile = std::string()); - bool pipelineNeedsUpdate(Modes mode) const; - const gpu::PipelinePointer& getPipeline(Modes mode); - std::string getShaderSourceCode(Modes mode); - - std::array _pipelines; + StandardPipelines _pipelines; + CustomPipelines _customPipelines; }; #endif // hifi_DebugDeferredBuffer_h \ No newline at end of file From c0a675dd9e49a137669ba189c1ad44441c4ebdc5 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 17 Dec 2015 16:02:49 -0800 Subject: [PATCH 6/7] Fix msvc warning --- libraries/render-utils/src/DebugDeferredBuffer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp index 6bdfbb57ff..3458712106 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.cpp +++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp @@ -114,6 +114,8 @@ std::string DebugDeferredBuffer::getShaderSourceCode(Modes mode, std::string cus case CustomMode: return getFileContent(customFile, DEEFAULT_CUSTOM_SHADER); } + Q_UNREACHABLE(); + return std::string(); } bool DebugDeferredBuffer::pipelineNeedsUpdate(Modes mode, std::string customFile) const { From 78b805a19a50a286a446f252dc3bd84db1f8e1ee Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 17 Dec 2015 16:06:55 -0800 Subject: [PATCH 7/7] Fix file shader file lookup on windows --- libraries/render-utils/src/DebugDeferredBuffer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp index 3458712106..d61b131844 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.cpp +++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp @@ -76,12 +76,12 @@ static const std::string DEEFAULT_CUSTOM_SHADER { }; static std::string getFileContent(std::string fileName, std::string defaultContent = std::string()) { - QFile customFile(QUrl(QString::fromStdString(fileName)).toLocalFile()); + QFile customFile(QString::fromStdString(fileName)); if (customFile.open(QIODevice::ReadOnly)) { return customFile.readAll().toStdString(); } qWarning() << "DebugDeferredBuffer::getFileContent(): Could not open" - << QUrl(QString::fromStdString(fileName)).toLocalFile(); + << QString::fromStdString(fileName); return defaultContent; } @@ -89,9 +89,9 @@ static std::string getFileContent(std::string fileName, std::string defaultConte DebugDeferredBuffer::DebugDeferredBuffer() { // TODO REMOVE: Temporary until UI static const auto DESKTOP_PATH = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); - static const auto CUSTOM_FILE = "file://" + DESKTOP_PATH.toStdString() + "/custom.slh"; + static const auto CUSTOM_FILE = DESKTOP_PATH.toStdString() + "/custom.slh"; CustomPipeline pipeline; - pipeline.info = QFileInfo(DESKTOP_PATH + "/custom.slh"); + pipeline.info = QFileInfo(QString::fromStdString(CUSTOM_FILE)); _customPipelines.emplace(CUSTOM_FILE, pipeline); }