gl_helper.h revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_COMMON_GPU_CLIENT_GL_HELPER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_COMMON_GPU_CLIENT_GL_HELPER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/atomicops.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/common/content_export.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Size; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace gpu { 218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class ContextSupport; 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstruct Mailbox; 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace media { 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class VideoFrame; 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SkRegion; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class GLHelperScaling; 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedWebGLId { 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) typedef void (WebKit::WebGraphicsContext3D::*DeleteFunc)(WebGLId); 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScopedWebGLId(WebKit::WebGraphicsContext3D* context, 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebGLId id, 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DeleteFunc delete_func) 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : context_(context), 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) id_(id), 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delete_func_(delete_func) { 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) operator WebGLId() const { 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return id_; 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebGLId id() const { return id_; } 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebGLId Detach() { 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebGLId id = id_; 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) id_ = 0; 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return id; 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ~ScopedWebGLId() { 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (id_ != 0) { 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (context_->*delete_func_)(id_); 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebKit::WebGraphicsContext3D* context_; 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebGLId id_; 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DeleteFunc delete_func_; 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedWebGLId); 7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedBuffer : public ScopedWebGLId { 7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScopedBuffer(WebKit::WebGraphicsContext3D* context, 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebGLId id) 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : ScopedWebGLId(context, 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) id, 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &WebKit::WebGraphicsContext3D::deleteBuffer) {} 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedFramebuffer : public ScopedWebGLId { 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScopedFramebuffer(WebKit::WebGraphicsContext3D* context, 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebGLId id) 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : ScopedWebGLId(context, 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) id, 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &WebKit::WebGraphicsContext3D::deleteFramebuffer) {} 8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedProgram : public ScopedWebGLId { 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScopedProgram(WebKit::WebGraphicsContext3D* context, 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebGLId id) 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : ScopedWebGLId(context, 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) id, 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &WebKit::WebGraphicsContext3D::deleteProgram) {} 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedShader : public ScopedWebGLId { 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScopedShader(WebKit::WebGraphicsContext3D* context, 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebGLId id) 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : ScopedWebGLId(context, 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) id, 10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &WebKit::WebGraphicsContext3D::deleteShader) {} 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedTexture : public ScopedWebGLId { 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScopedTexture(WebKit::WebGraphicsContext3D* context, 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebGLId id) 11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : ScopedWebGLId(context, 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) id, 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &WebKit::WebGraphicsContext3D::deleteTexture) {} 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <WebKit::WGC3Denum target> 11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedBinder { 11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) typedef void (WebKit::WebGraphicsContext3D::*BindFunc)(WebKit::WGC3Denum, 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebGLId); 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScopedBinder(WebKit::WebGraphicsContext3D* context, 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebGLId id, 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BindFunc bind_func) 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : context_(context), 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bind_func_(bind_func) { 12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (context_->*bind_func_)(target, id); 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~ScopedBinder() { 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (context_->*bind_func_)(target, 0); 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebKit::WebGraphicsContext3D* context_; 13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BindFunc bind_func_; 13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedBinder); 13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <WebKit::WGC3Denum target> 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedBufferBinder : ScopedBinder<target> { 14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScopedBufferBinder(WebKit::WebGraphicsContext3D* context, 14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebGLId id) 14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : ScopedBinder<target>( 14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) context, 14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) id, 14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &WebKit::WebGraphicsContext3D::bindBuffer) {} 15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <WebKit::WGC3Denum target> 15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedFramebufferBinder : ScopedBinder<target> { 15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScopedFramebufferBinder(WebKit::WebGraphicsContext3D* context, 15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebGLId id) 15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : ScopedBinder<target>( 15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) context, 15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) id, 16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &WebKit::WebGraphicsContext3D::bindFramebuffer) {} 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <WebKit::WGC3Denum target> 16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedTextureBinder : ScopedBinder<target> { 16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScopedTextureBinder(WebKit::WebGraphicsContext3D* context, 16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebGLId id) 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : ScopedBinder<target>( 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) context, 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) id, 17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &WebKit::WebGraphicsContext3D::bindTexture) {} 17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedFlush { 17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) explicit ScopedFlush(WebKit::WebGraphicsContext3D* context) 17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : context_(context) { 17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ~ScopedFlush() { 18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) context_->flush(); 18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebKit::WebGraphicsContext3D* context_; 18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedFlush); 18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class ReadbackYUVInterface; 192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provides higher level operations on top of the WebKit::WebGraphicsContext3D 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interfaces. 19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class CONTENT_EXPORT GLHelper { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GLHelper(WebKit::WebGraphicsContext3D* context, 1988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gpu::ContextSupport* context_support); 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ~GLHelper(); 20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) enum ScalerQuality { 20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Bilinear single pass, fastest possible. 20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SCALER_QUALITY_FAST = 1, 20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Bilinear upscale + N * 50% bilinear downscales. 20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This is still fast enough for most purposes and 20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Image quality is nearly as good as the BEST option. 20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SCALER_QUALITY_GOOD = 2, 20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Bicubic upscale + N * 50% bicubic downscales. 21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Produces very good quality scaled images, but it's 21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // 2-8x slower than the "GOOD" quality, so it's not always 21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // worth it. 21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SCALER_QUALITY_BEST = 3, 21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copies the block of pixels specified with |src_subrect| from |src_texture|, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // scales it to |dst_size|, and writes it into |out|. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |src_size| is the size of |src_texture|. The result is of format GL_BGRA 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and is potentially flipped vertically to make it a correct image 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // representation. |callback| is invoked with the copy result when the copy 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // operation has completed. 22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Note that the src_texture will have the min/mag filter set to GL_LINEAR 22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // and wrap_s/t set to CLAMP_TO_EDGE in this call. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CropScaleReadbackAndCleanTexture( 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebGLId src_texture, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& src_size, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& src_subrect, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& dst_size, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char* out, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Callback<void(bool)>& callback); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Copies the block of pixels specified with |src_subrect| from |src_mailbox|, 2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // scales it to |dst_size|, and writes it into |out|. 2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // |src_size| is the size of |src_mailbox|. The result is of format GL_BGRA 2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // and is potentially flipped vertically to make it a correct image 2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // representation. |callback| is invoked with the copy result when the copy 2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // operation has completed. 2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Note that the texture bound to src_mailbox will have the min/mag filter set 2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // to GL_LINEAR and wrap_s/t set to CLAMP_TO_EDGE in this call. src_mailbox is 2427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // assumed to be GL_TEXTURE_2D. 2437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void CropScaleReadbackAndCleanMailbox( 2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const gpu::Mailbox& src_mailbox, 2457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uint32 sync_point, 2467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const gfx::Size& src_size, 2477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const gfx::Rect& src_subrect, 2487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const gfx::Size& dst_size, 2497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch unsigned char* out, 2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Callback<void(bool)>& callback); 2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copies the texture data out of |texture| into |out|. |size| is the 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size of the texture. No post processing is applied to the pixels. The 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // texture is assumed to have a format of GL_RGBA with a pixel type of 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GL_UNSIGNED_BYTE. This is a blocking call that calls glReadPixels on this 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current context. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReadbackTextureSync(WebKit::WebGLId texture, 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& src_rect, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char* out); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a copy of the specified texture. |size| is the size of the texture. 26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Note that the src_texture will have the min/mag filter set to GL_LINEAR 26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // and wrap_s/t set to CLAMP_TO_EDGE in this call. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebGLId CopyTexture(WebKit::WebGLId texture, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a scaled copy of the specified texture. |src_size| is the size of 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the texture and |dst_size| is the size of the resulting copy. 26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Note that the src_texture will have the min/mag filter set to GL_LINEAR 27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // and wrap_s/t set to CLAMP_TO_EDGE in this call. 27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebKit::WebGLId CopyAndScaleTexture( 27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebKit::WebGLId texture, 27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const gfx::Size& src_size, 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const gfx::Size& dst_size, 27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool vertically_flip_texture, 27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScalerQuality quality); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the shader compiled from the source. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebGLId CompileShaderFromSource(const WebKit::WGC3Dchar* source, 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WGC3Denum type); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Copies all pixels from |previous_texture| into |texture| that are 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // inside the region covered by |old_damage| but not part of |new_damage|. 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CopySubBufferDamage(WebKit::WebGLId texture, 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebGLId previous_texture, 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SkRegion& new_damage, 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SkRegion& old_damage); 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Simply creates a texture. 290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebKit::WebGLId CreateTexture(); 291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Creates a texture and consumes a mailbox into it. Returns 0 on failure. 2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Note the mailbox is assumed to be GL_TEXTURE_2D. 2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WebKit::WebGLId ConsumeMailboxToTexture(const gpu::Mailbox& mailbox, 2957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uint32 sync_point); 2967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Resizes the texture's size to |size|. 298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void ResizeTexture(WebKit::WebGLId texture, const gfx::Size& size); 299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Copies the framebuffer data given in |rect| to |texture|. 301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void CopyTextureSubImage(WebKit::WebGLId texture, const gfx::Rect& rect); 302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Copies the all framebuffer data to |texture|. |size| specifies the 304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // size of the framebuffer. 305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void CopyTextureFullImage(WebKit::WebGLId texture, const gfx::Size& size); 306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // A scaler will cache all intermediate textures and programs 30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // needed to scale from a specified size to a destination size. 30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // If the source or destination sizes changes, you must create 31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // a new scaler. 31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) class CONTENT_EXPORT ScalerInterface { 31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScalerInterface() {} 31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~ScalerInterface() {} 31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Note that the src_texture will have the min/mag filter set to GL_LINEAR 31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // and wrap_s/t set to CLAMP_TO_EDGE in this call. 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void Scale(WebKit::WebGLId source_texture, 31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebKit::WebGLId dest_texture) = 0; 32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual const gfx::Size& SrcSize() = 0; 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual const gfx::Rect& SrcSubrect() = 0; 32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual const gfx::Size& DstSize() = 0; 32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }; 32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Note that the quality may be adjusted down if texture 32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // allocations fail or hardware doesn't support the requtested 32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // quality. Note that ScalerQuality enum is arranged in 32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // numerical order for simplicity. 32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScalerInterface* CreateScaler(ScalerQuality quality, 33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const gfx::Size& src_size, 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const gfx::Rect& src_subrect, 33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const gfx::Size& dst_size, 33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool vertically_flip_texture, 33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool swizzle); 33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Create a readback pipeline that will scale a subsection of the source 337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // texture, then convert it to YUV422 planar form and then read back that. 338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This reduces the amount of memory read from GPU to CPU memory by a factor 339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 2.6, which can be quite handy since readbacks have very limited speed 340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // on some platforms. All values in |dst_size| and |dst_subrect| must be 341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // a multiple of two. If |use_mrt| is true, the pipeline will try to optimize 342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // the YUV conversion using the multi-render-target extension. |use_mrt| 343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // should only be set to false for testing. 344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ReadbackYUVInterface* CreateReadbackPipelineYUV( 345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ScalerQuality quality, 346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const gfx::Size& src_size, 347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const gfx::Rect& src_subrect, 348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const gfx::Size& dst_size, 349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const gfx::Rect& dst_subrect, 350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool flip_vertically, 351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool use_mrt); 352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Returns the maximum number of draw buffers available, 354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 0 if GL_EXT_draw_buffers is not available. 355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebKit::WGC3Dint MaxDrawBuffers(); 356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected: 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class CopyTextureToImpl; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates |copy_texture_to_impl_| if NULL. 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitCopyTextToImpl(); 36290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Creates |scaler_impl_| if NULL. 36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void InitScalerImpl(); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebKit::WebGraphicsContext3D* context_; 3668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gpu::ContextSupport* context_support_; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<CopyTextureToImpl> copy_texture_to_impl_; 36890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<GLHelperScaling> scaler_impl_; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GLHelper); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Similar to a ScalerInterface, a yuv readback pipeline will 374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// cache a scaler and all intermediate textures and frame buffers 375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// needed to scale, crop, letterbox and read back a texture from 376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// the GPU into CPU-accessible RAM. A single readback pipeline 377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// can handle multiple outstanding readbacks at the same time, but 378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// if the source or destination sizes change, you'll need to create 379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// a new readback pipeline. 380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class CONTENT_EXPORT ReadbackYUVInterface { 381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)public: 382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ReadbackYUVInterface() {} 383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual ~ReadbackYUVInterface() {} 384868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Note that |target| must use YV12 format. 386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void ReadbackYUV( 3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const gpu::Mailbox& mailbox, 3887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uint32 sync_point, 389c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch const scoped_refptr<media::VideoFrame>& target, 390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::Callback<void(bool)>& callback) = 0; 391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual GLHelper::ScalerInterface* scaler() = 0; 392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_COMMON_GPU_CLIENT_GL_HELPER_H_ 397