Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(796)

Side by Side Diff: src/opts/SkRasterPipeline_opts.h

Issue 2480823002: skrpb: evaluate color filters for constant shaders once. (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/opts/SkNx_sse.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkRasterPipeline_opts_DEFINED 8 #ifndef SkRasterPipeline_opts_DEFINED
9 #define SkRasterPipeline_opts_DEFINED 9 #define SkRasterPipeline_opts_DEFINED
10 10
11 #include "SkColorPriv.h" 11 #include "SkColorPriv.h"
12 #include "SkHalf.h" 12 #include "SkHalf.h"
13 #include "SkPM4f.h" 13 #include "SkPM4f.h"
14 #include "SkRasterPipeline.h" 14 #include "SkRasterPipeline.h"
15 #include "SkSRGB.h" 15 #include "SkSRGB.h"
16 #include <utility> 16 #include <utility>
17 17
18 namespace { 18 namespace {
19 19
20 #if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_AVX2 20 #if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_AVX2
21 static constexpr int N = 8; 21 static constexpr int N = 8;
22 #else 22 #else
23 static constexpr int N = 4; 23 static constexpr int N = 4;
24 #endif 24 #endif
25 25
26 using SkNf = SkNx<N, float>; 26 using SkNf = SkNx<N, float>;
27 using SkNi = SkNx<N, int>; 27 using SkNi = SkNx<N, int>;
28 using SkNh = SkNx<N, uint16_t>; 28 using SkNh = SkNx<N, uint16_t>;
29 29
30 struct BodyStage; 30 struct BodyStage;
31 struct TailStage; 31 struct TailStage;
32 32
33 using Body = void(SK_VECTORCALL *)(BodyStage*, size_t, SkNf,SkNf,SkN f,SkNf, 33 using Body = void(SK_VECTORCALL *)(BodyStage*, size_t, SkNf,SkNf,SkN f,SkNf,
34 SkNf,SkNf,SkN f,SkNf); 34 SkNf,SkNf,SkN f,SkNf);
35 using Tail = void(SK_VECTORCALL *)(TailStage*, size_t, size_t, SkNf,SkNf,SkN f,SkNf, 35 using Tail = void(SK_VECTORCALL *)(TailStage*, size_t, size_t, SkNf,SkNf,SkN f,SkNf,
36 SkNf,SkNf,SkN f,SkNf); 36 SkNf,SkNf,SkN f,SkNf);
37 struct BodyStage { Body next; void* ctx; }; 37 struct BodyStage { Body next; void* ctx; };
38 struct TailStage { Tail next; void* ctx; }; 38 struct TailStage { Tail next; void* ctx; };
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 case 6: ptr[5] = buf[5]; 372 case 6: ptr[5] = buf[5];
373 case 5: ptr[4] = buf[4]; 373 case 5: ptr[4] = buf[4];
374 case 4: ptr[3] = buf[3]; 374 case 4: ptr[3] = buf[3];
375 case 3: ptr[2] = buf[2]; 375 case 3: ptr[2] = buf[2];
376 case 2: ptr[1] = buf[1]; 376 case 2: ptr[1] = buf[1];
377 } 377 }
378 ptr[0] = buf[0]; 378 ptr[0] = buf[0];
379 } 379 }
380 } 380 }
381 381
382 STAGE(store_f32, false) {
383 auto ptr = *(SkPM4f**)ctx + x;
384
385 SkPM4f buf[8];
386 SkNf::Store4(kIsTail ? buf : ptr, r,g,b,a);
387 if (kIsTail) {
388 switch (tail & (N-1)) {
389 case 7: ptr[6] = buf[6];
390 case 6: ptr[5] = buf[5];
391 case 5: ptr[4] = buf[4];
392 case 4: ptr[3] = buf[3];
393 case 3: ptr[2] = buf[2];
394 case 2: ptr[1] = buf[1];
395 }
396 ptr[0] = buf[0];
397 }
398 }
399
382 400
383 // Load 8-bit SkPMColor-order sRGB. 401 // Load 8-bit SkPMColor-order sRGB.
384 STAGE(load_d_srgb, true) { 402 STAGE(load_d_srgb, true) {
385 auto ptr = *(const uint32_t**)ctx + x; 403 auto ptr = *(const uint32_t**)ctx + x;
386 404
387 auto px = load<kIsTail>(tail, ptr); 405 auto px = load<kIsTail>(tail, ptr);
388 auto to_int = [](const SkNx<N, uint32_t>& v) { return SkNi::Load(&v); }; 406 auto to_int = [](const SkNx<N, uint32_t>& v) { return SkNi::Load(&v); };
389 dr = sk_linear_from_srgb_math(to_int((px >> SK_R32_SHIFT) & 0xff)); 407 dr = sk_linear_from_srgb_math(to_int((px >> SK_R32_SHIFT) & 0xff));
390 dg = sk_linear_from_srgb_math(to_int((px >> SK_G32_SHIFT) & 0xff)); 408 dg = sk_linear_from_srgb_math(to_int((px >> SK_G32_SHIFT) & 0xff));
391 db = sk_linear_from_srgb_math(to_int((px >> SK_B32_SHIFT) & 0xff)); 409 db = sk_linear_from_srgb_math(to_int((px >> SK_B32_SHIFT) & 0xff));
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 } 559 }
542 560
543 } // namespace SK_OPTS_NS 561 } // namespace SK_OPTS_NS
544 562
545 #undef SI 563 #undef SI
546 #undef STAGE 564 #undef STAGE
547 #undef RGBA_XFERMODE 565 #undef RGBA_XFERMODE
548 #undef RGB_XFERMODE 566 #undef RGB_XFERMODE
549 567
550 #endif//SkRasterPipeline_opts_DEFINED 568 #endif//SkRasterPipeline_opts_DEFINED
OLDNEW
« no previous file with comments | « src/opts/SkNx_sse.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698