History

initial work on combining shader variants

SamGondelman committed 7 years ago

Commit 6111c8a1 parent 993fcea174 files · +1362 −4106Browse files

Showing the changes to libraries/render-utils/src/GeometryCache.cpp (1 of 174 files). Show all

Unified · Split

libraries/render-utils/src/GeometryCache.cpp+38−35
@@ -113,6 +113,7 @@ static const uint SHAPE_NORMALS_OFFSET = offsetof(GeometryCache::ShapeVertex, no · 112 unmodified lines
113static const uint SHAPE_TEXCOORD0_OFFSET = offsetof(GeometryCache::ShapeVertex, uv);113static const uint SHAPE_TEXCOORD0_OFFSET = offsetof(GeometryCache::ShapeVertex, uv);
114static const uint SHAPE_TANGENT_OFFSET = offsetof(GeometryCache::ShapeVertex, tangent);114static const uint SHAPE_TANGENT_OFFSET = offsetof(GeometryCache::ShapeVertex, tangent);
115 115
116std::map<std::pair<bool, bool>, gpu::PipelinePointer> GeometryCache::_webPipelines;
116std::map<std::pair<bool, bool>, gpu::PipelinePointer> GeometryCache::_gridPipelines;117std::map<std::pair<bool, bool>, gpu::PipelinePointer> GeometryCache::_gridPipelines;
117 118
118void GeometryCache::computeSimpleHullPointListForShape(const int entityShape, const glm::vec3 &entityExtents, QVector<glm::vec3> &outPointList) {119void GeometryCache::computeSimpleHullPointListForShape(const int entityShape, const glm::vec3 &entityExtents, QVector<glm::vec3> &outPointList) {
@@ -2045,7 +2046,7 @@ void GeometryCache::useGridPipeline(gpu::Batch& batch, GridBuffer gridBuffer, bo · 1926 unmodified lines
2045 const float DEPTH_BIAS = 0.001f;2046 const float DEPTH_BIAS = 0.001f;
2046 2047
2047 static const std::vector<std::tuple<bool, bool, uint32_t>> keys = {2048 static const std::vector<std::tuple<bool, bool, uint32_t>> keys = {
2048 std::make_tuple(false, false, grid), std::make_tuple(false, true, forward_grid), std::make_tuple(true, false, grid_translucent), std::make_tuple(true, true, forward_grid_translucent)2049 std::make_tuple(false, false, grid), std::make_tuple(false, true, grid_forward), std::make_tuple(true, false, grid_translucent), std::make_tuple(true, true, grid_translucent_forward)
2049 };2050 };
2050 2051
2051 for (auto& key : keys) {2052 for (auto& key : keys) {
@@ -2136,34 +2137,36 @@ inline bool operator==(const SimpleProgramKey& a, const SimpleProgramKey& b) { · 84 unmodified lines
2136 return a.getRaw() == b.getRaw();2137 return a.getRaw() == b.getRaw();
2137}2138}
2138 2139
2139static void buildWebShader(int programId, bool blendEnable,2140void GeometryCache::bindWebBrowserProgram(gpu::Batch& batch, bool transparent, bool forward) {
2140 gpu::ShaderPointer& shaderPointerOut, gpu::PipelinePointer& pipelinePointerOut) {2141 batch.setPipeline(getWebBrowserProgram(transparent, forward));
2141 shaderPointerOut = gpu::Shader::createProgram(programId);2142}
2142 auto state = std::make_shared<gpu::State>();
2143 state->setCullMode(gpu::State::CULL_NONE);
2144 state->setDepthTest(true, true, gpu::LESS_EQUAL);
2145 state->setBlendFunction(blendEnable,
2146 gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA,
2147 gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE);
2148 2143
2149 PrepareStencil::testMaskDrawShapeNoAA(*state);2144gpu::PipelinePointer GeometryCache::getWebBrowserProgram(bool transparent, bool forward) {
2145 if (_webPipelines.empty()) {
2146 using namespace shader::render_utils::program;
2147 static const std::vector<std::tuple<bool, bool, uint32_t>> keys = {
2148 std::make_tuple(false, false, web_browser), std::make_tuple(false, true, web_browser_forward),
2149 std::make_tuple(true, false, web_browser_translucent)
2150 };
2150 2151
2151 pipelinePointerOut = gpu::Pipeline::create(shaderPointerOut, state);2152 for (auto& key : keys) {
2152}2153 gpu::StatePointer state = gpu::StatePointer(new gpu::State());
2154 state->setDepthTest(true, true, gpu::LESS_EQUAL);
2155 // FIXME: do we need a testMaskDrawNoAA?
2156 PrepareStencil::testMaskDrawShapeNoAA(*state);
2157 state->setBlendFunction(std::get<0>(key),
2158 gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA,
2159 gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE);
2160 state->setCullMode(gpu::State::CULL_NONE);
2153 2161
2154void GeometryCache::bindWebBrowserProgram(gpu::Batch& batch, bool transparent) {2162 _webPipelines[{std::get<0>(key), std::get<1>(key)}] = gpu::Pipeline::create(gpu::Shader::createProgram(std::get<2>(key)), state);
2155 batch.setPipeline(getWebBrowserProgram(transparent));2163 }
2156}
2157 2164
2158gpu::PipelinePointer GeometryCache::getWebBrowserProgram(bool transparent) {2165 // The forward opaque/translucent pipelines are the same for now
2159 static std::once_flag once;2166 _webPipelines[{ true, true }] = _webPipelines[{ false, true }];
2160 std::call_once(once, [&]() {2167 }
2161 // FIXME: need a forward pipeline for this
2162 buildWebShader(shader::render_utils::program::simple_opaque_web_browser, false, _simpleOpaqueWebBrowserShader, _simpleOpaqueWebBrowserPipeline);
2163 buildWebShader(shader::render_utils::program::simple_transparent_web_browser, true, _simpleTransparentWebBrowserShader, _simpleTransparentWebBrowserPipeline);
2164 });
2165 2168
2166 return transparent ? _simpleTransparentWebBrowserPipeline : _simpleOpaqueWebBrowserPipeline;2169 return _webPipelines[{ transparent, forward }];
2167}2170}
2168 2171
2169void GeometryCache::bindSimpleProgram(gpu::Batch& batch, bool textured, bool transparent, bool culled, bool unlit, bool depthBiased, bool isAntiAliased, bool forward) {2172void GeometryCache::bindSimpleProgram(gpu::Batch& batch, bool textured, bool transparent, bool culled, bool unlit, bool depthBiased, bool isAntiAliased, bool forward) {
@@ -2191,24 +2194,24 @@ gpu::PipelinePointer GeometryCache::getSimplePipeline(bool textured, bool transp · 21 unmodified lines
2191 std::call_once(once, [&]() {2194 std::call_once(once, [&]() {
2192 using namespace shader::render_utils::program;2195 using namespace shader::render_utils::program;
2193 2196
2194 _forwardSimpleShader = gpu::Shader::createProgram(forward_simple_textured);2197 _forwardSimpleShader = gpu::Shader::createProgram(simple_forward);
2195 _forwardTransparentShader = gpu::Shader::createProgram(forward_simple_textured_transparent);2198 _forwardTransparentShader = gpu::Shader::createProgram(simple_translucent_forward);
2196 _forwardUnlitShader = gpu::Shader::createProgram(forward_simple_textured_unlit);2199 _forwardUnlitShader = gpu::Shader::createProgram(simple_unlit_forward);
2197 2200
2198 _simpleShader = gpu::Shader::createProgram(simple_textured);2201 _simpleShader = gpu::Shader::createProgram(simple);
2199 _transparentShader = gpu::Shader::createProgram(simple_transparent_textured);2202 _transparentShader = gpu::Shader::createProgram(simple_translucent);
2200 _unlitShader = gpu::Shader::createProgram(simple_textured_unlit);2203 _unlitShader = gpu::Shader::createProgram(simple_unlit);
2201 });2204 });
2202 } else {2205 } else {
2203 static std::once_flag once;2206 static std::once_flag once;
2204 std::call_once(once, [&]() {2207 std::call_once(once, [&]() {
2205 using namespace shader::render_utils::program;2208 using namespace shader::render_utils::program;
2206 // FIXME: these aren't right...2209 // Fading is currently disabled during forward rendering
2207 _forwardSimpleFadeShader = gpu::Shader::createProgram(forward_simple_textured);2210 _forwardSimpleFadeShader = gpu::Shader::createProgram(simple_forward);
2208 _forwardUnlitFadeShader = gpu::Shader::createProgram(forward_simple_textured_unlit);2211 _forwardUnlitFadeShader = gpu::Shader::createProgram(simple_unlit_forward);
2209 2212
2210 _simpleFadeShader = gpu::Shader::createProgram(simple_textured_fade);2213 _simpleFadeShader = gpu::Shader::createProgram(simple_fade);
2211 _unlitFadeShader = gpu::Shader::createProgram(simple_textured_unlit_fade);2214 _unlitFadeShader = gpu::Shader::createProgram(simple_unlit_fade);
2212 });2215 });
2213 }2216 }
2214 2217