- add sources.
[platform/framework/web/crosswalk.git] / src / content / browser / renderer_host / compositing_iosurface_shader_programs_mac.h
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CONTENT_BROWSER_RENDERER_HOST_COMPOSITING_IOSURFACE_SHADER_PROGRAMS_MAC_H_
6 #define CONTENT_BROWSER_RENDERER_HOST_COMPOSITING_IOSURFACE_SHADER_PROGRAMS_MAC_H_
7
8 #include <OpenGL/gl.h>
9
10 #include "base/basictypes.h"
11 #include "base/gtest_prod_util.h"
12
13 namespace content {
14
15 // Provides caching of the compile-and-link step for shader programs at runtime
16 // since, once compiled and linked, the programs can be shared.  Callers invoke
17 // one of the UseXXX() methods to glUseProgram() the program and have its
18 // uniform variables bound with the given parameters.
19 //
20 // Note: All public methods must be invoked within the the same GL context!
21 class CompositingIOSurfaceShaderPrograms {
22  public:
23   CompositingIOSurfaceShaderPrograms();
24   ~CompositingIOSurfaceShaderPrograms();
25
26   // Reset the cache, deleting any references to currently-cached shader
27   // programs.  This must be called within an active OpenGL context just before
28   // destruction.
29   void Reset();
30
31   // Begin using the "blit" program, which is set up to sample the texture at
32   // GL_TEXTURE_0.  Returns false on error.
33   bool UseBlitProgram();
34
35   // Begin using the program that just draws solid white very efficiently.
36   // Returns false on error.
37   bool UseSolidWhiteProgram();
38
39   // Begin using one of the two RGB-to-YV12 color conversion programs, as
40   // specified by |pass_number| 1 or 2.  The programs will sample the texture at
41   // GL_TEXTURE0, and account for scaling in the X direction by |texel_scale_x|.
42   // Returns false on error.
43   bool UseRGBToYV12Program(int pass_number, float texel_scale_x);
44
45   // |format| argument to use for glReadPixels() when reading back textures
46   // generated by the RGBToYV12 program.
47   GLenum rgb_to_yv12_output_format() const {
48     return rgb_to_yv12_output_format_;
49   }
50
51  protected:
52   FRIEND_TEST_ALL_PREFIXES(CompositingIOSurfaceTransformerTest,
53                            TransformsRGBToYV12);
54
55   // Side effect: Calls Reset(), deleting any cached programs.
56   void SetOutputFormatForTesting(GLenum format);
57
58  private:
59   enum { kNumShaderPrograms = 4 };
60
61   // Helper methods to cache uniform variable locations.
62   GLuint GetShaderProgram(int which);
63   void BindUniformTextureVariable(int which, int texture_unit_offset);
64   void BindUniformTexelScaleXVariable(int which, float texel_scale_x);
65
66   // Cached values for previously-compiled/linked shader programs, and the
67   // locations of their uniform variables.
68   GLuint shader_programs_[kNumShaderPrograms];
69   GLint texture_var_locations_[kNumShaderPrograms];
70   GLint texel_scale_x_var_locations_[kNumShaderPrograms];
71
72   // Byte order of the quads generated by the RGBToYV12 shader program.  Must
73   // always be GL_BGRA (default) or GL_RGBA (workaround case).
74   GLenum rgb_to_yv12_output_format_;
75
76   DISALLOW_COPY_AND_ASSIGN(CompositingIOSurfaceShaderPrograms);
77 };
78
79 }  // namespace content
80
81 #endif  // CONTENT_BROWSER_RENDERER_HOST_COMPOSITING_IOSURFACE_SHADER_PROGRAMS_MAC_H_