OLD | NEW |
---|---|
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/output/shader.h" | 5 #include "cc/output/shader.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 2110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2121 }); | 2121 }); |
2122 } else { | 2122 } else { |
2123 get_alpha = SHADER0([]() { | 2123 get_alpha = SHADER0([]() { |
2124 float GetAlpha(vec2 ya_clamped) { return alpha; } | 2124 float GetAlpha(vec2 ya_clamped) { return alpha; } |
2125 }); | 2125 }); |
2126 } | 2126 } |
2127 | 2127 |
2128 return FRAGMENT_SHADER(head, get_uv + get_alpha + main); | 2128 return FRAGMENT_SHADER(head, get_uv + get_alpha + main); |
2129 } | 2129 } |
2130 | 2130 |
2131 FragmentShaderYVideo::FragmentShaderYVideo() | |
2132 : FragmentTexOpaqueBinding(), | |
2133 x_derivative_location_(-1), | |
2134 y_derivative_location_(-1) {} | |
2135 | |
2136 void FragmentShaderYVideo::Init(GLES2Interface* context, | |
2137 unsigned program, | |
2138 int* base_uniform_index) { | |
2139 FragmentTexOpaqueBinding::Init(context, program, base_uniform_index); | |
2140 | |
2141 static const char* uniforms[] = {"x_derivative", "y_derivative"}; | |
2142 int locations[arraysize(uniforms)]; | |
2143 | |
2144 GetProgramUniformLocations(context, program, arraysize(uniforms), uniforms, | |
2145 locations, base_uniform_index); | |
2146 x_derivative_location_ = locations[0]; | |
2147 y_derivative_location_ = locations[1]; | |
2148 } | |
2149 | |
2150 std::string FragmentShaderYVideo::GetShaderString(TexCoordPrecision precision, | |
2151 SamplerType sampler) const { | |
2152 return FRAGMENT_SHADER(GetShaderHead(), GetShaderBody()); | |
2153 } | |
2154 | |
2155 std::string FragmentShaderYVideo::GetShaderHead() { | |
2156 return SHADER0([]() { | |
2157 precision mediump float; | |
2158 varying TexCoordPrecision vec2 v_texCoord; | |
2159 uniform SamplerType s_texture; | |
2160 uniform float x_derivative; | |
2161 uniform float y_derivative; | |
2162 }); | |
2163 } | |
2164 | |
2165 std::string FragmentShaderYVideo::GetShaderBody() { | |
2166 return SHADER0([]() { | |
2167 vec4 TextureLookupBilinear(sampler2D sampler, highp vec2 texCoord) { | |
aleksandar.stojiljkovic
2016/07/15 12:29:06
custom bilinear filter used for RG88.
| |
2168 vec4 s1 = texture2D(sampler, texCoord); | |
2169 vec4 s2 = texture2D(sampler, texCoord + vec2(x_derivative, 0.)); | |
2170 vec4 s3 = texture2D(sampler, texCoord + vec2(0., y_derivative)); | |
2171 vec4 s4 = texture2D(sampler, texCoord + vec2(x_derivative, y_derivative)); | |
2172 vec2 f = fract(texCoord.xy / vec2(x_derivative, y_derivative)); | |
2173 return mix(mix(s1, s2, f.x), mix(s3, s4, f.x), f.y); | |
2174 } | |
2175 void main() { | |
2176 gl_FragColor = | |
2177 vec4(vec3(TextureLookupBilinear(s_texture, v_texCoord).g), 1.); | |
2178 } | |
2179 }); | |
2180 } | |
2181 | |
2131 FragmentShaderColor::FragmentShaderColor() : color_location_(-1) { | 2182 FragmentShaderColor::FragmentShaderColor() : color_location_(-1) { |
2132 } | 2183 } |
2133 | 2184 |
2134 void FragmentShaderColor::Init(GLES2Interface* context, | 2185 void FragmentShaderColor::Init(GLES2Interface* context, |
2135 unsigned program, | 2186 unsigned program, |
2136 int* base_uniform_index) { | 2187 int* base_uniform_index) { |
2137 static const char* uniforms[] = { | 2188 static const char* uniforms[] = { |
2138 "color", | 2189 "color", |
2139 }; | 2190 }; |
2140 int locations[arraysize(uniforms)]; | 2191 int locations[arraysize(uniforms)]; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2204 void main() { | 2255 void main() { |
2205 vec4 d4 = min(edge_dist[0], edge_dist[1]); | 2256 vec4 d4 = min(edge_dist[0], edge_dist[1]); |
2206 vec2 d2 = min(d4.xz, d4.yw); | 2257 vec2 d2 = min(d4.xz, d4.yw); |
2207 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); | 2258 float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0); |
2208 gl_FragColor = color * aa; | 2259 gl_FragColor = color * aa; |
2209 } | 2260 } |
2210 }); | 2261 }); |
2211 } | 2262 } |
2212 | 2263 |
2213 } // namespace cc | 2264 } // namespace cc |
OLD | NEW |