gl_helper.h revision 868fa2fe829687343ffae624259930155e16dbd8
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)
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace media {
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class VideoFrame;
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SkRegion;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class GLHelperScaling;
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedWebGLId {
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef void (WebKit::WebGraphicsContext3D::*DeleteFunc)(WebGLId);
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedWebGLId(WebKit::WebGraphicsContext3D* context,
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                WebGLId id,
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                DeleteFunc delete_func)
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : context_(context),
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        id_(id),
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        delete_func_(delete_func) {
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operator WebGLId() const {
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return id_;
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebGLId id() const { return id_; }
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebGLId Detach() {
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    WebGLId id = id_;
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    id_ = 0;
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return id;
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ~ScopedWebGLId() {
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (id_ != 0) {
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      (context_->*delete_func_)(id_);
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebGraphicsContext3D* context_;
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebGLId id_;
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DeleteFunc delete_func_;
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedWebGLId);
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedBuffer : public ScopedWebGLId {
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedBuffer(WebKit::WebGraphicsContext3D* context,
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)               WebGLId id)
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedWebGLId(context,
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      id,
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      &WebKit::WebGraphicsContext3D::deleteBuffer) {}
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedFramebuffer : public ScopedWebGLId {
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedFramebuffer(WebKit::WebGraphicsContext3D* context,
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    WebGLId id)
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedWebGLId(context,
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      id,
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      &WebKit::WebGraphicsContext3D::deleteFramebuffer) {}
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedProgram : public ScopedWebGLId {
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedProgram(WebKit::WebGraphicsContext3D* context,
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                WebGLId id)
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedWebGLId(context,
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      id,
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      &WebKit::WebGraphicsContext3D::deleteProgram) {}
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedShader : public ScopedWebGLId {
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedShader(WebKit::WebGraphicsContext3D* context,
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)               WebGLId id)
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedWebGLId(context,
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      id,
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      &WebKit::WebGraphicsContext3D::deleteShader) {}
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedTexture : public ScopedWebGLId {
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedTexture(WebKit::WebGraphicsContext3D* context,
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                WebGLId id)
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedWebGLId(context,
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      id,
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      &WebKit::WebGraphicsContext3D::deleteTexture) {}
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <WebKit::WGC3Denum target>
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedBinder {
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef void (WebKit::WebGraphicsContext3D::*BindFunc)(WebKit::WGC3Denum,
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                         WebGLId);
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedBinder(WebKit::WebGraphicsContext3D* context,
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)               WebGLId id,
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)               BindFunc bind_func)
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : context_(context),
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        bind_func_(bind_func) {
12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    (context_->*bind_func_)(target, id);
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~ScopedBinder() {
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    (context_->*bind_func_)(target, 0);
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebGraphicsContext3D* context_;
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  BindFunc bind_func_;
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedBinder);
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <WebKit::WGC3Denum target>
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedBufferBinder : ScopedBinder<target> {
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedBufferBinder(WebKit::WebGraphicsContext3D* context,
14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                     WebGLId id)
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedBinder<target>(
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          context,
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          id,
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          &WebKit::WebGraphicsContext3D::bindBuffer) {}
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <WebKit::WGC3Denum target>
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedFramebufferBinder : ScopedBinder<target> {
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedFramebufferBinder(WebKit::WebGraphicsContext3D* context,
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                          WebGLId id)
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedBinder<target>(
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          context,
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          id,
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          &WebKit::WebGraphicsContext3D::bindFramebuffer) {}
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <WebKit::WGC3Denum target>
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedTextureBinder : ScopedBinder<target> {
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedTextureBinder(WebKit::WebGraphicsContext3D* context,
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      WebGLId id)
16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedBinder<target>(
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          context,
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          id,
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          &WebKit::WebGraphicsContext3D::bindTexture) {}
16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedFlush {
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  explicit ScopedFlush(WebKit::WebGraphicsContext3D* context)
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : context_(context) {
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ~ScopedFlush() {
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    context_->flush();
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebGraphicsContext3D* context_;
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedFlush);
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class ReadbackYUVInterface;
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provides higher level operations on top of the WebKit::WebGraphicsContext3D
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interfaces.
19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class CONTENT_EXPORT GLHelper {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  explicit GLHelper(WebKit::WebGraphicsContext3D* context);
19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ~GLHelper();
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  enum ScalerQuality {
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Bilinear single pass, fastest possible.
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SCALER_QUALITY_FAST = 1,
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Bilinear upscale + N * 50% bilinear downscales.
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // This is still fast enough for most purposes and
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Image quality is nearly as good as the BEST option.
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SCALER_QUALITY_GOOD = 2,
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Bicubic upscale + N * 50% bicubic downscales.
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Produces very good quality scaled images, but it's
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // 2-8x slower than the "GOOD" quality, so it's not always
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // worth it.
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SCALER_QUALITY_BEST = 3,
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copies the block of pixels specified with |src_subrect| from |src_texture|,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // scales it to |dst_size|, and writes it into |out|.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |src_size| is the size of |src_texture|. The result is of format GL_BGRA
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and is potentially flipped vertically to make it a correct image
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // representation.  |callback| is invoked with the copy result when the copy
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // operation has completed.
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that the src_texture will have the min/mag filter set to GL_LINEAR
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // and wrap_s/t set to CLAMP_TO_EDGE in this call.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CropScaleReadbackAndCleanTexture(
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebKit::WebGLId src_texture,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Size& src_size,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Rect& src_subrect,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Size& dst_size,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned char* out,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Callback<void(bool)>& callback);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copies the texture data out of |texture| into |out|.  |size| is the
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // size of the texture.  No post processing is applied to the pixels.  The
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // texture is assumed to have a format of GL_RGBA with a pixel type of
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GL_UNSIGNED_BYTE.  This is a blocking call that calls glReadPixels on this
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // current context.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadbackTextureSync(WebKit::WebGLId texture,
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const gfx::Rect& src_rect,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           unsigned char* out);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a copy of the specified texture. |size| is the size of the texture.
23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that the src_texture will have the min/mag filter set to GL_LINEAR
23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // and wrap_s/t set to CLAMP_TO_EDGE in this call.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebGLId CopyTexture(WebKit::WebGLId texture,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const gfx::Size& size);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a scaled copy of the specified texture. |src_size| is the size of
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the texture and |dst_size| is the size of the resulting copy.
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that the src_texture will have the min/mag filter set to GL_LINEAR
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // and wrap_s/t set to CLAMP_TO_EDGE in this call.
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebGLId CopyAndScaleTexture(
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      WebKit::WebGLId texture,
24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const gfx::Size& src_size,
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const gfx::Size& dst_size,
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      bool vertically_flip_texture,
25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ScalerQuality quality);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the shader compiled from the source.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebGLId CompileShaderFromSource(const WebKit::WGC3Dchar* source,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          WebKit::WGC3Denum type);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Copies all pixels from |previous_texture| into |texture| that are
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // inside the region covered by |old_damage| but not part of |new_damage|.
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CopySubBufferDamage(WebKit::WebGLId texture,
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           WebKit::WebGLId previous_texture,
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const SkRegion& new_damage,
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const SkRegion& old_damage);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Simply creates a texture.
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebKit::WebGLId CreateTexture();
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Resizes the texture's size to |size|.
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void ResizeTexture(WebKit::WebGLId texture, const gfx::Size& size);
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Copies the framebuffer data given in |rect| to |texture|.
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void CopyTextureSubImage(WebKit::WebGLId texture, const gfx::Rect& rect);
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Copies the all framebuffer data to |texture|. |size| specifies the
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // size of the framebuffer.
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void CopyTextureFullImage(WebKit::WebGLId texture, const gfx::Size& size);
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // A scaler will cache all intermediate textures and programs
27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // needed to scale from a specified size to a destination size.
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // If the source or destination sizes changes, you must create
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // a new scaler.
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  class CONTENT_EXPORT ScalerInterface {
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   public:
28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ScalerInterface() {}
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    virtual ~ScalerInterface() {}
28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Note that the src_texture will have the min/mag filter set to GL_LINEAR
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // and wrap_s/t set to CLAMP_TO_EDGE in this call.
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    virtual void Scale(WebKit::WebGLId source_texture,
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       WebKit::WebGLId dest_texture) = 0;
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    virtual const gfx::Size& SrcSize() = 0;
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    virtual const gfx::Rect& SrcSubrect() = 0;
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    virtual const gfx::Size& DstSize() = 0;
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that the quality may be adjusted down if texture
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // allocations fail or hardware doesn't support the requtested
29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // quality. Note that ScalerQuality enum is arranged in
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // numerical order for simplicity.
30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScalerInterface* CreateScaler(ScalerQuality quality,
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                const gfx::Size& src_size,
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                const gfx::Rect& src_subrect,
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                const gfx::Size& dst_size,
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                bool vertically_flip_texture,
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                bool swizzle);
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Create a readback pipeline that will scale a subsection of the source
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // texture, then convert it to YUV422 planar form and then read back that.
309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // This reduces the amount of memory read from GPU to CPU memory by a factor
310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // 2.6, which can be quite handy since readbacks have very limited speed
311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // on some platforms. All values in |dst_size| and |dst_subrect| must be
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // a multiple of two. If |use_mrt| is true, the pipeline will try to optimize
313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // the YUV conversion using the multi-render-target extension. |use_mrt|
314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // should only be set to false for testing.
315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ReadbackYUVInterface* CreateReadbackPipelineYUV(
316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ScalerQuality quality,
317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const gfx::Size& src_size,
318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const gfx::Rect& src_subrect,
319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const gfx::Size& dst_size,
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const gfx::Rect& dst_subrect,
321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      bool flip_vertically,
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      bool use_mrt);
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Returns the maximum number of draw buffers available,
325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // 0 if GL_EXT_draw_buffers is not available.
326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebKit::WGC3Dint MaxDrawBuffers();
327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected:
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class CopyTextureToImpl;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates |copy_texture_to_impl_| if NULL.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitCopyTextToImpl();
33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Creates |scaler_impl_| if NULL.
33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void InitScalerImpl();
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebGraphicsContext3D* context_;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CopyTextureToImpl> copy_texture_to_impl_;
33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<GLHelperScaling> scaler_impl_;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GLHelper);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Similar to a ScalerInterface, a yuv readback pipeline will
344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// cache a scaler and all intermediate textures and frame buffers
345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// needed to scale, crop, letterbox and read back a texture from
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// the GPU into CPU-accessible RAM. A single readback pipeline
347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// can handle multiple outstanding readbacks at the same time, but
348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// if the source or destination sizes change, you'll need to create
349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// a new readback pipeline.
350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class CONTENT_EXPORT ReadbackYUVInterface {
351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)public:
352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ReadbackYUVInterface() {}
353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~ReadbackYUVInterface() {}
354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Note that |target| must use YV12 format.
356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void ReadbackYUV(
357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebKit::WebGLId texture,
358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      media::VideoFrame* target,
359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const base::Callback<void(bool)>& callback) = 0;
360868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual GLHelper::ScalerInterface* scaler() = 0;
361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_CLIENT_GL_HELPER_H_
366