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_ 82