Index: gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc |
index af564389ea5c63d1579e2c685b7f14926dd8d498..87c78038f3cb9bedc646c68568c96ddb78ef38d1 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc |
@@ -21,12 +21,15 @@ |
#define SHADER_2D(src) \ |
"#define SamplerType sampler2D\n" \ |
"#define TextureLookup texture2D\n" SHADER(src) |
+#define SHADER_RECTANGLE_ARB(src) \ |
+ "#define SamplerType samplerRect\n" \ |
+ "#define TextureLookup textureRect\n" SHADER(src) |
#define SHADER_EXTERNAL_OES(src) \ |
"#extension GL_OES_EGL_image_external : require\n" \ |
"#define SamplerType samplerExternalOES\n" \ |
"#define TextureLookup texture2D\n" SHADER(src) |
#define FRAGMENT_SHADERS(src) \ |
- SHADER_2D(src), SHADER_EXTERNAL_OES(src) |
+ SHADER_2D(src), SHADER_RECTANGLE_ARB(src), SHADER_EXTERNAL_OES(src) |
namespace { |
@@ -38,10 +41,13 @@ enum VertexShaderId { |
enum FragmentShaderId { |
FRAGMENT_SHADER_COPY_TEXTURE_2D, |
+ FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB, |
FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, |
FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D, |
+ FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_RECTANGLE_ARB, |
FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES, |
FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D, |
+ FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_RECTANGLE_ARB, |
FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES, |
NUM_FRAGMENT_SHADERS, |
}; |
@@ -50,20 +56,24 @@ const char* vertex_shader_source[NUM_VERTEX_SHADERS] = { |
// VERTEX_SHADER_COPY_TEXTURE |
SHADER( |
uniform mat4 u_matrix; |
+ uniform vec2 u_half_size; |
attribute vec4 a_position; |
varying TexCoordPrecision vec2 v_uv; |
void main(void) { |
gl_Position = u_matrix * a_position; |
- v_uv = a_position.xy * vec2(0.5, 0.5) + vec2(0.5, 0.5); |
+ v_uv = a_position.xy * vec2(u_half_size.s, u_half_size.t) + |
+ vec2(u_half_size.s, u_half_size.t); |
}), |
// VERTEX_SHADER_COPY_TEXTURE_FLIP_Y |
SHADER( |
uniform mat4 u_matrix; |
+ uniform vec2 u_half_size; |
attribute vec4 a_position; |
varying TexCoordPrecision vec2 v_uv; |
void main(void) { |
gl_Position = u_matrix * a_position; |
- v_uv = a_position.xy * vec2(0.5, -0.5) + vec2(0.5, 0.5); |
+ v_uv = a_position.xy * vec2(u_half_size.s, -u_half_size.t) + |
+ vec2(u_half_size.s, u_half_size.t); |
}), |
}; |
@@ -114,6 +124,7 @@ FragmentShaderId GetFragmentShaderId(bool premultiply_alpha, |
GLenum target) { |
enum { |
SAMPLER_2D, |
+ SAMPLER_RECTANGLE_ARB, |
SAMPLER_EXTERNAL_OES, |
NUM_SAMPLERS |
}; |
@@ -123,18 +134,22 @@ FragmentShaderId GetFragmentShaderId(bool premultiply_alpha, |
static FragmentShaderId shader_ids[][NUM_SAMPLERS] = { |
{ |
FRAGMENT_SHADER_COPY_TEXTURE_2D, |
+ FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB, |
FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, |
}, |
{ |
FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D, |
+ FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_RECTANGLE_ARB, |
FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES, |
}, |
{ |
FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D, |
+ FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_RECTANGLE_ARB, |
FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES, |
}, |
{ |
FRAGMENT_SHADER_COPY_TEXTURE_2D, |
+ FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB, |
FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, |
}}; |
@@ -144,6 +159,8 @@ FragmentShaderId GetFragmentShaderId(bool premultiply_alpha, |
switch (target) { |
case GL_TEXTURE_2D: |
return shader_ids[index][SAMPLER_2D]; |
+ case GL_TEXTURE_RECTANGLE_ARB: |
+ return shader_ids[index][SAMPLER_RECTANGLE_ARB]; |
case GL_TEXTURE_EXTERNAL_OES: |
return shader_ids[index][SAMPLER_EXTERNAL_OES]; |
default: |
@@ -261,6 +278,7 @@ void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform( |
bool unpremultiply_alpha, |
const GLfloat transform_matrix[16]) { |
DCHECK(source_target == GL_TEXTURE_2D || |
+ source_target == GL_TEXTURE_RECTANGLE_ARB || |
source_target == GL_TEXTURE_EXTERNAL_OES); |
if (!initialized_) { |
DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; |
@@ -300,6 +318,7 @@ void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform( |
DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure."; |
#endif |
info->matrix_handle = glGetUniformLocation(info->program, "u_matrix"); |
+ info->half_size_handle = glGetUniformLocation(info->program, "u_half_size"); |
info->sampler_handle = glGetUniformLocation(info->program, "u_sampler"); |
} |
glUseProgram(info->program); |
@@ -315,6 +334,10 @@ void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform( |
#endif |
glUniformMatrix4fv(info->matrix_handle, 1, GL_FALSE, transform_matrix); |
+ if (source_target == GL_TEXTURE_RECTANGLE_ARB) |
+ glUniform2f(info->half_size_handle, width / 2.0f, height / 2.0f); |
+ else |
+ glUniform2f(info->half_size_handle, 0.5f, 0.5f); |
glActiveTexture(GL_TEXTURE0); |
glBindTexture(GL_TEXTURE_2D, dest_id); |
// NVidia drivers require texture settings to be a certain way |