}
}
+const std::string& Compositor::GetName() const
+{
+ return mSocketName;
+}
+
void* Compositor::GetCompositorHandle()
{
return static_cast< void* >( mCompositor );
mOutput.ObjectViewDeletedSignal().Connect( this, &Compositor::OnObjectViewDeleted );
DALI_LOG_INFO( gPepperCompositorLogging, Debug::Verbose, "Compositor::Initialize: success. socket name = %s\n", mSocketName.c_str() );
-
- // TODO: temp
- setenv("WAYLAND_DISPLAY", mSocketName.c_str(), 1);
}
int Compositor::GetSocketFdFromServer()
*/
static CompositorPtr New( Application application, const std::string& name );
+ /**
+ * @copydoc Dali::Pepper::Compositor::GetName()
+ */
+ const std::string& GetName() const;
+
void* GetCompositorHandle();
public: //Signals
mBuffer = buffer;
mBufferDestroyListener = pepper_object_add_event_listener( (pepper_object_t*)buffer, PEPPER_EVENT_OBJECT_DESTROY, 0, Object::OnDestroyBuffer, this );
- bufferResource = pepper_buffer_get_resource( buffer );
-
if( !mObjectView )
{
mObjectView = Pepper::ObjectView::New();
Pepper::GetImplementation( mObjectView ).SetSurface( mSurface );
Pepper::GetImplementation( mObjectView ).SetInput( mPointer, mKeyboard, mTouch );
- // TODO: support multi touch, focus in/out, mouse in/out
-
- // TODO: resize callback
-
Pepper::Object handle( this );
mObjectViewAddedSignal.Emit( handle, mObjectView );
}
+ bufferResource = pepper_buffer_get_resource( buffer );
+
shmBuffer = wl_shm_buffer_get( bufferResource );
if( shmBuffer )
{
mTouch = touch;
}
+void ObjectView::OnInitialize()
+{
+ mImageView = Toolkit::ImageView::New();
+ mImageView.SetParentOrigin( ParentOrigin::CENTER );
+ mImageView.SetAnchorPoint( AnchorPoint::CENTER );
+
+ Self().Add( mImageView );
+ Self().SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
+
+ // TODO: support multi touch, focus in/out, mouse in/out
+}
+
bool ObjectView::OnTouchEvent( const TouchEvent& touchEvent )
{
if( 1 == touchEvent.GetPointCount() )
return false;
}
-void ObjectView::OnInitialize()
+void ObjectView::OnSizeSet( const Vector3& targetSize )
{
- mImageView = Toolkit::ImageView::New();
- mImageView.SetParentOrigin( ParentOrigin::CENTER );
- mImageView.SetAnchorPoint( AnchorPoint::CENTER );
+ if( mSurface )
+ {
+ Pepper::Internal::ShellClientPtr shellClient = reinterpret_cast< Pepper::Internal::ShellClient* >( pepper_object_get_user_data( reinterpret_cast< pepper_object_t* >( mSurface ), pepper_surface_get_role( mSurface ) ) );
+ if( shellClient )
+ {
+ shellClient->Configure( static_cast< int >( targetSize.width ), static_cast< int >( targetSize.height ), ObjectView::OnConfigureCallback, this );
+ }
+ }
- Self().Add( mImageView );
- Self().SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
+ DALI_LOG_INFO( gPepperObjectViewLogging, Debug::Verbose, "ObjectView::OnSizeSet:width = %.2f height = %.2f\n", targetSize.width, targetSize.height );
+}
+
+void ObjectView::OnConfigureCallback( void* data, int width, int height )
+{
+ ObjectView* objectView = static_cast< ObjectView* >( data );
+
+ objectView->mImageView.SetSize( static_cast< float >( width ), static_cast< float >( height ) );
+
+ DALI_LOG_INFO( gPepperObjectViewLogging, Debug::Verbose, "ObjectView::OnConfigureCallback:width = %d height = %d\n", width, height );
}
} // namespace Internal
*/
virtual ~ObjectView();
-protected: // From CustomActorImpl
+private: // From Control
+
+ /**
+ * @copydoc Dali::Toolkit::Control::OnInitialize()
+ */
+ virtual void OnInitialize();
+
+private: // From CustomActorImpl
/**
* @copydoc Dali::CustomActorImpl::OnTouchEvent( const TouchEvent& event )
*/
virtual bool OnTouchEvent( const TouchEvent& event );
-private: // From Control
-
/**
- * @copydoc Dali::Toolkit::Control::OnInitialize()
+ * @copydoc CustomActorImpl::OnSizeSet( const Vector3& targetSize )
*/
- virtual void OnInitialize();
+ virtual void OnSizeSet( const Vector3& targetSize );
private:
// Undefined
ObjectView& operator= ( const ObjectView& );
+ static void OnConfigureCallback( void* data, int width, int height );
+
private:
Toolkit::ImageView mImageView;
#include <pepper-dali/internal/compositor-impl.h>
// EXTERNAL INCLUDES
+#include <dali/integration-api/adaptors/adaptor.h>
+#include <dali/devel-api/adaptor-framework/render-surface.h>
#include <dali/integration-api/debug.h>
namespace Dali
Output::Output()
: mSize(),
mOutput( NULL ),
- mPrimaryPlane( NULL )
+ mPrimaryPlane( NULL ),
+ mRepaintRequest( false )
{
}
mCompositor = compositor;
mInput = input;
- // TODO: use application info
- mSize.width = 720.0f;
- mSize.height = 1280.0f;
+ RenderSurface& surface = Adaptor::Get().GetSurface();
+ PositionSize positionSize = surface.GetPositionSize();
+
+ mSize.width = positionSize.width;
+ mSize.height = positionSize.height;
mOutput = pepper_compositor_add_output( static_cast< pepper_compositor_t* >( Pepper::GetImplementation( compositor ).GetCompositorHandle() ), &outputInterface, "dali", this, WL_OUTPUT_TRANSFORM_NORMAL, 1 );
if( !mOutput )
application.ResizeSignal().Connect( this, &Output::OnResize );
- // TODO: render post?
+ // Set the thread-synchronization interface on the render-surface
+ surface.SetThreadSynchronization( *this );
- DALI_LOG_INFO( gPepperOutputLogging, Debug::Verbose, "Output::Initialize: success\n" );
+ DALI_LOG_INFO( gPepperOutputLogging, Debug::Verbose, "Output::Initialize: success [width = %.2f height = %.2f]\n", mSize.width, mSize.height );
}
void Output::OnDestroy( void* data )
DALI_LOG_INFO( gPepperOutputLogging, Debug::Verbose, "Output::OnRepaint\n" );
- // TODO: repaint
+ output->mRepaintRequest = true;
+
+ // TODO: temp
if( !output->mRenderFinishTimer )
{
- output->mRenderFinishTimer= Timer::New(10);
+ output->mRenderFinishTimer= Timer::New(1);
output->mRenderFinishTimer.TickSignal().Connect( output, &Output::OnRenderFinishTimerTick );
}
void Output::OnResize( Application& application )
{
- // TODO
- // Can't get a new size! Use a new size later
- mSize.width = 720.0f;
- mSize.height = 1280.0f;
+ RenderSurface& surface = Adaptor::Get().GetSurface();
+ PositionSize positionSize = surface.GetPositionSize();
+
+ mSize.width = positionSize.width;
+ mSize.height = positionSize.height;
pepper_output_update_mode( mOutput );
}
}
}
+void Output::PostRenderComplete()
+{
+ if( mRepaintRequest )
+ {
+ struct timespec ts;
+
+ DALI_LOG_INFO( gPepperOutputLogging, Debug::Verbose, "Output::PostRenderComplete" );
+
+ pepper_compositor_get_time( static_cast< pepper_compositor_t* >( Pepper::GetImplementation( mCompositor ).GetCompositorHandle() ), &ts );
+ pepper_output_finish_frame( mOutput, &ts );
+
+ mRepaintRequest = false;
+ }
+}
+
+void Output::PostRenderStarted()
+{
+ // Do nothing
+}
+
+void Output::PostRenderWaitForCompletion()
+{
+ // Do nothing
+}
+
// TODO: temp
bool Output::OnRenderFinishTimerTick()
{
#include <dali/public-api/common/vector-wrapper.h>
#include <dali/public-api/object/base-object.h>
#include <dali/public-api/signals/connection-tracker.h>
+#include <dali/integration-api/adaptors/thread-synchronization-interface.h>
#include <pepper-output-backend.h>
// TODO: temp
class Output;
typedef IntrusivePtr<Output> OutputPtr;
-class Output : public BaseObject, public ConnectionTracker
+class Output : public BaseObject, public ConnectionTracker, public ThreadSynchronizationInterface
{
public:
void OnObjectViewAdded( Pepper::Object object, Pepper::ObjectView objectView );
void OnObjectViewDeleted( Pepper::Object object, Pepper::ObjectView objectView );
+private: // From ThreadSynchronizationInterface
+
+ /////////////////////////////////////////////////////////////////////////////////////////////////
+ // Called by the Event Thread if post-rendering is required
+ /////////////////////////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * @copydoc ThreadSynchronizationInterface::PostRenderComplete()
+ */
+ virtual void PostRenderComplete();
+
+ /////////////////////////////////////////////////////////////////////////////////////////////////
+ //// Called by the Render Thread if post-rendering is required
+ /////////////////////////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * @copydoc ThreadSynchronizationInterface::PostRenderStarted()
+ */
+ virtual void PostRenderStarted();
+
+ /**
+ * @copydoc ThreadSynchronizationInterface::PostRenderStarted()
+ */
+ virtual void PostRenderWaitForCompletion();
+
// TODO: temp
bool OnRenderFinishTimerTick();
Pepper::Output::OutputSignalType mObjectViewAddedSignal;
Pepper::Output::OutputSignalType mObjectViewDeletedSignal;
+ bool mRepaintRequest;
+
// TODO: temp
Timer mRenderFinishTimer;
};
return Compositor( internal.Get() );
}
+const std::string& Compositor::GetName() const
+{
+ return GetImplementation( *this ).GetName();
+}
+
Compositor Compositor::DownCast( BaseHandle handle )
{
return Compositor( dynamic_cast< Internal::Compositor* >( handle.GetObjectPtr() ) );
static Compositor New( Application application, const std::string& name );
/**
+ * @brief Gets the name of the compositor.
+ *
+ * @since_tizen 3.0
+ * @return compositor name.
+ */
+ const std::string& GetName() const;
+
+ /**
* @brief Downcast a handle to Compositor handle.
*
* If the BaseHandle points is a Compositor the downcast returns a valid handle.