From 9c136e7dac4ce8a00bd6f8ca1d84c2eda24628b4 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 21 Feb 2018 17:31:53 -0800 Subject: [PATCH 1/7] Trying to render the proxies without success --- .../src/workload/GameWorkloadRenderer.cpp | 45 +++++++++++-------- interface/src/workload/GameWorkloadRenderer.h | 2 + .../render-utils/src/drawWorkloadProxy.slf | 4 +- .../render-utils/src/drawWorkloadProxy.slv | 42 +++++++++-------- libraries/workload/src/workload/Space.h | 2 + 5 files changed, 53 insertions(+), 42 deletions(-) diff --git a/interface/src/workload/GameWorkloadRenderer.cpp b/interface/src/workload/GameWorkloadRenderer.cpp index 99a784a511..569f95364a 100644 --- a/interface/src/workload/GameWorkloadRenderer.cpp +++ b/interface/src/workload/GameWorkloadRenderer.cpp @@ -52,7 +52,7 @@ void GameSpaceToRender::run(const workload::WorkloadContextPointer& runContext, namespace render { template <> const ItemKey payloadGetKey(const GameWorkloadRenderItem::Pointer& payload) { - auto builder = ItemKey::Builder().opaqueShape().withTagBits(ItemKey::TAG_BITS_0 | ItemKey::TAG_BITS_1); + auto builder = ItemKey::Builder().transparentShape().withTagBits(ItemKey::TAG_BITS_0 | ItemKey::TAG_BITS_1); return builder.build(); } template <> const Item::Bound payloadGetBound(const GameWorkloadRenderItem::Pointer& payload) { @@ -66,6 +66,12 @@ namespace render { payload->render(args); } } + template <> const ShapeKey shapeGetShapeKey(const GameWorkloadRenderItem::Pointer& payload) { + if (payload) { + return ShapeKey::Builder::ownPipeline(); + } + return ShapeKey::Builder::ownPipeline(); + } } @@ -87,40 +93,41 @@ const gpu::PipelinePointer GameWorkloadRenderItem::getPipeline() { gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); gpu::Shader::BindingSet slotBindings; + slotBindings.insert(gpu::Shader::Binding("ssbo0Buffer", 0)); gpu::Shader::makeProgram(*program, slotBindings); auto state = std::make_shared(); - state->setDepthTest(true, false, gpu::LESS_EQUAL); + /* state->setDepthTest(true, false, gpu::LESS_EQUAL); state->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, gpu::State::DEST_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ZERO); - +*/ _drawAllProxiesPipeline = gpu::Pipeline::create(program, state); } return _drawAllProxiesPipeline; } void GameWorkloadRenderItem::render(RenderArgs* args) { - gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { - args->_batch = &batch; + gpu::Batch& batch = *(args->_batch); - // Setup projection - glm::mat4 projMat; - Transform viewMat; - args->getViewFrustum().evalProjectionMatrix(projMat); - args->getViewFrustum().evalViewTransform(viewMat); - batch.setProjectionTransform(projMat); - batch.setViewTransform(viewMat); - batch.setModelTransform(Transform()); + // Setup projection + // glm::mat4 projMat; + // Transform viewMat; + // args->getViewFrustum().evalProjectionMatrix(projMat); + // args->getViewFrustum().evalViewTransform(viewMat); + // batch.setProjectionTransform(projMat); + // batch.setViewTransform(viewMat); + batch.setModelTransform(Transform()); - // Bind program - batch.setPipeline(getPipeline()); + // Bind program + batch.setPipeline(getPipeline()); - batch.setResourceBuffer(0, _allProxiesBuffer); + batch.setResourceBuffer(0, _allProxiesBuffer); - static const int NUM_VERTICES_PER_QUAD = 4; - batch.draw(gpu::LINES, NUM_VERTICES_PER_QUAD * _numAllProxies, 0); - }); + static const int NUM_VERTICES_PER_QUAD = 24; + batch.draw(gpu::LINES, NUM_VERTICES_PER_QUAD * _numAllProxies, 0); + + batch.setResourceBuffer(0, nullptr); } diff --git a/interface/src/workload/GameWorkloadRenderer.h b/interface/src/workload/GameWorkloadRenderer.h index 969c85a195..74e19825b5 100644 --- a/interface/src/workload/GameWorkloadRenderer.h +++ b/interface/src/workload/GameWorkloadRenderer.h @@ -59,6 +59,8 @@ namespace render { template <> const ItemKey payloadGetKey(const GameWorkloadRenderItem::Pointer& payload); template <> const Item::Bound payloadGetBound(const GameWorkloadRenderItem::Pointer& payload); template <> void payloadRender(const GameWorkloadRenderItem::Pointer& payload, RenderArgs* args); + template <> const ShapeKey shapeGetShapeKey(const GameWorkloadRenderItem::Pointer& payload); + } #endif \ No newline at end of file diff --git a/libraries/render-utils/src/drawWorkloadProxy.slf b/libraries/render-utils/src/drawWorkloadProxy.slf index 84c47d0933..36606b8afc 100644 --- a/libraries/render-utils/src/drawWorkloadProxy.slf +++ b/libraries/render-utils/src/drawWorkloadProxy.slf @@ -16,6 +16,8 @@ in vec2 varTexcoord; out vec4 outFragColor; void main(void) { + outFragColor = vec4(1.0); + /* float var = step(fract(varTexcoord.x * varTexcoord.y * 1.0), 0.5); if (varColor.a == 0.0) { @@ -23,6 +25,6 @@ void main(void) { } else { outFragColor = vec4(mix(vec3(1.0), varColor.xyz, var), varColor.a); - } + }*/ } diff --git a/libraries/render-utils/src/drawWorkloadProxy.slv b/libraries/render-utils/src/drawWorkloadProxy.slv index 0bb2b795bd..444f4c0917 100644 --- a/libraries/render-utils/src/drawWorkloadProxy.slv +++ b/libraries/render-utils/src/drawWorkloadProxy.slv @@ -21,27 +21,27 @@ uniform vec4 inColor; -struct ItemBound { - vec4 id_boundPos; - vec4 boundDim_s; +struct WorkloadProxy { + vec4 sphere; + vec4 region; }; #if defined(GPU_GL410) uniform samplerBuffer ssbo0Buffer; -ItemBound getItemBound(int i) { +WorkloadProxy getWorkloadProxy(int i) { int offset = 2 * i; - ItemBound bound; - bound.id_boundPos = texelFetch(ssbo0Buffer, offset); - bound.boundDim_s = texelFetch(ssbo0Buffer, offset + 1); - return bound; + WorkloadProxy proxy; + proxy.sphere = texelFetch(ssbo0Buffer, offset); + proxy.region = texelFetch(ssbo0Buffer, offset + 1); + return proxy; } #else layout(std140) buffer ssbo0Buffer { - ItemBound bounds[]; + WorkloadProxy proxies[]; }; -ItemBound getItemBound(int i) { - ItemBound bound = bounds[i]; - return bound; +WorkloadProxy getWorkloadProxy(int i) { + WorkloadProxy proxy = proxies[i]; + return proxy; } #endif @@ -76,14 +76,15 @@ void main(void) { 1, 5 ); - int boundID = gl_VertexID / 24; - int vertexID = gl_VertexID - boundID * 24; + int proxyID = gl_VertexID / 24; + int vertexID = gl_VertexID - proxyID * 24; vec4 cubeVec = UNIT_BOX[UNIT_BOX_LINE_INDICES[vertexID]]; - ItemBound bound = getItemBound(boundID); - vec3 boundPos = bound.id_boundPos.yzw; - vec3 boundDim = bound.boundDim_s.xyz; + WorkloadProxy proxy = getWorkloadProxy(proxyID); + vec3 boundPos = proxy.sphere.xyz; + // vec3 boundDim = vec3(proxy.sphere.w); + vec3 boundDim = vec3(0.5); vec4 pos = vec4(boundPos + boundDim * cubeVec.xyz, 1.0); @@ -92,11 +93,8 @@ void main(void) { TransformObject obj = getTransformObject(); <$transformModelToClipPos(cam, obj, pos, gl_Position)$> - if (inColor.w < 0.0) { - varColor = vec4(colorWheel(float(boundID)/(-inColor.w)), 1.0); - } else { - varColor = vec4(colorWheel(float(inColor.w)), 1.0); - } + varColor = vec4(colorWheel(float(proxyID)/(-inColor.w)), 1.0); + varTexcoord = vec2(cubeVec.w, length(boundDim)); } \ No newline at end of file diff --git a/libraries/workload/src/workload/Space.h b/libraries/workload/src/workload/Space.h index d7478b6066..a805d8bacd 100644 --- a/libraries/workload/src/workload/Space.h +++ b/libraries/workload/src/workload/Space.h @@ -40,6 +40,8 @@ public: Sphere sphere; uint8_t region { REGION_UNKNOWN }; uint8_t prevRegion { REGION_UNKNOWN }; + uint16_t _padding; + uint32_t _paddings[3]; }; class View { From 101872abce79b3f0e15615a3db5742111c283cad Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 22 Feb 2018 16:44:35 -0800 Subject: [PATCH 2/7] Still marinating how to represent the proxy values... --- .../src/workload/GameWorkloadRenderer.cpp | 89 +++++++++++-------- interface/src/workload/GameWorkloadRenderer.h | 3 + .../render-utils/src/drawWorkloadProxy.slf | 12 ++- .../render-utils/src/drawWorkloadProxy.slv | 14 ++- 4 files changed, 77 insertions(+), 41 deletions(-) diff --git a/interface/src/workload/GameWorkloadRenderer.cpp b/interface/src/workload/GameWorkloadRenderer.cpp index 569f95364a..b73c6fe309 100644 --- a/interface/src/workload/GameWorkloadRenderer.cpp +++ b/interface/src/workload/GameWorkloadRenderer.cpp @@ -12,6 +12,8 @@ #include #include +#include +#include #include "render-utils/drawWorkloadProxy_vert.h" #include "render-utils/drawWorkloadProxy_frag.h" @@ -21,6 +23,14 @@ void GameSpaceToRender::run(const workload::WorkloadContextPointer& runContext, if (!gameWorkloadContext) { return; } + auto space = gameWorkloadContext->_space; + if (!space) { + return; + } + + std::vector proxies(space->getNumAllocatedProxies()); + space->copyProxyValues(proxies.data(), (uint32_t)proxies.size()); + auto scene = gameWorkloadContext->_scene; @@ -29,31 +39,20 @@ void GameSpaceToRender::run(const workload::WorkloadContextPointer& runContext, if (!render::Item::isValidID(_spaceRenderItemID)) { _spaceRenderItemID = scene->allocateID(); auto renderItem = std::make_shared(); - renderItem->editBound().expandedContains(glm::vec3(0.0f), 32000.0f); - transaction.resetItem(_spaceRenderItemID, std::make_shared(std::make_shared())); - scene->enqueueTransaction(transaction); + renderItem->editBound().setBox(glm::vec3(-100.0f), 200.0f); + renderItem->setAllProxies(proxies); + transaction.resetItem(_spaceRenderItemID, std::make_shared(renderItem)); + } else { + transaction.updateItem(_spaceRenderItemID, [proxies](GameWorkloadRenderItem& item) { + item.setAllProxies(proxies); + }); } - - - auto space = gameWorkloadContext->_space; - if (!space) { - return; - } - - std::vector proxies(space->getNumAllocatedProxies()); - - space->copyProxyValues(proxies.data(), (uint32_t) proxies.size()); - - transaction.updateItem(_spaceRenderItemID, [proxies](GameWorkloadRenderItem& item) { - item.setAllProxies(proxies); - }); scene->enqueueTransaction(transaction); } namespace render { template <> const ItemKey payloadGetKey(const GameWorkloadRenderItem::Pointer& payload) { - auto builder = ItemKey::Builder().transparentShape().withTagBits(ItemKey::TAG_BITS_0 | ItemKey::TAG_BITS_1); - return builder.build(); + return ItemKey::Builder::opaqueShape().withTagBits(render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1); } template <> const Item::Bound payloadGetBound(const GameWorkloadRenderItem::Pointer& payload) { if (payload) { @@ -67,16 +66,18 @@ namespace render { } } template <> const ShapeKey shapeGetShapeKey(const GameWorkloadRenderItem::Pointer& payload) { - if (payload) { - return ShapeKey::Builder::ownPipeline(); - } return ShapeKey::Builder::ownPipeline(); } + template <> int payloadGetLayer(const GameWorkloadRenderItem::Pointer& payloadData) { + return render::Item::LAYER_3D_FRONT; + } + } void GameWorkloadRenderItem::setAllProxies(const std::vector& proxies) { + _myOwnProxies = proxies; static const uint32_t sizeOfProxy = sizeof(workload::Space::Proxy); if (!_allProxiesBuffer) { _allProxiesBuffer = std::make_shared(sizeOfProxy); @@ -97,11 +98,13 @@ const gpu::PipelinePointer GameWorkloadRenderItem::getPipeline() { gpu::Shader::makeProgram(*program, slotBindings); auto state = std::make_shared(); - /* state->setDepthTest(true, false, gpu::LESS_EQUAL); - state->setBlendFunction(true, + state->setDepthTest(true, false, gpu::LESS_EQUAL); + /* state->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, - gpu::State::DEST_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ZERO); -*/ + gpu::State::DEST_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ZERO);*/ + + PrepareStencil::testMaskDrawShape(*state); + state->setCullMode(gpu::State::CULL_NONE); _drawAllProxiesPipeline = gpu::Pipeline::create(program, state); } return _drawAllProxiesPipeline; @@ -111,23 +114,39 @@ void GameWorkloadRenderItem::render(RenderArgs* args) { gpu::Batch& batch = *(args->_batch); // Setup projection - // glm::mat4 projMat; - // Transform viewMat; - // args->getViewFrustum().evalProjectionMatrix(projMat); - // args->getViewFrustum().evalViewTransform(viewMat); - // batch.setProjectionTransform(projMat); - // batch.setViewTransform(viewMat); + glm::mat4 projMat; + Transform viewMat; + args->getViewFrustum().evalProjectionMatrix(projMat); + args->getViewFrustum().evalViewTransform(viewMat); + batch.setProjectionTransform(projMat); + batch.setViewTransform(viewMat); batch.setModelTransform(Transform()); - + // Bind program batch.setPipeline(getPipeline()); batch.setResourceBuffer(0, _allProxiesBuffer); - static const int NUM_VERTICES_PER_QUAD = 24; - batch.draw(gpu::LINES, NUM_VERTICES_PER_QUAD * _numAllProxies, 0); + static const int NUM_VERTICES_PER_QUAD = 6; + batch.draw(gpu::TRIANGLES, NUM_VERTICES_PER_QUAD * _numAllProxies, 0); batch.setResourceBuffer(0, nullptr); + + +/* + auto geometryCache = DependencyManager::get(); + GeometryCache::Shape geometryShape; + glm::vec4 outColor; + geometryShape = GeometryCache::Sphere; +// geometryCache->renderShape(batch, geometryShape, outColor); + + auto pipeline = geometryCache->getOpaqueShapePipeline(); + + for (int i = 0; i < _numAllProxies; i++) { + auto sphere = _myOwnProxies[i].sphere; + batch.setModelTransform(Transform(glm::quat(), glm::vec3(1.0), glm::vec3(sphere.x, sphere.y, sphere.z))); + geometryCache->renderSolidShapeInstance(args, batch, geometryShape, outColor, pipeline); + }*/ } diff --git a/interface/src/workload/GameWorkloadRenderer.h b/interface/src/workload/GameWorkloadRenderer.h index 74e19825b5..10c5c088f2 100644 --- a/interface/src/workload/GameWorkloadRenderer.h +++ b/interface/src/workload/GameWorkloadRenderer.h @@ -45,6 +45,7 @@ public: protected: render::Item::Bound _bound; + std::vector _myOwnProxies; gpu::BufferPointer _allProxiesBuffer; uint32_t _numAllProxies{ 0 }; @@ -60,6 +61,8 @@ namespace render { template <> const Item::Bound payloadGetBound(const GameWorkloadRenderItem::Pointer& payload); template <> void payloadRender(const GameWorkloadRenderItem::Pointer& payload, RenderArgs* args); template <> const ShapeKey shapeGetShapeKey(const GameWorkloadRenderItem::Pointer& payload); + template <> int payloadGetLayer(const GameWorkloadRenderItem::Pointer& payloadData); + } diff --git a/libraries/render-utils/src/drawWorkloadProxy.slf b/libraries/render-utils/src/drawWorkloadProxy.slf index 36606b8afc..2342f2d21b 100644 --- a/libraries/render-utils/src/drawWorkloadProxy.slf +++ b/libraries/render-utils/src/drawWorkloadProxy.slf @@ -10,14 +10,15 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +<@include DeferredBufferWrite.slh@> in vec4 varColor; in vec2 varTexcoord; -out vec4 outFragColor; +//out vec4 outFragColor; void main(void) { - outFragColor = vec4(1.0); - /* + /* outFragColor = vec4(1.0); + float var = step(fract(varTexcoord.x * varTexcoord.y * 1.0), 0.5); if (varColor.a == 0.0) { @@ -27,4 +28,9 @@ void main(void) { outFragColor = vec4(mix(vec3(1.0), varColor.xyz, var), varColor.a); }*/ + + packDeferredFragmentUnlit( + vec3(0.0, 1.0, 0.0), + 1.0, + vec3(1.0)); } diff --git a/libraries/render-utils/src/drawWorkloadProxy.slv b/libraries/render-utils/src/drawWorkloadProxy.slv index 444f4c0917..a5b7f371f4 100644 --- a/libraries/render-utils/src/drawWorkloadProxy.slv +++ b/libraries/render-utils/src/drawWorkloadProxy.slv @@ -61,7 +61,7 @@ void main(void) { vec4(0.0, 1.0, 1.0, 2.0), vec4(1.0, 1.0, 1.0, 3.0) ); - const int UNIT_BOX_LINE_INDICES[24] = int[24]( +/* const int UNIT_BOX_LINE_INDICES[24] = int[24]( 0, 1, 1, 3, 3, 2, @@ -77,7 +77,15 @@ void main(void) { ); int proxyID = gl_VertexID / 24; - int vertexID = gl_VertexID - proxyID * 24; + int vertexID = gl_VertexID - proxyID * 24;*/ + + const int UNIT_BOX_LINE_INDICES[6] = int[6]( + 0, 1, 2, + 2, 1, 3 + ); + + int proxyID = gl_VertexID / 6; + int vertexID = gl_VertexID - proxyID * 6; vec4 cubeVec = UNIT_BOX[UNIT_BOX_LINE_INDICES[vertexID]]; @@ -97,4 +105,4 @@ void main(void) { varTexcoord = vec2(cubeVec.w, length(boundDim)); -} \ No newline at end of file +} From 3360c5a968ab8f2df429eec039850aaafaea6f29 Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 27 Feb 2018 18:46:12 -0800 Subject: [PATCH 3/7] Debugging the ssbo bug --- interface/src/workload/GameWorkloadRenderer.cpp | 13 +++++++------ libraries/render-utils/src/drawWorkloadProxy.slv | 14 ++++++++++---- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/interface/src/workload/GameWorkloadRenderer.cpp b/interface/src/workload/GameWorkloadRenderer.cpp index b73c6fe309..e3e58139df 100644 --- a/interface/src/workload/GameWorkloadRenderer.cpp +++ b/interface/src/workload/GameWorkloadRenderer.cpp @@ -94,7 +94,7 @@ const gpu::PipelinePointer GameWorkloadRenderItem::getPipeline() { gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); gpu::Shader::BindingSet slotBindings; - slotBindings.insert(gpu::Shader::Binding("ssbo0Buffer", 0)); + slotBindings.insert(gpu::Shader::Binding("ssbo0Buffer", 11)); gpu::Shader::makeProgram(*program, slotBindings); auto state = std::make_shared(); @@ -121,17 +121,18 @@ void GameWorkloadRenderItem::render(RenderArgs* args) { batch.setProjectionTransform(projMat); batch.setViewTransform(viewMat); batch.setModelTransform(Transform()); - + // Bind program batch.setPipeline(getPipeline()); - batch.setResourceBuffer(0, _allProxiesBuffer); + // batch.setResourceBuffer(11, _allProxiesBuffer); + batch.setUniformBuffer(11, _allProxiesBuffer); - static const int NUM_VERTICES_PER_QUAD = 6; + static const int NUM_VERTICES_PER_QUAD = 3; batch.draw(gpu::TRIANGLES, NUM_VERTICES_PER_QUAD * _numAllProxies, 0); - batch.setResourceBuffer(0, nullptr); - + // batch.setResourceBuffer(11, nullptr); + batch.setUniformBuffer(11, nullptr); /* auto geometryCache = DependencyManager::get(); diff --git a/libraries/render-utils/src/drawWorkloadProxy.slv b/libraries/render-utils/src/drawWorkloadProxy.slv index a5b7f371f4..db0f04ce63 100644 --- a/libraries/render-utils/src/drawWorkloadProxy.slv +++ b/libraries/render-utils/src/drawWorkloadProxy.slv @@ -25,7 +25,7 @@ struct WorkloadProxy { vec4 sphere; vec4 region; }; - +/* #if defined(GPU_GL410) uniform samplerBuffer ssbo0Buffer; WorkloadProxy getWorkloadProxy(int i) { @@ -44,7 +44,13 @@ WorkloadProxy getWorkloadProxy(int i) { return proxy; } #endif - +*/ +uniform ssbo0Buffer { + WorkloadProxy proxies[1024]; +}; +WorkloadProxy getWorkloadProxy(int index) { + return proxies[index]; +} out vec4 varColor; @@ -84,8 +90,8 @@ void main(void) { 2, 1, 3 ); - int proxyID = gl_VertexID / 6; - int vertexID = gl_VertexID - proxyID * 6; + int proxyID = gl_VertexID / 3; + int vertexID = gl_VertexID - proxyID * 3; vec4 cubeVec = UNIT_BOX[UNIT_BOX_LINE_INDICES[vertexID]]; From 31462a87c3ea9f31cff2d48fb0cb6315f5c1edba Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 28 Feb 2018 10:13:13 -0800 Subject: [PATCH 4/7] now identifying the issue with ResourceBUffer --- interface/src/workload/GameWorkloadRenderer.cpp | 8 ++++---- libraries/render-utils/src/drawWorkloadProxy.slv | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/interface/src/workload/GameWorkloadRenderer.cpp b/interface/src/workload/GameWorkloadRenderer.cpp index e3e58139df..9d0fce9713 100644 --- a/interface/src/workload/GameWorkloadRenderer.cpp +++ b/interface/src/workload/GameWorkloadRenderer.cpp @@ -125,14 +125,14 @@ void GameWorkloadRenderItem::render(RenderArgs* args) { // Bind program batch.setPipeline(getPipeline()); - // batch.setResourceBuffer(11, _allProxiesBuffer); - batch.setUniformBuffer(11, _allProxiesBuffer); + batch.setResourceBuffer(11, _allProxiesBuffer); + // batch.setUniformBuffer(11, _allProxiesBuffer); static const int NUM_VERTICES_PER_QUAD = 3; batch.draw(gpu::TRIANGLES, NUM_VERTICES_PER_QUAD * _numAllProxies, 0); - // batch.setResourceBuffer(11, nullptr); - batch.setUniformBuffer(11, nullptr); + batch.setResourceBuffer(11, nullptr); + // batch.setUniformBuffer(11, nullptr); /* auto geometryCache = DependencyManager::get(); diff --git a/libraries/render-utils/src/drawWorkloadProxy.slv b/libraries/render-utils/src/drawWorkloadProxy.slv index db0f04ce63..486f5ab2f2 100644 --- a/libraries/render-utils/src/drawWorkloadProxy.slv +++ b/libraries/render-utils/src/drawWorkloadProxy.slv @@ -25,7 +25,7 @@ struct WorkloadProxy { vec4 sphere; vec4 region; }; -/* + #if defined(GPU_GL410) uniform samplerBuffer ssbo0Buffer; WorkloadProxy getWorkloadProxy(int i) { @@ -44,13 +44,13 @@ WorkloadProxy getWorkloadProxy(int i) { return proxy; } #endif -*/ +/* uniform ssbo0Buffer { WorkloadProxy proxies[1024]; }; WorkloadProxy getWorkloadProxy(int index) { return proxies[index]; -} +}*/ out vec4 varColor; From d91fb543f33a37cb9489bed0d0779032fbf21895 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 28 Feb 2018 17:15:40 -0800 Subject: [PATCH 5/7] Fix the ssbo in GL4.5 and represent the workload proxies of the space and expose the workload engine to the JS api --- interface/src/Application.cpp | 2 + interface/src/workload/GameWorkload.cpp | 2 + .../src/workload/GameWorkloadRenderer.cpp | 55 ++++++------ interface/src/workload/GameWorkloadRenderer.h | 18 +++- .../gpu-gl/src/gpu/gl45/GL45BackendShader.cpp | 4 +- .../render-utils/src/drawWorkloadProxy.slf | 20 ++--- .../render-utils/src/drawWorkloadProxy.slv | 83 +++++++------------ 7 files changed, 88 insertions(+), 96 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index eedf541086..400c135b78 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2701,6 +2701,7 @@ void Application::onDesktopRootContextCreated(QQmlContext* surfaceContext) { surfaceContext->setContextProperty("HMD", DependencyManager::get().data()); surfaceContext->setContextProperty("Scene", DependencyManager::get().data()); surfaceContext->setContextProperty("Render", _renderEngine->getConfiguration().get()); + surfaceContext->setContextProperty("Workload", _gameWorkload._engine->getConfiguration().get()); surfaceContext->setContextProperty("Reticle", getApplicationCompositor().getReticleInterface()); surfaceContext->setContextProperty("Snapshot", DependencyManager::get().data()); @@ -6109,6 +6110,7 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEnginePointe scriptEngine->registerGlobalObject("Scene", DependencyManager::get().data()); scriptEngine->registerGlobalObject("Render", _renderEngine->getConfiguration().get()); + scriptEngine->registerGlobalObject("Workload", _gameWorkload._engine->getConfiguration().get()); GraphicsScriptingInterface::registerMetaTypes(scriptEngine.data()); scriptEngine->registerGlobalObject("Graphics", DependencyManager::get().data()); diff --git a/interface/src/workload/GameWorkload.cpp b/interface/src/workload/GameWorkload.cpp index 0113e0568d..7fc7a38fc7 100644 --- a/interface/src/workload/GameWorkload.cpp +++ b/interface/src/workload/GameWorkload.cpp @@ -28,6 +28,8 @@ void GameWorkload::startup(const workload::SpacePointer& space, const render::Sc _engine.reset(new workload::Engine(std::make_shared(space, scene))); _engine->addJob("SpaceToRender"); + + } void GameWorkload::shutdown() { diff --git a/interface/src/workload/GameWorkloadRenderer.cpp b/interface/src/workload/GameWorkloadRenderer.cpp index 9d0fce9713..09235d71ea 100644 --- a/interface/src/workload/GameWorkloadRenderer.cpp +++ b/interface/src/workload/GameWorkloadRenderer.cpp @@ -18,6 +18,11 @@ #include "render-utils/drawWorkloadProxy_vert.h" #include "render-utils/drawWorkloadProxy_frag.h" + +void GameSpaceToRender::configure(const Config& config) { + _showAllWorkspace = config.showAllWorkspace; +} + void GameSpaceToRender::run(const workload::WorkloadContextPointer& runContext, Outputs& outputs) { auto gameWorkloadContext = std::dynamic_pointer_cast(runContext); if (!gameWorkloadContext) { @@ -28,6 +33,19 @@ void GameSpaceToRender::run(const workload::WorkloadContextPointer& runContext, return; } + auto visible = _showAllWorkspace; + render::Transaction transaction; + + // Nothing really needed, early exit + if (!visible) { + if (render::Item::isValidID(_spaceRenderItemID)) { + transaction.updateItem(_spaceRenderItemID, [](GameWorkloadRenderItem& item) { + item.setVisible(false); + }); + } + return; + } + std::vector proxies(space->getNumAllocatedProxies()); space->copyProxyValues(proxies.data(), (uint32_t)proxies.size()); @@ -35,15 +53,16 @@ void GameSpaceToRender::run(const workload::WorkloadContextPointer& runContext, auto scene = gameWorkloadContext->_scene; // Valid space, let's display its content - render::Transaction transaction; if (!render::Item::isValidID(_spaceRenderItemID)) { _spaceRenderItemID = scene->allocateID(); auto renderItem = std::make_shared(); renderItem->editBound().setBox(glm::vec3(-100.0f), 200.0f); + renderItem->setVisible(visible); renderItem->setAllProxies(proxies); transaction.resetItem(_spaceRenderItemID, std::make_shared(renderItem)); } else { - transaction.updateItem(_spaceRenderItemID, [proxies](GameWorkloadRenderItem& item) { + transaction.updateItem(_spaceRenderItemID, [visible, proxies](GameWorkloadRenderItem& item) { + item.setVisible(visible); item.setAllProxies(proxies); }); } @@ -52,7 +71,11 @@ void GameSpaceToRender::run(const workload::WorkloadContextPointer& runContext, namespace render { template <> const ItemKey payloadGetKey(const GameWorkloadRenderItem::Pointer& payload) { - return ItemKey::Builder::opaqueShape().withTagBits(render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1); + auto key = ItemKey::Builder::opaqueShape().withTagBits(render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1); + if (!payload->isVisible()) { + key.withInvisible(); + } + return key; } template <> const Item::Bound payloadGetBound(const GameWorkloadRenderItem::Pointer& payload) { if (payload) { @@ -74,8 +97,6 @@ namespace render { } - - void GameWorkloadRenderItem::setAllProxies(const std::vector& proxies) { _myOwnProxies = proxies; static const uint32_t sizeOfProxy = sizeof(workload::Space::Proxy); @@ -94,11 +115,11 @@ const gpu::PipelinePointer GameWorkloadRenderItem::getPipeline() { gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); gpu::Shader::BindingSet slotBindings; - slotBindings.insert(gpu::Shader::Binding("ssbo0Buffer", 11)); + slotBindings.insert(gpu::Shader::Binding("workloadProxiesBuffer", 0)); gpu::Shader::makeProgram(*program, slotBindings); auto state = std::make_shared(); - state->setDepthTest(true, false, gpu::LESS_EQUAL); + state->setDepthTest(true, true, gpu::LESS_EQUAL); /* state->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, gpu::State::DEST_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ZERO);*/ @@ -125,30 +146,12 @@ void GameWorkloadRenderItem::render(RenderArgs* args) { // Bind program batch.setPipeline(getPipeline()); - batch.setResourceBuffer(11, _allProxiesBuffer); - // batch.setUniformBuffer(11, _allProxiesBuffer); + batch.setResourceBuffer(0, _allProxiesBuffer); static const int NUM_VERTICES_PER_QUAD = 3; batch.draw(gpu::TRIANGLES, NUM_VERTICES_PER_QUAD * _numAllProxies, 0); batch.setResourceBuffer(11, nullptr); - // batch.setUniformBuffer(11, nullptr); - -/* - auto geometryCache = DependencyManager::get(); - GeometryCache::Shape geometryShape; - glm::vec4 outColor; - geometryShape = GeometryCache::Sphere; -// geometryCache->renderShape(batch, geometryShape, outColor); - - auto pipeline = geometryCache->getOpaqueShapePipeline(); - - for (int i = 0; i < _numAllProxies; i++) { - auto sphere = _myOwnProxies[i].sphere; - batch.setModelTransform(Transform(glm::quat(), glm::vec3(1.0), glm::vec3(sphere.x, sphere.y, sphere.z))); - geometryCache->renderSolidShapeInstance(args, batch, geometryShape, outColor, pipeline); - }*/ - } diff --git a/interface/src/workload/GameWorkloadRenderer.h b/interface/src/workload/GameWorkloadRenderer.h index 10c5c088f2..dd568eadec 100644 --- a/interface/src/workload/GameWorkloadRenderer.h +++ b/interface/src/workload/GameWorkloadRenderer.h @@ -12,16 +12,32 @@ #include "GameWorkload.h" +class GameSpaceToRenderConfig : public workload::Job::Config { + Q_OBJECT + Q_PROPERTY(bool showAllWorkspace MEMBER showAllWorkspace NOTIFY dirty) +public: + + bool showAllWorkspace{ false }; +signals: + void dirty(); + +protected: +}; + class GameSpaceToRender { public: + using Config = GameSpaceToRenderConfig; using Outputs = render::Transaction; - using JobModel = workload::Job::ModelO; + using JobModel = workload::Job::ModelO; GameSpaceToRender() {} + + void configure(const Config& config); void run(const workload::WorkloadContextPointer& renderContext, Outputs& outputs); protected: render::ItemID _spaceRenderItemID{ render::Item::INVALID_ITEM_ID }; + bool _showAllWorkspace{ false }; }; diff --git a/libraries/gpu-gl/src/gpu/gl45/GL45BackendShader.cpp b/libraries/gpu-gl/src/gpu/gl45/GL45BackendShader.cpp index c2490524ae..80860edcbd 100644 --- a/libraries/gpu-gl/src/gpu/gl45/GL45BackendShader.cpp +++ b/libraries/gpu-gl/src/gpu/gl45/GL45BackendShader.cpp @@ -70,7 +70,7 @@ int GL45Backend::makeResourceBufferSlots(GLuint glprogram, const Shader::Binding auto requestedBinding = slotBindings.find(info.name); if (requestedBinding != slotBindings.end()) { info.binding = (*requestedBinding)._location; - glUniformBlockBinding(glprogram, info.index, info.binding); + glShaderStorageBlockBinding(glprogram, info.index, info.binding); resourceBufferSlotMap[info.binding] = info.index; } } @@ -86,7 +86,7 @@ int GL45Backend::makeResourceBufferSlots(GLuint glprogram, const Shader::Binding auto slotIt = std::find_if(resourceBufferSlotMap.begin(), resourceBufferSlotMap.end(), GLBackend::isUnusedSlot); if (slotIt != resourceBufferSlotMap.end()) { info.binding = slotIt - resourceBufferSlotMap.begin(); - glUniformBlockBinding(glprogram, info.index, info.binding); + glShaderStorageBlockBinding(glprogram, info.index, info.binding); } else { // This should never happen, an active ssbo cannot find an available slot among the max available?! info.binding = -1; diff --git a/libraries/render-utils/src/drawWorkloadProxy.slf b/libraries/render-utils/src/drawWorkloadProxy.slf index 2342f2d21b..cd02066caf 100644 --- a/libraries/render-utils/src/drawWorkloadProxy.slf +++ b/libraries/render-utils/src/drawWorkloadProxy.slf @@ -11,26 +11,20 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // <@include DeferredBufferWrite.slh@> +<@include gpu/Paint.slh@> in vec4 varColor; in vec2 varTexcoord; -//out vec4 outFragColor; void main(void) { - /* outFragColor = vec4(1.0); + float r = sqrt(dot(varTexcoord.xy,varTexcoord.xy)); + float a = paintStripe(r * varColor.w, 0.0, 1.0 / varColor.w, 0.05 / varColor.w); + if (a <= 0.1 || r > 1.1) { + discard; + } - float var = step(fract(varTexcoord.x * varTexcoord.y * 1.0), 0.5); - - if (varColor.a == 0.0) { - outFragColor = vec4(mix(vec3(0.0), varColor.xyz, var), mix(0.0, 1.0, var)); - - } else { - outFragColor = vec4(mix(vec3(1.0), varColor.xyz, var), varColor.a); - }*/ - - packDeferredFragmentUnlit( vec3(0.0, 1.0, 0.0), 1.0, - vec3(1.0)); + varColor.rgb); } diff --git a/libraries/render-utils/src/drawWorkloadProxy.slv b/libraries/render-utils/src/drawWorkloadProxy.slv index 486f5ab2f2..aaa9073fdc 100644 --- a/libraries/render-utils/src/drawWorkloadProxy.slv +++ b/libraries/render-utils/src/drawWorkloadProxy.slv @@ -27,88 +27,63 @@ struct WorkloadProxy { }; #if defined(GPU_GL410) -uniform samplerBuffer ssbo0Buffer; +uniform samplerBuffer workloadProxiesBuffer; WorkloadProxy getWorkloadProxy(int i) { int offset = 2 * i; WorkloadProxy proxy; - proxy.sphere = texelFetch(ssbo0Buffer, offset); - proxy.region = texelFetch(ssbo0Buffer, offset + 1); + proxy.sphere = texelFetch(workloadProxiesBuffer, offset); + proxy.region = texelFetch(workloadProxiesBuffer, offset + 1); return proxy; } #else -layout(std140) buffer ssbo0Buffer { - WorkloadProxy proxies[]; +layout(std140) buffer workloadProxiesBuffer { + WorkloadProxy _proxies[]; }; WorkloadProxy getWorkloadProxy(int i) { - WorkloadProxy proxy = proxies[i]; + WorkloadProxy proxy = _proxies[i]; return proxy; } #endif -/* -uniform ssbo0Buffer { - WorkloadProxy proxies[1024]; -}; -WorkloadProxy getWorkloadProxy(int index) { - return proxies[index]; -}*/ + out vec4 varColor; out vec2 varTexcoord; void main(void) { - const vec4 UNIT_BOX[8] = vec4[8]( - vec4(0.0, 0.0, 0.0, 0.0), - vec4(1.0, 0.0, 0.0, 1.0), - vec4(0.0, 1.0, 0.0, 1.0), - vec4(1.0, 1.0, 0.0, 2.0), - vec4(0.0, 0.0, 1.0, 1.0), - vec4(1.0, 0.0, 1.0, 2.0), - vec4(0.0, 1.0, 1.0, 2.0), - vec4(1.0, 1.0, 1.0, 3.0) + const vec4 UNIT_SPRITE[3] = vec4[3]( + vec4(-1.0, -1.0, 0.0, 1.0), + vec4(3.0, -1.0, 0.0, 1.0), + vec4(-1.0, 3.0, 0.0, 1.0) ); -/* const int UNIT_BOX_LINE_INDICES[24] = int[24]( - 0, 1, - 1, 3, - 3, 2, - 2, 0, - 4, 5, - 5, 7, - 7, 6, - 6, 4, - 2, 6, - 3, 7, - 0, 4, - 1, 5 + const int UNIT_SPRITE_INDICES[3] = int[3]( + 0, 1, 2 ); - - int proxyID = gl_VertexID / 24; - int vertexID = gl_VertexID - proxyID * 24;*/ - - const int UNIT_BOX_LINE_INDICES[6] = int[6]( - 0, 1, 2, - 2, 1, 3 - ); - int proxyID = gl_VertexID / 3; int vertexID = gl_VertexID - proxyID * 3; - vec4 cubeVec = UNIT_BOX[UNIT_BOX_LINE_INDICES[vertexID]]; + vec4 spriteVert = UNIT_SPRITE[UNIT_SPRITE_INDICES[vertexID]]; WorkloadProxy proxy = getWorkloadProxy(proxyID); - vec3 boundPos = proxy.sphere.xyz; - // vec3 boundDim = vec3(proxy.sphere.w); - vec3 boundDim = vec3(0.5); + vec4 proxyPosWorld = vec4(proxy.sphere.xyz, 1.0); - vec4 pos = vec4(boundPos + boundDim * cubeVec.xyz, 1.0); - - // standard transform + // standard transform, bring proxy in view space TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - <$transformModelToClipPos(cam, obj, pos, gl_Position)$> + vec4 proxyPosEye; + <$transformModelToEyePos(cam, obj, proxyPosWorld, proxyPosEye)$> - varColor = vec4(colorWheel(float(proxyID)/(-inColor.w)), 1.0); + // Define the billboarded space + vec3 dirZ = -normalize(proxyPosEye.xyz); + vec3 dirX = normalize(cross(vec3(0.0, 1.0, 0.0), dirZ)); + vec3 dirY = vec3(0.0, 1.0, 0.0); + // vec3 dirY = normalize(cross(dirZ, vec3(1.0, 0.0, 0.0))); - varTexcoord = vec2(cubeVec.w, length(boundDim)); + vec4 pos = vec4(proxyPosEye.xyz + proxy.sphere.w * ( dirX * spriteVert.x + dirY * spriteVert.y /* + dirZ * spriteVert.z*/), 1.0); + varTexcoord = spriteVert.xy; + <$transformEyeToClipPos(cam, pos, gl_Position)$> + // Convert region to color + + varColor = vec4(colorWheel(proxy.region.x), proxy.sphere.w); } From b1b539e07a062d62ffb3d1c083808634b20bf163 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 28 Feb 2018 17:56:37 -0800 Subject: [PATCH 6/7] Adding debug color of the region --- libraries/render-utils/src/drawWorkloadProxy.slv | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/render-utils/src/drawWorkloadProxy.slv b/libraries/render-utils/src/drawWorkloadProxy.slv index aaa9073fdc..2f14045d3a 100644 --- a/libraries/render-utils/src/drawWorkloadProxy.slv +++ b/libraries/render-utils/src/drawWorkloadProxy.slv @@ -84,6 +84,8 @@ void main(void) { <$transformEyeToClipPos(cam, pos, gl_Position)$> // Convert region to color + int region = floatBitsToInt(proxy.region.x); + region = (0x000000FF & region); - varColor = vec4(colorWheel(proxy.region.x), proxy.sphere.w); + varColor = vec4(float(region) / 4.0, proxy.sphere.w); } From 94fa2ef6a0f86b83a458c7a3540abc2c7cec938e Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 28 Feb 2018 17:59:59 -0800 Subject: [PATCH 7/7] Adding debug color of the region --- libraries/render-utils/src/drawWorkloadProxy.slv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/render-utils/src/drawWorkloadProxy.slv b/libraries/render-utils/src/drawWorkloadProxy.slv index 2f14045d3a..ac83e7761a 100644 --- a/libraries/render-utils/src/drawWorkloadProxy.slv +++ b/libraries/render-utils/src/drawWorkloadProxy.slv @@ -87,5 +87,5 @@ void main(void) { int region = floatBitsToInt(proxy.region.x); region = (0x000000FF & region); - varColor = vec4(float(region) / 4.0, proxy.sphere.w); + varColor = vec4(colorWheel(float(region) / 4.0), proxy.sphere.w); }