gl_helper.h revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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 {
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstruct Mailbox;
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace media {
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class VideoFrame;
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SkRegion;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class GLHelperScaling;
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedWebGLId {
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef void (WebKit::WebGraphicsContext3D::*DeleteFunc)(WebGLId);
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedWebGLId(WebKit::WebGraphicsContext3D* context,
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                WebGLId id,
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                DeleteFunc delete_func)
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : context_(context),
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        id_(id),
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        delete_func_(delete_func) {
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  operator WebGLId() const {
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return id_;
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebGLId id() const { return id_; }
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebGLId Detach() {
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    WebGLId id = id_;
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    id_ = 0;
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return id;
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ~ScopedWebGLId() {
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (id_ != 0) {
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      (context_->*delete_func_)(id_);
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebGraphicsContext3D* context_;
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebGLId id_;
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DeleteFunc delete_func_;
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedWebGLId);
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedBuffer : public ScopedWebGLId {
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedBuffer(WebKit::WebGraphicsContext3D* context,
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)               WebGLId id)
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedWebGLId(context,
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      id,
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      &WebKit::WebGraphicsContext3D::deleteBuffer) {}
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedFramebuffer : public ScopedWebGLId {
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedFramebuffer(WebKit::WebGraphicsContext3D* context,
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    WebGLId id)
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedWebGLId(context,
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      id,
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      &WebKit::WebGraphicsContext3D::deleteFramebuffer) {}
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedProgram : public ScopedWebGLId {
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedProgram(WebKit::WebGraphicsContext3D* context,
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                WebGLId id)
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedWebGLId(context,
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      id,
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      &WebKit::WebGraphicsContext3D::deleteProgram) {}
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedShader : public ScopedWebGLId {
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedShader(WebKit::WebGraphicsContext3D* context,
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)               WebGLId id)
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedWebGLId(context,
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      id,
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      &WebKit::WebGraphicsContext3D::deleteShader) {}
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedTexture : public ScopedWebGLId {
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedTexture(WebKit::WebGraphicsContext3D* context,
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                WebGLId id)
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedWebGLId(context,
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      id,
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      &WebKit::WebGraphicsContext3D::deleteTexture) {}
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <WebKit::WGC3Denum target>
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedBinder {
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef void (WebKit::WebGraphicsContext3D::*BindFunc)(WebKit::WGC3Denum,
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                         WebGLId);
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedBinder(WebKit::WebGraphicsContext3D* context,
12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)               WebGLId id,
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)               BindFunc bind_func)
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : context_(context),
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        bind_func_(bind_func) {
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    (context_->*bind_func_)(target, id);
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~ScopedBinder() {
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    (context_->*bind_func_)(target, 0);
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebGraphicsContext3D* context_;
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  BindFunc bind_func_;
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedBinder);
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <WebKit::WGC3Denum target>
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedBufferBinder : ScopedBinder<target> {
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedBufferBinder(WebKit::WebGraphicsContext3D* context,
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                     WebGLId id)
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedBinder<target>(
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          context,
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          id,
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          &WebKit::WebGraphicsContext3D::bindBuffer) {}
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <WebKit::WGC3Denum target>
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedFramebufferBinder : ScopedBinder<target> {
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedFramebufferBinder(WebKit::WebGraphicsContext3D* context,
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                          WebGLId id)
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedBinder<target>(
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          context,
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          id,
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          &WebKit::WebGraphicsContext3D::bindFramebuffer) {}
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <WebKit::WGC3Denum target>
16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedTextureBinder : ScopedBinder<target> {
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedTextureBinder(WebKit::WebGraphicsContext3D* context,
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      WebGLId id)
16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ScopedBinder<target>(
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          context,
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          id,
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          &WebKit::WebGraphicsContext3D::bindTexture) {}
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScopedFlush {
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  explicit ScopedFlush(WebKit::WebGraphicsContext3D* context)
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : context_(context) {
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ~ScopedFlush() {
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    context_->flush();
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebGraphicsContext3D* context_;
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedFlush);
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class ReadbackYUVInterface;
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provides higher level operations on top of the WebKit::WebGraphicsContext3D
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interfaces.
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class CONTENT_EXPORT GLHelper {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  explicit GLHelper(WebKit::WebGraphicsContext3D* context);
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ~GLHelper();
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  enum ScalerQuality {
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Bilinear single pass, fastest possible.
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SCALER_QUALITY_FAST = 1,
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Bilinear upscale + N * 50% bilinear downscales.
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // This is still fast enough for most purposes and
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Image quality is nearly as good as the BEST option.
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SCALER_QUALITY_GOOD = 2,
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Bicubic upscale + N * 50% bicubic downscales.
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Produces very good quality scaled images, but it's
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // 2-8x slower than the "GOOD" quality, so it's not always
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // worth it.
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SCALER_QUALITY_BEST = 3,
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copies the block of pixels specified with |src_subrect| from |src_texture|,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // scales it to |dst_size|, and writes it into |out|.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |src_size| is the size of |src_texture|. The result is of format GL_BGRA
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and is potentially flipped vertically to make it a correct image
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // representation.  |callback| is invoked with the copy result when the copy
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // operation has completed.
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that the src_texture will have the min/mag filter set to GL_LINEAR
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // and wrap_s/t set to CLAMP_TO_EDGE in this call.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CropScaleReadbackAndCleanTexture(
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebKit::WebGLId src_texture,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Size& src_size,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Rect& src_subrect,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Size& dst_size,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned char* out,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Callback<void(bool)>& callback);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Copies the block of pixels specified with |src_subrect| from |src_mailbox|,
2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // scales it to |dst_size|, and writes it into |out|.
2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // |src_size| is the size of |src_mailbox|. The result is of format GL_BGRA
2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // and is potentially flipped vertically to make it a correct image
2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // representation.  |callback| is invoked with the copy result when the copy
2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // operation has completed.
2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Note that the texture bound to src_mailbox will have the min/mag filter set
2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // to GL_LINEAR and wrap_s/t set to CLAMP_TO_EDGE in this call. src_mailbox is
2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // assumed to be GL_TEXTURE_2D.
2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void CropScaleReadbackAndCleanMailbox(
2427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const gpu::Mailbox& src_mailbox,
2437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      uint32 sync_point,
2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const gfx::Size& src_size,
2457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const gfx::Rect& src_subrect,
2467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const gfx::Size& dst_size,
2477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      unsigned char* out,
2487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const base::Callback<void(bool)>& callback);
2497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copies the texture data out of |texture| into |out|.  |size| is the
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // size of the texture.  No post processing is applied to the pixels.  The
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // texture is assumed to have a format of GL_RGBA with a pixel type of
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GL_UNSIGNED_BYTE.  This is a blocking call that calls glReadPixels on this
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // current context.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadbackTextureSync(WebKit::WebGLId texture,
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const gfx::Rect& src_rect,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           unsigned char* out);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a copy of the specified texture. |size| is the size of the texture.
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that the src_texture will have the min/mag filter set to GL_LINEAR
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // and wrap_s/t set to CLAMP_TO_EDGE in this call.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebGLId CopyTexture(WebKit::WebGLId texture,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const gfx::Size& size);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a scaled copy of the specified texture. |src_size| is the size of
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the texture and |dst_size| is the size of the resulting copy.
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that the src_texture will have the min/mag filter set to GL_LINEAR
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // and wrap_s/t set to CLAMP_TO_EDGE in this call.
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebGLId CopyAndScaleTexture(
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      WebKit::WebGLId texture,
27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const gfx::Size& src_size,
27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const gfx::Size& dst_size,
27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      bool vertically_flip_texture,
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ScalerQuality quality);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the shader compiled from the source.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebGLId CompileShaderFromSource(const WebKit::WGC3Dchar* source,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          WebKit::WGC3Denum type);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Copies all pixels from |previous_texture| into |texture| that are
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // inside the region covered by |old_damage| but not part of |new_damage|.
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CopySubBufferDamage(WebKit::WebGLId texture,
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           WebKit::WebGLId previous_texture,
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const SkRegion& new_damage,
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const SkRegion& old_damage);
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Simply creates a texture.
288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebKit::WebGLId CreateTexture();
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Creates a texture and consumes a mailbox into it. Returns 0 on failure.
2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Note the mailbox is assumed to be GL_TEXTURE_2D.
2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  WebKit::WebGLId ConsumeMailboxToTexture(const gpu::Mailbox& mailbox,
2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                          uint32 sync_point);
2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Resizes the texture's size to |size|.
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void ResizeTexture(WebKit::WebGLId texture, const gfx::Size& size);
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Copies the framebuffer data given in |rect| to |texture|.
299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void CopyTextureSubImage(WebKit::WebGLId texture, const gfx::Rect& rect);
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Copies the all framebuffer data to |texture|. |size| specifies the
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // size of the framebuffer.
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void CopyTextureFullImage(WebKit::WebGLId texture, const gfx::Size& size);
304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // A scaler will cache all intermediate textures and programs
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // needed to scale from a specified size to a destination size.
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // If the source or destination sizes changes, you must create
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // a new scaler.
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  class CONTENT_EXPORT ScalerInterface {
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   public:
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ScalerInterface() {}
31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    virtual ~ScalerInterface() {}
31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Note that the src_texture will have the min/mag filter set to GL_LINEAR
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // and wrap_s/t set to CLAMP_TO_EDGE in this call.
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    virtual void Scale(WebKit::WebGLId source_texture,
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       WebKit::WebGLId dest_texture) = 0;
31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    virtual const gfx::Size& SrcSize() = 0;
31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    virtual const gfx::Rect& SrcSubrect() = 0;
32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    virtual const gfx::Size& DstSize() = 0;
32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that the quality may be adjusted down if texture
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // allocations fail or hardware doesn't support the requtested
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // quality. Note that ScalerQuality enum is arranged in
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // numerical order for simplicity.
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScalerInterface* CreateScaler(ScalerQuality quality,
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                const gfx::Size& src_size,
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                const gfx::Rect& src_subrect,
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                const gfx::Size& dst_size,
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                bool vertically_flip_texture,
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                bool swizzle);
33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Create a readback pipeline that will scale a subsection of the source
335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // texture, then convert it to YUV422 planar form and then read back that.
336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // This reduces the amount of memory read from GPU to CPU memory by a factor
337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // 2.6, which can be quite handy since readbacks have very limited speed
338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // on some platforms. All values in |dst_size| and |dst_subrect| must be
339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // a multiple of two. If |use_mrt| is true, the pipeline will try to optimize
340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // the YUV conversion using the multi-render-target extension. |use_mrt|
341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // should only be set to false for testing.
342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ReadbackYUVInterface* CreateReadbackPipelineYUV(
343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ScalerQuality quality,
344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const gfx::Size& src_size,
345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const gfx::Rect& src_subrect,
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const gfx::Size& dst_size,
347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const gfx::Rect& dst_subrect,
348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      bool flip_vertically,
349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      bool use_mrt);
350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Returns the maximum number of draw buffers available,
352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // 0 if GL_EXT_draw_buffers is not available.
353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebKit::WGC3Dint MaxDrawBuffers();
354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected:
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class CopyTextureToImpl;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates |copy_texture_to_impl_| if NULL.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitCopyTextToImpl();
36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Creates |scaler_impl_| if NULL.
36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void InitScalerImpl();
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebGraphicsContext3D* context_;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CopyTextureToImpl> copy_texture_to_impl_;
36590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<GLHelperScaling> scaler_impl_;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GLHelper);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
370868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Similar to a ScalerInterface, a yuv readback pipeline will
371868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// cache a scaler and all intermediate textures and frame buffers
372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// needed to scale, crop, letterbox and read back a texture from
373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// the GPU into CPU-accessible RAM. A single readback pipeline
374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// can handle multiple outstanding readbacks at the same time, but
375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// if the source or destination sizes change, you'll need to create
376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// a new readback pipeline.
377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class CONTENT_EXPORT ReadbackYUVInterface {
378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)public:
379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ReadbackYUVInterface() {}
380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~ReadbackYUVInterface() {}
381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Note that |target| must use YV12 format.
383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void ReadbackYUV(
3847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const gpu::Mailbox& mailbox,
3857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      uint32 sync_point,
386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      media::VideoFrame* target,
387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const base::Callback<void(bool)>& callback) = 0;
388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual GLHelper::ScalerInterface* scaler() = 0;
389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_CLIENT_GL_HELPER_H_
394