X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fgraphics%2Fgles-impl%2Fgles-context.cpp;h=1d981bc781917d92b246ab4484f6c3050245e1e2;hb=9ff84c1eb3f9fa705218b12aa4791133821a8ddc;hp=ff38d4469f3093580b52d4a44bda68bf91c3f5ea;hpb=4387b0de650b6f0fd8b1b7c44b71841ca628d977;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/graphics/gles-impl/gles-context.cpp b/dali/internal/graphics/gles-impl/gles-context.cpp index ff38d44..1d981bc 100644 --- a/dali/internal/graphics/gles-impl/gles-context.cpp +++ b/dali/internal/graphics/gles-impl/gles-context.cpp @@ -17,6 +17,7 @@ #include "gles-context.h" #include +#include #include #include #include @@ -28,6 +29,7 @@ #include "gles-graphics-program.h" #include "gles-graphics-render-pass.h" #include "gles-graphics-render-target.h" +#include "gles-texture-dependency-checker.h" #include #include @@ -232,7 +234,7 @@ Context::~Context() } } -void Context::Flush(bool reset, const GLES::DrawCallDescriptor& drawCall) +void Context::Flush(bool reset, const GLES::DrawCallDescriptor& drawCall, GLES::TextureDependencyChecker& dependencyChecker) { auto& gl = *mImpl->mController.GetGL(); @@ -256,6 +258,13 @@ void Context::Flush(bool reset, const GLES::DrawCallDescriptor& drawCall) newProgram = static_cast(mImpl->mNewPipeline->GetCreateInfo().programState->program); } + if(!currentProgram && !newProgram) + { + // Early out if we have no program for this pipeline. + DALI_LOG_ERROR("No program defined for pipeline\n"); + return; + } + if(mImpl->mNewPipeline && mImpl->mCurrentPipeline != mImpl->mNewPipeline) { if(!currentProgram || currentProgram->GetImplementation()->GetGlProgram() != newProgram->GetImplementation()->GetGlProgram()) @@ -290,6 +299,9 @@ void Context::Flush(bool reset, const GLES::DrawCallDescriptor& drawCall) texture->InitializeResource(); } + // Warning, this may cause glWaitSync to occur on the GPU. + dependencyChecker.CheckNeedsSync(this, texture); + texture->Bind(binding); texture->Prepare(); // @todo also non-const. @@ -629,7 +641,8 @@ void Context::BeginRenderPass(const BeginRenderPassDescriptor& renderPassBegin) else if(targetInfo.framebuffer) { // bind framebuffer and swap. - renderTarget.GetFramebuffer()->Bind(); + auto framebuffer = renderTarget.GetFramebuffer(); + framebuffer->Bind(); } // clear (ideally cache the setup) @@ -641,6 +654,7 @@ void Context::BeginRenderPass(const BeginRenderPassDescriptor& renderPassBegin) const auto& attachments = *renderPass.GetCreateInfo().attachments; const auto& color0 = attachments[0]; GLuint mask = 0; + if(color0.loadOp == AttachmentLoadOp::CLEAR) { mask |= GL_COLOR_BUFFER_BIT; @@ -703,14 +717,28 @@ void Context::BeginRenderPass(const BeginRenderPassDescriptor& renderPassBegin) mImpl->mCurrentRenderTarget = &renderTarget; } -void Context::EndRenderPass() +void Context::EndRenderPass(GLES::TextureDependencyChecker& dependencyChecker) { if(mImpl->mCurrentRenderTarget) { - if(mImpl->mCurrentRenderTarget->GetFramebuffer()) + GLES::Framebuffer* framebuffer = mImpl->mCurrentRenderTarget->GetFramebuffer(); + if(framebuffer) { auto& gl = *mImpl->mController.GetGL(); gl.Flush(); + + /* @todo Full dependency checking would need to store textures in Begin, and create + * fence objects here; but we're going to draw all fbos on shared context in serial, + * so no real need (yet). Might want to consider ensuring order of render passes, + * but that needs doing in the controller, and would need doing before ProcessCommandQueues. + * + * Currently up to the client to create render tasks in the right order. + */ + + /* Create fence sync objects. Other contexts can then wait on these fences before reading + * textures. + */ + dependencyChecker.AddTextures(this, framebuffer); } } } @@ -1003,13 +1031,20 @@ void Context::PrepareForNativeRendering() if(!mImpl->mNativeDrawContext) { EGLint configId{0u}; - EGLint size{0u}; - eglGetConfigs(display, nullptr, 0, &size); - std::vector configs; - configs.resize(size); - eglGetConfigs(display, configs.data(), configs.size(), &size); + eglQueryContext(display, mImpl->mController.GetSharedContext(), EGL_CONFIG_ID, &configId); - eglQueryContext(display, context, EGL_CONFIG_ID, &configId); + EGLint configAttribs[3]; + configAttribs[0] = EGL_CONFIG_ID; + configAttribs[1] = configId; + configAttribs[2] = EGL_NONE; + + EGLConfig config; + EGLint numConfigs; + if(eglChooseConfig(display, configAttribs, &config, 1, &numConfigs) != EGL_TRUE) + { + DALI_LOG_ERROR("eglChooseConfig failed!\n"); + return; + } auto version = int(mImpl->mController.GetGLESVersion()); @@ -1020,7 +1055,12 @@ void Context::PrepareForNativeRendering() attribs.push_back(version % 10); attribs.push_back(EGL_NONE); - mImpl->mNativeDrawContext = eglCreateContext(display, configs[configId], mImpl->mController.GetSharedContext(), attribs.data()); + mImpl->mNativeDrawContext = eglCreateContext(display, config, mImpl->mController.GetSharedContext(), attribs.data()); + if(mImpl->mNativeDrawContext == EGL_NO_CONTEXT) + { + DALI_LOG_ERROR("eglCreateContext failed!\n"); + return; + } } eglMakeCurrent(display, drawSurface, readSurface, mImpl->mNativeDrawContext);