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