return ( mStencil ) ? mStencil.Get() : nullptr;
}
+uint8_t* FrameBuffer::GetRenderedBuffer()
+{
+ return mRenderObject->GetRenderedBuffer();
+}
+
+void FrameBuffer::CaptureRenderedResult()
+{
+ CaptureRenderingResult(mEventThreadServices.GetUpdateManager(), *mRenderObject);
+}
+
void FrameBuffer::SetSize( uint32_t width, uint32_t height )
{
mWidth = width;
Texture* GetDepthStencilTexture() const;
/**
+ * @brief Retrieve captured buffer
+ *
+ * @return a pointer of the buffer.
+ */
+ uint8_t* GetRenderedBuffer();
+
+ /**
+ * @copydoc Dali::FrameBuffer::CaptureRenderedResult()
+ */
+ void CaptureRenderedResult();
+
+ /**
* @brief Sets the frame buffer size.
* @param[in] width The width size
* @param[in] height The height size
frameBuffer->AttachDepthStencilTexture( mImpl->context, texture, mipmapLevel );
}
+void RenderManager::CaptureRenderingResult(Render::FrameBuffer* frameBuffer)
+{
+ frameBuffer->CaptureRenderingResult();
+}
+
void RenderManager::AddVertexBuffer( OwnerPointer< Render::VertexBuffer >& vertexBuffer )
{
mImpl->vertexBufferContainer.PushBack( vertexBuffer.Release() );
if ( renderToFbo )
{
mImpl->currentContext->Flush();
+ instruction.mFrameBuffer->DrawRenderedBuffer(*mImpl->currentContext);
}
}
void AttachDepthStencilTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::Texture* texture, uint32_t mipmapLevel );
/**
+ * Request to capture rendered result
+ * @param[in] frameBuffer The FrameBuffer
+ */
+ void CaptureRenderingResult(Render::FrameBuffer* frameBuffer);
+
+ /**
* Initializes a Scene to the render manager
* @param[in] scene The Scene to initialize
*/
mStencilBuffer( attachments & Dali::FrameBuffer::Attachment::STENCIL ),
mWidth( width ),
mHeight( height ),
- mColorAttachmentCount( 0u )
+ mColorAttachmentCount( 0u ),
+ mCaptureRenderedResult(false),
+ mCaptured(false)
{
}
-FrameBuffer::~FrameBuffer() = default;
+FrameBuffer::~FrameBuffer()
+{
+ if(mCaptured)
+ {
+ delete[] mRenderedBuffer;
+ }
+}
void FrameBuffer::Destroy( Context& context )
{
return mHeight;
}
+void FrameBuffer::DrawRenderedBuffer(Context& context)
+{
+ if(!mCaptureRenderedResult)
+ {
+ return;
+ }
+
+ if(mCaptured)
+ {
+ delete[] mRenderedBuffer;
+ }
+
+ context.BindFramebuffer(GL_FRAMEBUFFER, mId);
+ mRenderedBuffer = new GLubyte[mWidth * mHeight * sizeof(GL_UNSIGNED_BYTE)];
+ context.ReadPixels(0, 0, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, mRenderedBuffer);
+ context.BindFramebuffer(GL_FRAMEBUFFER, 0);
+ mCaptureRenderedResult = false;
+ mCaptured = true;
+}
+
+GLubyte* FrameBuffer::GetRenderedBuffer()
+{
+ if(mCaptured)
+ {
+ return mRenderedBuffer;
+ }
+ else
+ {
+ return nullptr;
+ }
+}
+
+void FrameBuffer::CaptureRenderingResult()
+{
+ mCaptureRenderedResult = true;
+}
+
} //Render
*/
GLuint GetTextureId(uint8_t index) { return mTextureId[index]; };
+ /**
+ * @brief Read render result
+ */
+ void DrawRenderedBuffer(Context& context);
+
+ /**
+ * @brief Retrieve rendered buffer.
+ * @return Buffer pointer
+ */
+ GLubyte* GetRenderedBuffer();
+
+ /**
+ * @brief Request to Read rendered result.
+ */
+ void CaptureRenderingResult();
+
private:
/**
uint32_t mWidth;
uint32_t mHeight;
uint8_t mColorAttachmentCount;
+ GLubyte* mRenderedBuffer;
+ bool mCaptureRenderedResult;
+ bool mCaptured;
};
} // namespace Render
new (slot) DerivedType( &mImpl->renderManager, &RenderManager::AttachDepthStencilTextureToFrameBuffer, frameBuffer, texture, mipmapLevel );
}
+void UpdateManager::CaptureRenderingResult(Render::FrameBuffer* frameBuffer)
+{
+ using DerivedType = MessageValue1<RenderManager, Render::FrameBuffer*>;
+
+ // Reserve some memory inside the render queue
+ uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot(mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof(DerivedType));
+
+ // Construct message in the render queue memory; note that delete should not be called on the return value
+ new(slot) DerivedType(&mImpl->renderManager, &RenderManager::CaptureRenderingResult, frameBuffer);
+}
+
} // namespace SceneGraph
} // namespace Internal
void AttachDepthStencilTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::Texture* texture, uint32_t mipmapLevel );
/**
+ * Request to capture rendered result
+ * @param[in] frameBuffer The FrameBuffer
+ */
+ void CaptureRenderingResult(Render::FrameBuffer* frameBuffer);
+
+ /**
* This is called when the surface of the scene has been replaced.
* @param[in] scene The scene.
*/
new (slot) LocalType( &manager, &UpdateManager::AttachDepthStencilTextureToFrameBuffer, &frameBuffer, texture, mipmapLevel );
}
+inline void CaptureRenderingResult(UpdateManager& manager, Render::FrameBuffer& frameBuffer)
+{
+ using LocalType = MessageValue1<UpdateManager, Render::FrameBuffer*>;
+
+ // Reserve some memory inside the message queue
+ uint32_t* slot = manager.ReserveMessageSlot(sizeof(LocalType));
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new(slot) LocalType(&manager, &UpdateManager::CaptureRenderingResult, &frameBuffer);
+}
+
inline void SetDepthIndicesMessage( UpdateManager& manager, OwnerPointer< NodeDepths >& nodeDepths )
{
using LocalType = MessageValue1<UpdateManager, OwnerPointer<NodeDepths> >;
return Dali::Texture(texturePtr);
}
+uint8_t* FrameBuffer::GetRenderedBuffer()
+{
+ return GetImplementation(*this).GetRenderedBuffer();
+}
+
+void FrameBuffer::CaptureRenderedResult()
+{
+ GetImplementation(*this).CaptureRenderedResult();
+}
+
} //namespace Dali
*/
Texture GetColorTexture();
+ /**
+ * @brief Retrieve rendered buffer.
+ * @return Buffer pointer of captured image.
+ */
+ uint8_t* GetRenderedBuffer();
+
+ /**
+ * @brief Request to capture rendered result
+ * @note This method request to capture once,
+ */
+ void CaptureRenderedResult();
+
public:
/**
* @brief The constructor.