OLD | NEW |
---|---|
1 // Copyright 2010 The Chromium Authors. All rights reserved. | 1 // Copyright 2010 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 "cc/gl_renderer.h" | 5 #include "cc/gl_renderer.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
839 SetShaderQuadF(surface_quad, shader_quad_location); | 839 SetShaderQuadF(surface_quad, shader_quad_location); |
840 DrawQuadGeometry( | 840 DrawQuadGeometry( |
841 frame, quad->quadTransform(), quad->rect, shader_matrix_location); | 841 frame, quad->quadTransform(), quad->rect, shader_matrix_location); |
842 | 842 |
843 // Flush the compositor context before the filter bitmap goes out of | 843 // Flush the compositor context before the filter bitmap goes out of |
844 // scope, so the draw gets processed before the filter texture gets deleted. | 844 // scope, so the draw gets processed before the filter texture gets deleted. |
845 if (filter_bitmap.getTexture()) | 845 if (filter_bitmap.getTexture()) |
846 context_->flush(); | 846 context_->flush(); |
847 } | 847 } |
848 | 848 |
849 struct SolidColorProgramUniforms { | |
850 unsigned program; | |
851 unsigned matrix_location; | |
852 unsigned color_location; | |
853 unsigned point_location; | |
854 unsigned tex_scale_location; | |
855 unsigned edge_location; | |
856 }; | |
857 | |
858 template<class T> | |
859 static void SolidColorUniformLocation(T program, | |
860 SolidColorProgramUniforms& uniforms) { | |
danakj
2013/03/14 00:54:25
no non-const references. this should be a pointer.
ernstm
2013/03/14 17:08:33
Done.
| |
861 uniforms.program = program->program(); | |
862 uniforms.matrix_location = program->vertexShader().matrixLocation(); | |
danakj
2013/03/14 00:54:25
2 space indents
ernstm
2013/03/14 17:08:33
Done.
| |
863 uniforms.color_location = program->fragmentShader().colorLocation(); | |
864 uniforms.point_location = program->vertexShader().pointLocation(); | |
865 uniforms.tex_scale_location = program->vertexShader().texScaleLocation(); | |
866 uniforms.edge_location = program->fragmentShader().edgeLocation(); | |
867 } | |
868 | |
869 bool GLRenderer::SetupQuadForAntialiasing(const gfx::Transform& device_transform , | |
danakj
2013/03/14 00:54:25
80 cols
ernstm
2013/03/14 17:08:33
Done.
| |
870 const DrawQuad* quad, | |
871 gfx::QuadF* local_quad, | |
872 float edge[24]) const { | |
873 gfx::Rect tile_rect = quad->visible_rect; | |
874 | |
875 bool clipped = false; | |
876 gfx::QuadF device_layer_quad = MathUtil::mapQuad( | |
877 device_transform, gfx::QuadF(quad->visibleContentRect()), clipped); | |
878 DCHECK(!clipped); | |
879 | |
880 // TODO(reveman): Axis-aligned is not enough to avoid anti-aliasing. | |
881 // Bounding rectangle for quad also needs to be expressible as an integer | |
882 // rectangle. crbug.com/169374 | |
883 bool is_axis_aligned_in_target = device_layer_quad.IsRectilinear(); | |
884 bool use_aa = !clipped && !is_axis_aligned_in_target && quad->IsEdge(); | |
885 | |
886 if (!use_aa) | |
887 return false; | |
888 | |
889 LayerQuad device_layer_bounds(gfx::QuadF(device_layer_quad.BoundingBox())); | |
890 device_layer_bounds.InflateAntiAliasingDistance(); | |
891 | |
892 LayerQuad device_layer_edges(device_layer_quad); | |
893 device_layer_edges.InflateAntiAliasingDistance(); | |
894 | |
895 device_layer_edges.ToFloatArray(edge); | |
896 device_layer_bounds.ToFloatArray(&edge[12]); | |
897 | |
898 gfx::PointF bottom_right = tile_rect.bottom_right(); | |
899 gfx::PointF bottom_left = tile_rect.bottom_left(); | |
900 gfx::PointF top_left = tile_rect.origin(); | |
901 gfx::PointF top_right = tile_rect.top_right(); | |
902 | |
903 // Map points to device space. | |
904 bottom_right = MathUtil::mapPoint(device_transform, bottom_right, clipped); | |
905 DCHECK(!clipped); | |
906 bottom_left = MathUtil::mapPoint(device_transform, bottom_left, clipped); | |
907 DCHECK(!clipped); | |
908 top_left = MathUtil::mapPoint(device_transform, top_left, clipped); | |
909 DCHECK(!clipped); | |
910 top_right = MathUtil::mapPoint(device_transform, top_right, clipped); | |
911 DCHECK(!clipped); | |
912 | |
913 LayerQuad::Edge bottom_edge(bottom_right, bottom_left); | |
914 LayerQuad::Edge left_edge(bottom_left, top_left); | |
915 LayerQuad::Edge top_edge(top_left, top_right); | |
916 LayerQuad::Edge right_edge(top_right, bottom_right); | |
917 | |
918 // Only apply anti-aliasing to edges not clipped by culling or scissoring. | |
919 if (quad->IsTopEdge() && tile_rect.y() == quad->rect.y()) | |
920 top_edge = device_layer_edges.top(); | |
921 if (quad->IsLeftEdge() && tile_rect.x() == quad->rect.x()) | |
922 left_edge = device_layer_edges.left(); | |
923 if (quad->IsRightEdge() && tile_rect.right() == quad->rect.right()) | |
924 right_edge = device_layer_edges.right(); | |
925 if (quad->IsBottomEdge() && tile_rect.bottom() == quad->rect.bottom()) | |
926 bottom_edge = device_layer_edges.bottom(); | |
927 | |
928 float sign = gfx::QuadF(tile_rect).IsCounterClockwise() ? -1 : 1; | |
929 bottom_edge.scale(sign); | |
930 left_edge.scale(sign); | |
931 top_edge.scale(sign); | |
932 right_edge.scale(sign); | |
933 | |
934 // Create device space quad. | |
935 LayerQuad device_quad(left_edge, top_edge, right_edge, bottom_edge); | |
936 | |
937 // Map device space quad to local space. deviceTransform has no 3d | |
938 // component since it was flattened, so we don't need to project. We should | |
939 // have already checked that the transform was uninvertible above. | |
940 gfx::Transform inverse_device_transform( | |
941 gfx::Transform::kSkipInitialization); | |
942 bool did_invert = device_transform.GetInverse(&inverse_device_transform); | |
943 DCHECK(did_invert); | |
944 *local_quad = MathUtil::mapQuad( | |
945 inverse_device_transform, device_quad.ToQuadF(), clipped); | |
946 // We should not DCHECK(!clipped) here, because anti-aliasing inflation may | |
947 // cause deviceQuad to become clipped. To our knowledge this scenario does | |
948 // not need to be handled differently than the unclipped case. | |
949 | |
950 return true; | |
951 } | |
952 | |
849 void GLRenderer::DrawSolidColorQuad(const DrawingFrame& frame, | 953 void GLRenderer::DrawSolidColorQuad(const DrawingFrame& frame, |
850 const SolidColorDrawQuad* quad) { | 954 const SolidColorDrawQuad* quad) { |
851 SetBlendEnabled(quad->ShouldDrawWithBlending()); | 955 SetBlendEnabled(quad->ShouldDrawWithBlending()); |
956 gfx::Rect tile_rect = quad->visible_rect; | |
852 | 957 |
853 const SolidColorProgram* program = GetSolidColorProgram(); | 958 gfx::Transform device_transform = |
854 SetUseProgram(program->program()); | 959 frame.window_matrix * frame.projection_matrix * quad->quadTransform(); |
960 device_transform.FlattenTo2d(); | |
961 if (!device_transform.IsInvertible()) | |
962 return; | |
963 | |
964 gfx::QuadF local_quad = gfx::QuadF(gfx::RectF(tile_rect)); | |
965 float edge[24]; | |
966 bool use_aa = SetupQuadForAntialiasing( | |
967 device_transform, quad, &local_quad, edge); | |
968 | |
969 SolidColorProgramUniforms uniforms; | |
970 if (use_aa) | |
971 SolidColorUniformLocation(GetSolidColorProgramAA(), uniforms); | |
972 else | |
973 SolidColorUniformLocation(GetSolidColorProgram(), uniforms); | |
974 SetUseProgram(uniforms.program); | |
855 | 975 |
856 SkColor color = quad->color; | 976 SkColor color = quad->color; |
857 float opacity = quad->opacity(); | 977 float opacity = quad->opacity(); |
858 float alpha = (SkColorGetA(color) * (1.0f / 255.0f)) * opacity; | 978 float alpha = (SkColorGetA(color) * (1.0f / 255.0f)) * opacity; |
859 | 979 |
860 GLC(Context(), | 980 GLC(Context(), |
861 Context()->uniform4f(program->fragmentShader().colorLocation(), | 981 Context()->uniform4f(uniforms.color_location, |
862 (SkColorGetR(color) * (1.0f / 255.0f)) * alpha, | 982 (SkColorGetR(color) * (1.0f / 255.0f)) * alpha, |
863 (SkColorGetG(color) * (1.0f / 255.0f)) * alpha, | 983 (SkColorGetG(color) * (1.0f / 255.0f)) * alpha, |
864 (SkColorGetB(color) * (1.0f / 255.0f)) * alpha, | 984 (SkColorGetB(color) * (1.0f / 255.0f)) * alpha, |
865 alpha)); | 985 alpha)); |
866 | 986 |
867 DrawQuadGeometry(frame, | 987 GLC(Context(), Context()->uniform2f(uniforms.tex_scale_location, 1.0f, 1.0f)); |
868 quad->quadTransform(), | 988 |
869 quad->rect, | 989 if (use_aa) { |
danakj
2013/03/14 00:54:25
no {} for 1 line
ernstm
2013/03/14 17:08:33
Done.
| |
870 program->vertexShader().matrixLocation()); | 990 GLC(Context(), Context()->uniform3fv(uniforms.edge_location, 8, edge)); |
991 } | |
992 | |
993 // Enable blending when the quad properties require it or if we decided | |
994 // to use antialiasing. | |
995 SetBlendEnabled(quad->ShouldDrawWithBlending() || use_aa); | |
996 | |
997 // Normalize to tileRect. | |
998 local_quad.Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height()); | |
999 | |
1000 SetShaderQuadF(local_quad, uniforms.point_location); | |
1001 | |
1002 // The transform and vertex data are used to figure out the extents that the | |
1003 // un-antialiased quad should have and which vertex this is and the float | |
1004 // quad passed in via uniform is the actual geometry that gets used to draw | |
1005 // it. This is why this centered rect is used and not the original quadRect. | |
1006 gfx::RectF centered_rect(gfx::PointF(-0.5 * tile_rect.width(), | |
danakj
2013/03/14 00:54:25
0.5f
ernstm
2013/03/14 17:08:33
Done.
| |
1007 -0.5 * tile_rect.height()), | |
1008 tile_rect.size()); | |
1009 DrawQuadGeometry(frame, quad->quadTransform(), | |
1010 centered_rect, uniforms.matrix_location); | |
871 } | 1011 } |
872 | 1012 |
873 struct TileProgramUniforms { | 1013 struct TileProgramUniforms { |
874 unsigned program; | 1014 unsigned program; |
875 unsigned sampler_location; | 1015 unsigned sampler_location; |
876 unsigned vertex_tex_transform_location; | 1016 unsigned vertex_tex_transform_location; |
877 unsigned fragment_tex_transform_location; | 1017 unsigned fragment_tex_transform_location; |
878 unsigned edge_location; | 1018 unsigned edge_location; |
879 unsigned matrix_location; | 1019 unsigned matrix_location; |
880 unsigned alpha_location; | 1020 unsigned alpha_location; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
940 float vertex_tex_scale_x = tile_rect.width() / clamp_geom_rect.width(); | 1080 float vertex_tex_scale_x = tile_rect.width() / clamp_geom_rect.width(); |
941 float vertex_tex_scale_y = tile_rect.height() / clamp_geom_rect.height(); | 1081 float vertex_tex_scale_y = tile_rect.height() / clamp_geom_rect.height(); |
942 | 1082 |
943 // Map to normalized texture coordinates. | 1083 // Map to normalized texture coordinates. |
944 gfx::Size texture_size = quad->texture_size; | 1084 gfx::Size texture_size = quad->texture_size; |
945 float fragment_tex_translate_x = clamp_tex_rect.x() / texture_size.width(); | 1085 float fragment_tex_translate_x = clamp_tex_rect.x() / texture_size.width(); |
946 float fragment_tex_translate_y = clamp_tex_rect.y() / texture_size.height(); | 1086 float fragment_tex_translate_y = clamp_tex_rect.y() / texture_size.height(); |
947 float fragment_tex_scale_x = clamp_tex_rect.width() / texture_size.width(); | 1087 float fragment_tex_scale_x = clamp_tex_rect.width() / texture_size.width(); |
948 float fragment_tex_scale_y = clamp_tex_rect.height() / texture_size.height(); | 1088 float fragment_tex_scale_y = clamp_tex_rect.height() / texture_size.height(); |
949 | 1089 |
950 gfx::QuadF local_quad; | |
951 gfx::Transform device_transform = | 1090 gfx::Transform device_transform = |
952 frame.window_matrix * frame.projection_matrix * quad->quadTransform(); | 1091 frame.window_matrix * frame.projection_matrix * quad->quadTransform(); |
953 device_transform.FlattenTo2d(); | 1092 device_transform.FlattenTo2d(); |
954 if (!device_transform.IsInvertible()) | 1093 if (!device_transform.IsInvertible()) |
955 return; | 1094 return; |
956 | 1095 |
957 bool clipped = false; | 1096 gfx::QuadF local_quad = gfx::QuadF(gfx::RectF(tile_rect)); |
958 gfx::QuadF device_layer_quad = MathUtil::mapQuad( | 1097 float edge[24]; |
959 device_transform, gfx::QuadF(quad->visibleContentRect()), clipped); | 1098 bool use_aa = SetupQuadForAntialiasing( |
960 DCHECK(!clipped); | 1099 device_transform, quad, &local_quad, edge); |
961 | |
962 // TODO(reveman): Axis-aligned is not enough to avoid anti-aliasing. | |
963 // Bounding rectangle for quad also needs to be expressible as | |
964 // an integer rectangle. crbug.com/169374 | |
965 bool is_axis_aligned_in_target = device_layer_quad.IsRectilinear(); | |
966 bool use_aa = !clipped && !is_axis_aligned_in_target && quad->IsEdge(); | |
967 | 1100 |
968 TileProgramUniforms uniforms; | 1101 TileProgramUniforms uniforms; |
969 if (use_aa) { | 1102 if (use_aa) { |
970 if (quad->swizzle_contents) | 1103 if (quad->swizzle_contents) |
971 TileUniformLocation(GetTileProgramSwizzleAA(), uniforms); | 1104 TileUniformLocation(GetTileProgramSwizzleAA(), uniforms); |
972 else | 1105 else |
973 TileUniformLocation(GetTileProgramAA(), uniforms); | 1106 TileUniformLocation(GetTileProgramAA(), uniforms); |
974 } else { | 1107 } else { |
975 if (quad->ShouldDrawWithBlending()) { | 1108 if (quad->ShouldDrawWithBlending()) { |
976 if (quad->swizzle_contents) | 1109 if (quad->swizzle_contents) |
(...skipping 12 matching lines...) Expand all Loading... | |
989 GLC(Context(), Context()->uniform1i(uniforms.sampler_location, 0)); | 1122 GLC(Context(), Context()->uniform1i(uniforms.sampler_location, 0)); |
990 bool scaled = (tex_to_geom_scale_x != 1.f || tex_to_geom_scale_y != 1.f); | 1123 bool scaled = (tex_to_geom_scale_x != 1.f || tex_to_geom_scale_y != 1.f); |
991 GLenum filter = (use_aa || scaled || | 1124 GLenum filter = (use_aa || scaled || |
992 !quad->quadTransform().IsIdentityOrIntegerTranslation()) | 1125 !quad->quadTransform().IsIdentityOrIntegerTranslation()) |
993 ? GL_LINEAR | 1126 ? GL_LINEAR |
994 : GL_NEAREST; | 1127 : GL_NEAREST; |
995 ResourceProvider::ScopedSamplerGL quad_resource_lock( | 1128 ResourceProvider::ScopedSamplerGL quad_resource_lock( |
996 resource_provider_, quad->resource_id, GL_TEXTURE_2D, filter); | 1129 resource_provider_, quad->resource_id, GL_TEXTURE_2D, filter); |
997 | 1130 |
998 if (use_aa) { | 1131 if (use_aa) { |
999 LayerQuad deviceLayerBounds(gfx::QuadF(device_layer_quad.BoundingBox())); | |
1000 deviceLayerBounds.InflateAntiAliasingDistance(); | |
1001 | |
1002 LayerQuad device_layer_edges(device_layer_quad); | |
1003 device_layer_edges.InflateAntiAliasingDistance(); | |
1004 | |
1005 float edge[24]; | |
1006 device_layer_edges.ToFloatArray(edge); | |
1007 deviceLayerBounds.ToFloatArray(&edge[12]); | |
1008 GLC(Context(), Context()->uniform3fv(uniforms.edge_location, 8, edge)); | 1132 GLC(Context(), Context()->uniform3fv(uniforms.edge_location, 8, edge)); |
1009 | 1133 |
1010 GLC(Context(), | 1134 GLC(Context(), |
1011 Context()->uniform4f(uniforms.vertex_tex_transform_location, | 1135 Context()->uniform4f(uniforms.vertex_tex_transform_location, |
1012 vertex_tex_translate_x, | 1136 vertex_tex_translate_x, |
1013 vertex_tex_translate_y, | 1137 vertex_tex_translate_y, |
1014 vertex_tex_scale_x, | 1138 vertex_tex_scale_x, |
1015 vertex_tex_scale_y)); | 1139 vertex_tex_scale_y)); |
1016 GLC(Context(), | 1140 GLC(Context(), |
1017 Context()->uniform4f(uniforms.fragment_tex_transform_location, | 1141 Context()->uniform4f(uniforms.fragment_tex_transform_location, |
1018 fragment_tex_translate_x, | 1142 fragment_tex_translate_x, |
1019 fragment_tex_translate_y, | 1143 fragment_tex_translate_y, |
1020 fragment_tex_scale_x, | 1144 fragment_tex_scale_x, |
1021 fragment_tex_scale_y)); | 1145 fragment_tex_scale_y)); |
1022 | |
1023 gfx::PointF bottom_right = tile_rect.bottom_right(); | |
1024 gfx::PointF bottom_left = tile_rect.bottom_left(); | |
1025 gfx::PointF top_left = tile_rect.origin(); | |
1026 gfx::PointF top_right = tile_rect.top_right(); | |
1027 | |
1028 // Map points to device space. | |
1029 bottom_right = MathUtil::mapPoint(device_transform, bottom_right, clipped); | |
1030 DCHECK(!clipped); | |
1031 bottom_left = MathUtil::mapPoint(device_transform, bottom_left, clipped); | |
1032 DCHECK(!clipped); | |
1033 top_left = MathUtil::mapPoint(device_transform, top_left, clipped); | |
1034 DCHECK(!clipped); | |
1035 top_right = MathUtil::mapPoint(device_transform, top_right, clipped); | |
1036 DCHECK(!clipped); | |
1037 | |
1038 LayerQuad::Edge bottom_edge(bottom_right, bottom_left); | |
1039 LayerQuad::Edge left_edge(bottom_left, top_left); | |
1040 LayerQuad::Edge top_edge(top_left, top_right); | |
1041 LayerQuad::Edge right_edge(top_right, bottom_right); | |
1042 | |
1043 // Only apply anti-aliasing to edges not clipped by culling or scissoring. | |
1044 if (quad->IsTopEdge() && tile_rect.y() == quad->rect.y()) | |
1045 top_edge = device_layer_edges.top(); | |
1046 if (quad->IsLeftEdge() && tile_rect.x() == quad->rect.x()) | |
1047 left_edge = device_layer_edges.left(); | |
1048 if (quad->IsRightEdge() && tile_rect.right() == quad->rect.right()) | |
1049 right_edge = device_layer_edges.right(); | |
1050 if (quad->IsBottomEdge() && tile_rect.bottom() == quad->rect.bottom()) | |
1051 bottom_edge = device_layer_edges.bottom(); | |
1052 | |
1053 float sign = gfx::QuadF(tile_rect).IsCounterClockwise() ? -1 : 1; | |
1054 bottom_edge.scale(sign); | |
1055 left_edge.scale(sign); | |
1056 top_edge.scale(sign); | |
1057 right_edge.scale(sign); | |
1058 | |
1059 // Create device space quad. | |
1060 LayerQuad device_quad(left_edge, top_edge, right_edge, bottom_edge); | |
1061 | |
1062 // Map device space quad to local space. device_transform has no 3d | |
1063 // component since it was flattened, so we don't need to project. We should | |
1064 // have already checked that the transform was uninvertible above. | |
1065 gfx::Transform inverse_device_transform( | |
1066 gfx::Transform::kSkipInitialization); | |
1067 bool did_invert = device_transform.GetInverse(&inverse_device_transform); | |
1068 DCHECK(did_invert); | |
1069 local_quad = MathUtil::mapQuad( | |
1070 inverse_device_transform, device_quad.ToQuadF(), clipped); | |
1071 | |
1072 // We should not DCHECK(!clipped) here, because anti-aliasing inflation may | |
1073 // cause device_quad to become clipped. To our knowledge this scenario does | |
1074 // not need to be handled differently than the unclipped case. | |
1075 } else { | 1146 } else { |
1076 // Move fragment shader transform to vertex shader. We can do this while | 1147 // Move fragment shader transform to vertex shader. We can do this while |
1077 // still producing correct results as fragment_tex_transform_location | 1148 // still producing correct results as fragment_tex_transform_location |
1078 // should always be non-negative when tiles are transformed in a way | 1149 // should always be non-negative when tiles are transformed in a way |
1079 // that could result in sampling outside the layer. | 1150 // that could result in sampling outside the layer. |
1080 vertex_tex_scale_x *= fragment_tex_scale_x; | 1151 vertex_tex_scale_x *= fragment_tex_scale_x; |
1081 vertex_tex_scale_y *= fragment_tex_scale_y; | 1152 vertex_tex_scale_y *= fragment_tex_scale_y; |
1082 vertex_tex_translate_x *= fragment_tex_scale_x; | 1153 vertex_tex_translate_x *= fragment_tex_scale_x; |
1083 vertex_tex_translate_y *= fragment_tex_scale_y; | 1154 vertex_tex_translate_y *= fragment_tex_scale_y; |
1084 vertex_tex_translate_x += fragment_tex_translate_x; | 1155 vertex_tex_translate_x += fragment_tex_translate_x; |
1085 vertex_tex_translate_y += fragment_tex_translate_y; | 1156 vertex_tex_translate_y += fragment_tex_translate_y; |
1086 | 1157 |
1087 GLC(Context(), | 1158 GLC(Context(), |
1088 Context()->uniform4f(uniforms.vertex_tex_transform_location, | 1159 Context()->uniform4f(uniforms.vertex_tex_transform_location, |
1089 vertex_tex_translate_x, | 1160 vertex_tex_translate_x, |
1090 vertex_tex_translate_y, | 1161 vertex_tex_translate_y, |
1091 vertex_tex_scale_x, | 1162 vertex_tex_scale_x, |
1092 vertex_tex_scale_y)); | 1163 vertex_tex_scale_y)); |
1093 | |
1094 local_quad = gfx::RectF(tile_rect); | |
1095 } | 1164 } |
1096 | 1165 |
1097 // Enable blending when the quad properties require it or if we decided | 1166 // Enable blending when the quad properties require it or if we decided |
1098 // to use antialiasing. | 1167 // to use antialiasing. |
1099 SetBlendEnabled(quad->ShouldDrawWithBlending() || use_aa); | 1168 SetBlendEnabled(quad->ShouldDrawWithBlending() || use_aa); |
1100 | 1169 |
1101 // Normalize to tile_rect. | 1170 // Normalize to tile_rect. |
1102 local_quad.Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height()); | 1171 local_quad.Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height()); |
1103 | 1172 |
1104 SetShaderOpacity(quad->opacity(), uniforms.alpha_location); | 1173 SetShaderOpacity(quad->opacity(), uniforms.alpha_location); |
1105 SetShaderQuadF(local_quad, uniforms.point_location); | 1174 SetShaderQuadF(local_quad, uniforms.point_location); |
1106 | 1175 |
1107 // The tile quad shader behaves differently compared to all other shaders. | |
1108 // The transform and vertex data are used to figure out the extents that the | 1176 // The transform and vertex data are used to figure out the extents that the |
1109 // un-antialiased quad should have and which vertex this is and the float | 1177 // un-antialiased quad should have and which vertex this is and the float |
1110 // quad passed in via uniform is the actual geometry that gets used to draw | 1178 // quad passed in via uniform is the actual geometry that gets used to draw |
1111 // it. This is why this centered rect is used and not the original quad_rect. | 1179 // it. This is why this centered rect is used and not the original quad_rect. |
1112 gfx::RectF centeredRect( | 1180 gfx::RectF centeredRect( |
1113 gfx::PointF(-0.5f * tile_rect.width(), -0.5f * tile_rect.height()), | 1181 gfx::PointF(-0.5f * tile_rect.width(), -0.5f * tile_rect.height()), |
1114 tile_rect.size()); | 1182 tile_rect.size()); |
1115 DrawQuadGeometry( | 1183 DrawQuadGeometry( |
1116 frame, quad->quadTransform(), centeredRect, uniforms.matrix_location); | 1184 frame, quad->quadTransform(), centeredRect, uniforms.matrix_location); |
1117 } | 1185 } |
(...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1915 const GLRenderer::SolidColorProgram* GLRenderer::GetSolidColorProgram() { | 1983 const GLRenderer::SolidColorProgram* GLRenderer::GetSolidColorProgram() { |
1916 if (!solid_color_program_) | 1984 if (!solid_color_program_) |
1917 solid_color_program_ = make_scoped_ptr(new SolidColorProgram(context_)); | 1985 solid_color_program_ = make_scoped_ptr(new SolidColorProgram(context_)); |
1918 if (!solid_color_program_->initialized()) { | 1986 if (!solid_color_program_->initialized()) { |
1919 TRACE_EVENT0("cc", "GLRenderer::solidColorProgram::initialize"); | 1987 TRACE_EVENT0("cc", "GLRenderer::solidColorProgram::initialize"); |
1920 solid_color_program_->initialize(context_, is_using_bind_uniform_); | 1988 solid_color_program_->initialize(context_, is_using_bind_uniform_); |
1921 } | 1989 } |
1922 return solid_color_program_.get(); | 1990 return solid_color_program_.get(); |
1923 } | 1991 } |
1924 | 1992 |
1993 const GLRenderer::SolidColorProgramAA* GLRenderer::GetSolidColorProgramAA() | |
1994 { | |
1995 if (!solid_color_program_aa_) | |
1996 solid_color_program_aa_ = make_scoped_ptr(new SolidColorProgramAA(context_)) ; | |
danakj
2013/03/14 00:54:25
80 cols. line break and use {} for the if.
ernstm
2013/03/14 17:08:33
Done.
| |
1997 if (!solid_color_program_aa_->initialized()) { | |
1998 TRACE_EVENT0("cc", "GLRenderer::solidColorProgramAA::initialize"); | |
1999 solid_color_program_aa_->initialize(context_, is_using_bind_uniform_); | |
2000 } | |
2001 return solid_color_program_aa_.get(); | |
2002 } | |
2003 | |
1925 const GLRenderer::RenderPassProgram* GLRenderer::GetRenderPassProgram() { | 2004 const GLRenderer::RenderPassProgram* GLRenderer::GetRenderPassProgram() { |
1926 DCHECK(render_pass_program_); | 2005 DCHECK(render_pass_program_); |
1927 if (!render_pass_program_->initialized()) { | 2006 if (!render_pass_program_->initialized()) { |
1928 TRACE_EVENT0("cc", "GLRenderer::renderPassProgram::initialize"); | 2007 TRACE_EVENT0("cc", "GLRenderer::renderPassProgram::initialize"); |
1929 render_pass_program_->initialize(context_, is_using_bind_uniform_); | 2008 render_pass_program_->initialize(context_, is_using_bind_uniform_); |
1930 } | 2009 } |
1931 return render_pass_program_.get(); | 2010 return render_pass_program_.get(); |
1932 } | 2011 } |
1933 | 2012 |
1934 const GLRenderer::RenderPassProgramAA* GLRenderer::GetRenderPassProgramAA() { | 2013 const GLRenderer::RenderPassProgramAA* GLRenderer::GetRenderPassProgramAA() { |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2117 if (texture_io_surface_program_) | 2196 if (texture_io_surface_program_) |
2118 texture_io_surface_program_->cleanup(context_); | 2197 texture_io_surface_program_->cleanup(context_); |
2119 | 2198 |
2120 if (video_yuv_program_) | 2199 if (video_yuv_program_) |
2121 video_yuv_program_->cleanup(context_); | 2200 video_yuv_program_->cleanup(context_); |
2122 if (video_stream_texture_program_) | 2201 if (video_stream_texture_program_) |
2123 video_stream_texture_program_->cleanup(context_); | 2202 video_stream_texture_program_->cleanup(context_); |
2124 | 2203 |
2125 if (solid_color_program_) | 2204 if (solid_color_program_) |
2126 solid_color_program_->cleanup(context_); | 2205 solid_color_program_->cleanup(context_); |
2206 if (solid_color_program_aa_) | |
2207 solid_color_program_aa_->cleanup(context_); | |
2127 | 2208 |
2128 if (offscreen_framebuffer_id_) | 2209 if (offscreen_framebuffer_id_) |
2129 GLC(context_, context_->deleteFramebuffer(offscreen_framebuffer_id_)); | 2210 GLC(context_, context_->deleteFramebuffer(offscreen_framebuffer_id_)); |
2130 | 2211 |
2131 ReleaseRenderPassTextures(); | 2212 ReleaseRenderPassTextures(); |
2132 } | 2213 } |
2133 | 2214 |
2134 bool GLRenderer::IsContextLost() { | 2215 bool GLRenderer::IsContextLost() { |
2135 return (context_->getGraphicsResetStatusARB() != GL_NO_ERROR); | 2216 return (context_->getGraphicsResetStatusARB() != GL_NO_ERROR); |
2136 } | 2217 } |
2137 | 2218 |
2138 } // namespace cc | 2219 } // namespace cc |
OLD | NEW |