summaryrefslogtreecommitdiffstats
path: root/src/core/delegated_frame_node.cpp
diff options
context:
space:
mode:
authorMansoor Chishtie <mchishtie@blackberry.com>2014-02-13 15:59:46 -0600
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-25 09:18:48 +0100
commite7793c99669f635ea4dab6d025a4db7a45bf718e (patch)
tree8e6fb1d4e5f42f89316b8ad6a07df952d8c05655 /src/core/delegated_frame_node.cpp
parentc10ddd8930b06c5872499ca49213af9d9e3eb092 (diff)
Video texture streaming support via external EGLImage textures
Created new StreamVideoNode & StreamVideoMaterial classes for QSG renderer. These classes duplicate the logic of chromium's direct renderer GLRenderer::DrawStreamVideoQuad. Added support for new DrawQuad material in DelegatedFrameNode. Added support for external textures in MailboxTexture. Change-Id: If569b07dfef985f9833de7e64eeb3f952026bca4 Reviewed-by: Arvid Nilsson <anilsson@blackberry.com> Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
Diffstat (limited to 'src/core/delegated_frame_node.cpp')
-rw-r--r--src/core/delegated_frame_node.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/core/delegated_frame_node.cpp b/src/core/delegated_frame_node.cpp
index 195b26add..97a7066bc 100644
--- a/src/core/delegated_frame_node.cpp
+++ b/src/core/delegated_frame_node.cpp
@@ -51,6 +51,7 @@
#include "delegated_frame_node.h"
#include "chromium_gpu_helper.h"
+#include "stream_video_node.h"
#include "type_conversion.h"
#include "yuv_video_node.h"
@@ -60,6 +61,7 @@
#include "cc/quads/draw_quad.h"
#include "cc/quads/render_pass_draw_quad.h"
#include "cc/quads/solid_color_draw_quad.h"
+#include "cc/quads/stream_video_draw_quad.h"
#include "cc/quads/texture_draw_quad.h"
#include "cc/quads/tile_draw_quad.h"
#include "cc/quads/yuv_video_draw_quad.h"
@@ -120,12 +122,14 @@ public:
bool needsToFetch() const { return !m_textureId; }
cc::TransferableResource &resource() { return m_resource; }
void fetchTexture(gpu::gles2::MailboxManager *mailboxManager);
+ void setTarget(GLenum target);
private:
cc::TransferableResource m_resource;
int m_textureId;
QSize m_textureSize;
bool m_hasAlpha;
+ GLenum m_target;
};
static inline QSharedPointer<RenderPassTexture> findRenderPassTexture(const cc::RenderPass::Id &id, const QList<QSharedPointer<RenderPassTexture> > &list)
@@ -258,17 +262,23 @@ MailboxTexture::MailboxTexture(const cc::TransferableResource &resource)
, m_textureId(0)
, m_textureSize(toQt(resource.size))
, m_hasAlpha(false)
+ , m_target(GL_TEXTURE_2D)
{
}
void MailboxTexture::bind()
{
- glBindTexture(GL_TEXTURE_2D, m_textureId);
+ glBindTexture(m_target, m_textureId);
+}
+
+void MailboxTexture::setTarget(GLenum target)
+{
+ m_target = target;
}
void MailboxTexture::fetchTexture(gpu::gles2::MailboxManager *mailboxManager)
{
- gpu::gles2::Texture *tex = ConsumeTexture(mailboxManager, GL_TEXTURE_2D, *reinterpret_cast<const gpu::gles2::MailboxName*>(m_resource.mailbox.name));
+ gpu::gles2::Texture *tex = ConsumeTexture(mailboxManager, m_target, *reinterpret_cast<const gpu::gles2::MailboxName*>(m_resource.mailbox.name));
// The texture might already have been deleted (e.g. when navigating away from a page).
if (tex)
@@ -470,6 +480,18 @@ void DelegatedFrameNode::commit(DelegatedFrameNodeData* data, cc::ReturnedResour
videoNode->setRect(toQt(quad->rect));
currentLayerChain->appendChildNode(videoNode);
break;
+#ifdef GL_OES_EGL_image_external
+ } case cc::DrawQuad::STREAM_VIDEO_CONTENT: {
+ const cc::StreamVideoDrawQuad *squad = cc::StreamVideoDrawQuad::MaterialCast(quad);
+ QSharedPointer<MailboxTexture> &texture = m_data->mailboxTextures[squad->resource_id] = mailboxTextureCandidates.take(squad->resource_id);
+ texture->setTarget(GL_TEXTURE_EXTERNAL_OES); // since this is not default TEXTURE_2D type
+ Q_ASSERT(texture);
+
+ StreamVideoNode *svideoNode = new StreamVideoNode(texture.data());
+ svideoNode->setRect(toQt(squad->rect));
+ currentLayerChain->appendChildNode(svideoNode);
+ break;
+#endif
} default:
qWarning("Unimplemented quad material: %d", quad->material);
}