• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 //
9 //
10 //
11 
12 #include "SkSurface_Compute.h"
13 #include "SkDevice_Compute.h"
14 #include "SkImage_Compute.h"
15 
16 //
17 //
18 //
19 
20 #if SK_SUPPORT_GPU_COMPUTE
21 
22 //
23 // C++
24 //
25 
26 #include "gl/GrGLGpu.h"
27 #include "SkSurface_Gpu.h"
28 
29 //
30 //
31 //
32 
SkSurface_Compute(sk_sp<SkContext_Compute> compute,int const width,int const height)33 SkSurface_Compute::SkSurface_Compute(sk_sp<SkContext_Compute> compute,
34                                      int const width, int const height)
35   : INHERITED(width,height,nullptr),
36     compute(compute)
37 {
38   //
39   // resize interop
40   //
41   // skc_interop_size_set(compute->interop,width,height,NULL); TODO skc.h
42 }
43 
~SkSurface_Compute()44 SkSurface_Compute::~SkSurface_Compute()
45 {
46   ;
47 }
48 
49 //
50 //
51 //
52 
53 SkCanvas*
onNewCanvas()54 SkSurface_Compute::onNewCanvas()
55 {
56   uint32_t w = 0,h = 0;
57 
58   // skc_interop_size_get(compute->interop,&w,&h); TODO skc.h
59 
60   SkDevice_Compute * const device_compute = new SkDevice_Compute(compute,w,h);
61   SkCanvas         * const canvas         = new SkCanvas(device_compute,SkCanvas::kConservativeRasterClip_InitFlag);
62 
63   //
64   // destroy device upon surface destruction
65   //
66   device = sk_sp<SkBaseDevice>(device_compute);
67 
68   //
69   // move origin from upper left to lower left
70   //
71   SkMatrix matrix;
72 
73   matrix.setScaleTranslate(1.0f,-1.0f,0.0f,(SkScalar)h);
74 
75   canvas->setMatrix(matrix);
76 
77   return canvas;
78 }
79 
80 //
81 //
82 //
83 
84 sk_sp<SkSurface>
onNewSurface(const SkImageInfo & info)85 SkSurface_Compute::onNewSurface(const SkImageInfo& info)
86 {
87   return sk_make_sp<SkSurface_Compute>(compute,info.width(),info.height());
88 }
89 
90 //
91 //
92 //
93 
94 sk_sp<SkImage>
onNewImageSnapshot()95 SkSurface_Compute::onNewImageSnapshot()
96 {
97   uint32_t w,h;
98 
99   // skc_interop_size_get(compute->interop,&w,&h); TODO skc.h
100 
101   GrGLuint snap;
102 
103   // skc_interop_snap_create(compute->interop, TODO skc.h
104 		// 	  skc_surface_interop_surface_get(compute->surface),
105 		// 	  &snap);
106 
107   return sk_make_sp<SkImage_Compute>(compute,snap,w,h);
108 }
109 
110 //
111 //
112 //
113 
114 void
onCopyOnWrite(ContentChangeMode mode)115 SkSurface_Compute::onCopyOnWrite(ContentChangeMode mode)
116 {
117   ;
118 }
119 
120 //
121 //
122 //
123 
124 #if 0
125 
126 sk_sp<SkSurface>
127 SkSurface_Compute::MakeComputeBackedSurface(SkWindow                       * const window,
128                                             const SkWindow::AttachmentInfo &       attachmentInfo,
129                                             GrGLInterface const            * const grInterface,
130                                             GrContext                      * const grContext,
131                                             sk_sp<SkContext_Compute>               compute)
132 {
133   GrBackendRenderTargetDesc desc;
134 
135   desc.fWidth  = SkScalarRoundToInt(window->width());
136   desc.fHeight = SkScalarRoundToInt(window->height());
137 
138   if (0 == desc.fWidth || 0 == desc.fHeight) {
139     return nullptr;
140   }
141 
142   // TODO: Query the actual framebuffer for sRGB capable. However, to
143   // preserve old (fake-linear) behavior, we don't do this. Instead, rely
144   // on the flag (currently driven via 'C' mode in SampleApp).
145   //
146   // Also, we may not have real sRGB support (ANGLE, in particular), so check for
147   // that, and fall back to L32:
148   //
149   // ... and, if we're using a 10-bit/channel FB0, it doesn't do sRGB conversion on write,
150   // so pretend that it's non-sRGB 8888:
151   desc.fConfig =
152     grContext->caps()->srgbSupport() &&
153     SkImageInfoIsGammaCorrect(window->info()) &&
154     (attachmentInfo.fColorBits != 30)
155     ? kSkiaGamma8888_GrPixelConfig : kSkia8888_GrPixelConfig;
156 
157   desc.fOrigin      = kBottomLeft_GrSurfaceOrigin;
158   desc.fSampleCnt   = 0; //  attachmentInfo.fSampleCount;
159   desc.fStencilBits = 0; //  attachmentInfo.fStencilBits;
160 
161   GrGLint buffer;
162 
163   GR_GL_GetIntegerv(grInterface,GR_GL_FRAMEBUFFER_BINDING,&buffer);
164   desc.fRenderTargetHandle = buffer;
165 
166   sk_sp<SkColorSpace> colorSpace =
167     grContext->caps()->srgbSupport() && SkImageInfoIsGammaCorrect(window->info())
168     ? SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named) : nullptr;
169 
170   //
171   //
172   //
173 
174   if (!grContext) {
175     return nullptr;
176   }
177 
178   if (!SkSurface_Gpu::Valid(grContext,desc.fConfig,colorSpace.get())) {
179     return nullptr;
180   }
181 
182   return sk_make_sp<SkSurface_Compute>(compute,desc.fWidth,desc.fHeight);
183 }
184 
185 #endif
186 
187 //
188 //
189 //
190 
191 #endif
192