void OGLESTextureCubeDepthStencilRenderView::OnAttached(FrameBuffer& fb, uint32_t att) { UNREF_PARAM(att); BOOST_ASSERT(FrameBuffer::ATT_DepthStencil == att); index_ = 0; fbo_ = checked_cast<OGLESFrameBuffer*>(&fb)->OGLFbo(); GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X + face_ - Texture::CF_Positive_X; OGLESRenderEngine& re = *checked_cast<OGLESRenderEngine*>(&Context::Instance().RenderFactoryInstance().RenderEngineInstance()); re.BindFramebuffer(fbo_); if (IsDepthFormat(pf_)) { glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, face, tex_, level_); } if (IsStencilFormat(pf_)) { glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, face, tex_, level_); } re.BindFramebuffer(0); }
void OGLESDepthStencilRenderView::OnAttached(FrameBuffer& fb, uint32_t att) { UNREF_PARAM(att); BOOST_ASSERT(FrameBuffer::ATT_DepthStencil == att); index_ = 0; fbo_ = checked_cast<OGLESFrameBuffer*>(&fb)->OGLFbo(); if (level_ < 0) { OGLESRenderEngine& re = *checked_cast<OGLESRenderEngine*>(&Context::Instance().RenderFactoryInstance().RenderEngineInstance()); re.BindFramebuffer(fbo_); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo_); if (IsStencilFormat(pf_)) { glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo_); } re.BindFramebuffer(0); } else { OGLESRenderEngine& re = *checked_cast<OGLESRenderEngine*>(&Context::Instance().RenderFactoryInstance().RenderEngineInstance()); BOOST_ASSERT(GL_TEXTURE_2D == target_type_); re.BindFramebuffer(fbo_); if (IsDepthFormat(pf_)) { glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, target_type_, tex_, level_); } if (IsStencilFormat(pf_)) { glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, target_type_, tex_, level_); } re.BindFramebuffer(0); } }
void OGLESRenderView::ClearDepthStencil(float depth, int32_t stencil) { uint32_t flags = 0; if (IsDepthFormat(pf_)) { flags |= GL_DEPTH_BUFFER_BIT; } if (IsStencilFormat(pf_)) { flags |= GL_STENCIL_BUFFER_BIT; } this->DoClear(flags, Color(), depth, stencil); }
void OGLESFrameBuffer::Clear(uint32_t flags, Color const & clr, float depth, int32_t stencil) { OGLESRenderEngine& re = *checked_cast<OGLESRenderEngine*>(&Context::Instance().RenderFactoryInstance().RenderEngineInstance()); GLuint old_fbo = re.BindFramebuffer(); re.BindFramebuffer(fbo_); bool has_color = (flags & CBM_Color) && !!this->Attached(ATT_Color0); bool has_depth = false; bool has_stencil = false; RenderViewPtr const & ds_view = this->Attached(ATT_DepthStencil); if (ds_view) { has_depth = (flags & CBM_Depth) && IsDepthFormat(ds_view->Format()); has_stencil = (flags & CBM_Stencil) && IsStencilFormat(ds_view->Format()); } DepthStencilStateDesc const & ds_desc = re.CurDSSObj()->GetDesc(); BlendStateDesc const & blend_desc = re.CurBSObj()->GetDesc(); if (has_color) { if (blend_desc.color_write_mask[0] != CMASK_All) { glColorMask(true, true, true, true); } } if (has_depth) { if (!ds_desc.depth_write_mask) { glDepthMask(GL_TRUE); } } if (has_stencil) { if (ds_desc.front_stencil_write_mask != 0xFF) { glStencilMaskSeparate(GL_FRONT, 0xFF); } if (ds_desc.back_stencil_write_mask != 0xFF) { glStencilMaskSeparate(GL_BACK, 0xFF); } } if (glloader_GLES_VERSION_3_0()) { if (flags & CBM_Color) { if (fbo_ != 0) { for (size_t i = 0; i < clr_views_.size(); ++ i) { if (clr_views_[i]) { glClearBufferfv(GL_COLOR, static_cast<GLint>(i), &clr[0]); } } } else { glClearBufferfv(GL_COLOR, 0, &clr[0]); } } if (has_depth && has_stencil) { glClearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil); } else { if (has_depth) { glClearBufferfv(GL_DEPTH, 0, &depth); } else if (has_stencil) { GLint s = stencil; glClearBufferiv(GL_STENCIL, 0, &s); } } } else { GLbitfield ogl_flags = 0; if (has_color) { ogl_flags |= GL_COLOR_BUFFER_BIT; re.ClearColor(clr.r(), clr.g(), clr.b(), clr.a()); } if (has_depth) { ogl_flags |= GL_DEPTH_BUFFER_BIT; re.ClearDepth(depth); } if (has_stencil) { ogl_flags |= GL_STENCIL_BUFFER_BIT; re.ClearStencil(stencil); } glClear(ogl_flags); } if (flags & CBM_Color) { if (blend_desc.color_write_mask[0] != CMASK_All) { glColorMask((blend_desc.color_write_mask[0] & CMASK_Red) != 0, (blend_desc.color_write_mask[0] & CMASK_Green) != 0, (blend_desc.color_write_mask[0] & CMASK_Blue) != 0, (blend_desc.color_write_mask[0] & CMASK_Alpha) != 0); } } if (has_depth) { if (!ds_desc.depth_write_mask) { glDepthMask(GL_FALSE); } } if (has_stencil) { if (ds_desc.front_stencil_write_mask != 0xFF) { glStencilMaskSeparate(GL_FRONT, ds_desc.front_stencil_write_mask); } if (ds_desc.back_stencil_write_mask != 0xFF) { glStencilMaskSeparate(GL_BACK, ds_desc.back_stencil_write_mask); } } re.BindFramebuffer(old_fbo); }