OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
11 #include "gpu/command_buffer/service/gl_utils.h" | 11 #include "gpu/command_buffer/service/gl_utils.h" |
12 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 12 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
13 #include "ui/gl/gl_implementation.h" | 13 #include "ui/gl/gl_version_info.h" |
14 | 14 |
15 namespace { | 15 namespace { |
16 | 16 |
17 const GLfloat kIdentityMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, | 17 const GLfloat kIdentityMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, |
18 0.0f, 1.0f, 0.0f, 0.0f, | 18 0.0f, 1.0f, 0.0f, 0.0f, |
19 0.0f, 0.0f, 1.0f, 0.0f, | 19 0.0f, 0.0f, 1.0f, 0.0f, |
20 0.0f, 0.0f, 0.0f, 1.0f}; | 20 0.0f, 0.0f, 0.0f, 1.0f}; |
21 | 21 |
22 enum FragmentShaderId { | 22 enum FragmentShaderId { |
23 FRAGMENT_SHADER_COPY_TEXTURE_2D, | 23 FRAGMENT_SHADER_COPY_TEXTURE_2D, |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 } | 87 } |
88 | 88 |
89 const char* kShaderPrecisionPreamble = "\ | 89 const char* kShaderPrecisionPreamble = "\ |
90 #ifdef GL_ES\n\ | 90 #ifdef GL_ES\n\ |
91 precision mediump float;\n\ | 91 precision mediump float;\n\ |
92 #define TexCoordPrecision mediump\n\ | 92 #define TexCoordPrecision mediump\n\ |
93 #else\n\ | 93 #else\n\ |
94 #define TexCoordPrecision\n\ | 94 #define TexCoordPrecision\n\ |
95 #endif\n"; | 95 #endif\n"; |
96 | 96 |
97 std::string GetVertexShaderSource() { | 97 std::string GetVertexShaderSource(const gl::GLVersionInfo& gl_version_info) { |
98 std::string source; | 98 std::string source; |
99 | 99 |
100 // Preamble for core and compatibility mode. | 100 // Preamble for core and compatibility mode. |
101 if (gl::GetGLImplementation() == gl::kGLImplementationDesktopGLCoreProfile) { | 101 if (gl_version_info.is_desktop_core_profile) { |
102 source += std::string("\ | 102 source += std::string("\ |
103 #version 150\n\ | 103 #version 150\n\ |
104 #define ATTRIBUTE in\n\ | 104 #define ATTRIBUTE in\n\ |
105 #define VARYING out\n"); | 105 #define VARYING out\n"); |
106 } else { | 106 } else { |
107 source += std::string("\ | 107 source += std::string("\ |
108 #define ATTRIBUTE attribute\n\ | 108 #define ATTRIBUTE attribute\n\ |
109 #define VARYING varying\n"); | 109 #define VARYING varying\n"); |
110 } | 110 } |
111 | 111 |
(...skipping 11 matching lines...) Expand all Loading... |
123 void main(void) {\n\ | 123 void main(void) {\n\ |
124 gl_Position = vec4(0, 0, 0, 1);\n\ | 124 gl_Position = vec4(0, 0, 0, 1);\n\ |
125 gl_Position.xy = a_position.xy * u_vertex_dest_mult + \ | 125 gl_Position.xy = a_position.xy * u_vertex_dest_mult + \ |
126 u_vertex_dest_add;\n\ | 126 u_vertex_dest_add;\n\ |
127 v_uv = a_position.xy * u_vertex_source_mult + u_vertex_source_add;\n\ | 127 v_uv = a_position.xy * u_vertex_source_mult + u_vertex_source_add;\n\ |
128 }\n"); | 128 }\n"); |
129 | 129 |
130 return source; | 130 return source; |
131 } | 131 } |
132 | 132 |
133 std::string GetFragmentShaderSource(bool premultiply_alpha, | 133 std::string GetFragmentShaderSource(const gl::GLVersionInfo& gl_version_info, |
| 134 bool premultiply_alpha, |
134 bool unpremultiply_alpha, | 135 bool unpremultiply_alpha, |
135 GLenum target) { | 136 GLenum target) { |
136 std::string source; | 137 std::string source; |
137 | 138 |
138 // Preamble for core and compatibility mode. | 139 // Preamble for core and compatibility mode. |
139 if (gl::GetGLImplementation() == gl::kGLImplementationDesktopGLCoreProfile) { | 140 if (gl_version_info.is_desktop_core_profile) { |
140 source += std::string("\ | 141 source += std::string("\ |
141 #version 150\n\ | 142 #version 150\n\ |
142 out vec4 frag_color;\n\ | 143 out vec4 frag_color;\n\ |
143 #define VARYING in\n\ | 144 #define VARYING in\n\ |
144 #define FRAGCOLOR frag_color\n\ | 145 #define FRAGCOLOR frag_color\n\ |
145 #define TextureLookup texture\n"); | 146 #define TextureLookup texture\n"); |
146 } else { | 147 } else { |
147 switch (target) { | 148 switch (target) { |
148 case GL_TEXTURE_2D: | 149 case GL_TEXTURE_2D: |
149 source += std::string("#define TextureLookup texture2D\n"); | 150 source += std::string("#define TextureLookup texture2D\n"); |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
567 DCHECK_LE(yoffset + height, dest_height); | 568 DCHECK_LE(yoffset + height, dest_height); |
568 if (dest_width == 0 || dest_height == 0 || source_width == 0 || | 569 if (dest_width == 0 || dest_height == 0 || source_width == 0 || |
569 source_height == 0) { | 570 source_height == 0) { |
570 return; | 571 return; |
571 } | 572 } |
572 | 573 |
573 if (!initialized_) { | 574 if (!initialized_) { |
574 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; | 575 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; |
575 return; | 576 return; |
576 } | 577 } |
| 578 const gl::GLVersionInfo& gl_version_info = |
| 579 decoder->GetFeatureInfo()->gl_version_info(); |
577 | 580 |
578 if (vertex_array_object_id_) { | 581 if (vertex_array_object_id_) { |
579 glBindVertexArrayOES(vertex_array_object_id_); | 582 glBindVertexArrayOES(vertex_array_object_id_); |
580 } else { | 583 } else { |
581 if (gl::GetGLImplementation() != | 584 if (!gl_version_info.is_desktop_core_profile) { |
582 gl::kGLImplementationDesktopGLCoreProfile) { | |
583 decoder->ClearAllAttributes(); | 585 decoder->ClearAllAttributes(); |
584 } | 586 } |
585 glEnableVertexAttribArray(kVertexPositionAttrib); | 587 glEnableVertexAttribArray(kVertexPositionAttrib); |
586 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); | 588 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); |
587 glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); | 589 glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); |
588 } | 590 } |
589 | 591 |
590 FragmentShaderId fragment_shader_id = GetFragmentShaderId( | 592 FragmentShaderId fragment_shader_id = GetFragmentShaderId( |
591 premultiply_alpha, unpremultiply_alpha, source_target); | 593 premultiply_alpha, unpremultiply_alpha, source_target); |
592 DCHECK_LT(static_cast<size_t>(fragment_shader_id), fragment_shaders_.size()); | 594 DCHECK_LT(static_cast<size_t>(fragment_shader_id), fragment_shaders_.size()); |
593 | 595 |
594 ProgramMapKey key(fragment_shader_id); | 596 ProgramMapKey key(fragment_shader_id); |
595 ProgramInfo* info = &programs_[key]; | 597 ProgramInfo* info = &programs_[key]; |
596 // Create program if necessary. | 598 // Create program if necessary. |
597 if (!info->program) { | 599 if (!info->program) { |
598 info->program = glCreateProgram(); | 600 info->program = glCreateProgram(); |
599 if (!vertex_shader_) { | 601 if (!vertex_shader_) { |
600 vertex_shader_ = glCreateShader(GL_VERTEX_SHADER); | 602 vertex_shader_ = glCreateShader(GL_VERTEX_SHADER); |
601 std::string source = GetVertexShaderSource(); | 603 std::string source = GetVertexShaderSource(gl_version_info); |
602 CompileShader(vertex_shader_, source.c_str()); | 604 CompileShader(vertex_shader_, source.c_str()); |
603 } | 605 } |
604 glAttachShader(info->program, vertex_shader_); | 606 glAttachShader(info->program, vertex_shader_); |
605 GLuint* fragment_shader = &fragment_shaders_[fragment_shader_id]; | 607 GLuint* fragment_shader = &fragment_shaders_[fragment_shader_id]; |
606 if (!*fragment_shader) { | 608 if (!*fragment_shader) { |
607 *fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); | 609 *fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); |
608 std::string source = GetFragmentShaderSource( | 610 std::string source = |
609 premultiply_alpha, unpremultiply_alpha, source_target); | 611 GetFragmentShaderSource(gl_version_info, premultiply_alpha, |
| 612 unpremultiply_alpha, source_target); |
610 CompileShader(*fragment_shader, source.c_str()); | 613 CompileShader(*fragment_shader, source.c_str()); |
611 } | 614 } |
612 glAttachShader(info->program, *fragment_shader); | 615 glAttachShader(info->program, *fragment_shader); |
613 glBindAttribLocation(info->program, kVertexPositionAttrib, "a_position"); | 616 glBindAttribLocation(info->program, kVertexPositionAttrib, "a_position"); |
614 glLinkProgram(info->program); | 617 glLinkProgram(info->program); |
615 #ifndef NDEBUG | 618 #ifndef NDEBUG |
616 GLint linked; | 619 GLint linked; |
617 glGetProgramiv(info->program, GL_LINK_STATUS, &linked); | 620 glGetProgramiv(info->program, GL_LINK_STATUS, &linked); |
618 if (!linked) | 621 if (!linked) |
619 DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure."; | 622 DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure."; |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
749 decoder->RestoreTextureState(dest_id); | 752 decoder->RestoreTextureState(dest_id); |
750 decoder->RestoreTextureUnitBindings(0); | 753 decoder->RestoreTextureUnitBindings(0); |
751 decoder->RestoreActiveTexture(); | 754 decoder->RestoreActiveTexture(); |
752 decoder->RestoreProgramBindings(); | 755 decoder->RestoreProgramBindings(); |
753 decoder->RestoreBufferBindings(); | 756 decoder->RestoreBufferBindings(); |
754 decoder->RestoreFramebufferBindings(); | 757 decoder->RestoreFramebufferBindings(); |
755 decoder->RestoreGlobalState(); | 758 decoder->RestoreGlobalState(); |
756 } | 759 } |
757 | 760 |
758 } // namespace gpu | 761 } // namespace gpu |
OLD | NEW |