OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 #include "SkGpuDevice.h" | 8 #include "SkGpuDevice.h" |
9 | 9 |
10 #include "GrBlurUtils.h" | 10 #include "GrBlurUtils.h" |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 default: // If it is unpremul or unknown don't try to render | 120 default: // If it is unpremul or unknown don't try to render |
121 return false; | 121 return false; |
122 } | 122 } |
123 } | 123 } |
124 if (kClear_InitContents == init) { | 124 if (kClear_InitContents == init) { |
125 *flags |= kNeedClear_Flag; | 125 *flags |= kNeedClear_Flag; |
126 } | 126 } |
127 return true; | 127 return true; |
128 } | 128 } |
129 | 129 |
130 sk_sp<SkGpuDevice> SkGpuDevice::Make(sk_sp<GrRenderTarget> rt, const SkSurfacePr
ops* props, | 130 sk_sp<SkGpuDevice> SkGpuDevice::Make(int width, int height, |
| 131 sk_sp<GrRenderTarget> rt, const SkSurfacePr
ops* props, |
131 InitContents init) { | 132 InitContents init) { |
132 if (!rt || rt->wasDestroyed() || !rt->getContext()) { | 133 if (!rt || rt->wasDestroyed() || !rt->getContext()) { |
133 return nullptr; | 134 return nullptr; |
134 } | 135 } |
135 unsigned flags; | 136 unsigned flags; |
136 if (!CheckAlphaTypeAndGetFlags(nullptr, init, &flags)) { | 137 if (!CheckAlphaTypeAndGetFlags(nullptr, init, &flags)) { |
137 return nullptr; | 138 return nullptr; |
138 } | 139 } |
139 | 140 |
140 const int width = rt->width(); | |
141 const int height = rt->height(); | |
142 | |
143 GrContext* context = rt->getContext(); | 141 GrContext* context = rt->getContext(); |
144 | 142 |
145 sk_sp<GrDrawContext> drawContext(context->drawContext(std::move(rt), props))
; | 143 sk_sp<GrDrawContext> drawContext(context->drawContext(width, height, std::mo
ve(rt), props)); |
146 return sk_sp<SkGpuDevice>(new SkGpuDevice(std::move(drawContext), width, hei
ght, flags)); | 144 return sk_sp<SkGpuDevice>(new SkGpuDevice(std::move(drawContext), flags)); |
147 } | 145 } |
148 | 146 |
149 sk_sp<SkBaseDevice> SkGpuDevice::Make(sk_sp<GrDrawContext> drawContext, | 147 sk_sp<SkBaseDevice> SkGpuDevice::Make(sk_sp<GrDrawContext> drawContext, |
150 int width, int height, | |
151 InitContents init) { | 148 InitContents init) { |
152 if (!drawContext || drawContext->wasAbandoned()) { | 149 if (!drawContext || drawContext->wasAbandoned()) { |
153 return nullptr; | 150 return nullptr; |
154 } | 151 } |
155 unsigned flags; | 152 unsigned flags; |
156 if (!CheckAlphaTypeAndGetFlags(nullptr, init, &flags)) { | 153 if (!CheckAlphaTypeAndGetFlags(nullptr, init, &flags)) { |
157 return nullptr; | 154 return nullptr; |
158 } | 155 } |
159 return sk_sp<SkBaseDevice>(new SkGpuDevice(std::move(drawContext), width, he
ight, flags)); | 156 return sk_sp<SkBaseDevice>(new SkGpuDevice(std::move(drawContext), flags)); |
160 } | 157 } |
161 | 158 |
162 sk_sp<SkGpuDevice> SkGpuDevice::Make(GrContext* context, SkBudgeted budgeted, | 159 sk_sp<SkGpuDevice> SkGpuDevice::Make(GrContext* context, SkBudgeted budgeted, |
163 const SkImageInfo& info, int sampleCount, | 160 const SkImageInfo& info, int sampleCount, |
164 const SkSurfaceProps* props, InitContents i
nit) { | 161 const SkSurfaceProps* props, InitContents i
nit) { |
165 unsigned flags; | 162 unsigned flags; |
166 if (!CheckAlphaTypeAndGetFlags(&info, init, &flags)) { | 163 if (!CheckAlphaTypeAndGetFlags(&info, init, &flags)) { |
167 return nullptr; | 164 return nullptr; |
168 } | 165 } |
169 | 166 |
170 sk_sp<GrDrawContext> drawContext(CreateDrawContext(context, budgeted, info, | 167 sk_sp<GrDrawContext> drawContext(CreateDrawContext(context, budgeted, info, |
171 sampleCount, props)); | 168 sampleCount, props)); |
172 if (!drawContext) { | 169 if (!drawContext) { |
173 return nullptr; | 170 return nullptr; |
174 } | 171 } |
175 | 172 |
176 return sk_sp<SkGpuDevice>(new SkGpuDevice(std::move(drawContext), | 173 return sk_sp<SkGpuDevice>(new SkGpuDevice(std::move(drawContext), flags)); |
177 info.width(), info.height(), flags
)); | |
178 } | 174 } |
179 | 175 |
180 SkGpuDevice::SkGpuDevice(sk_sp<GrDrawContext> drawContext, int width, int height
, unsigned flags) | 176 SkGpuDevice::SkGpuDevice(sk_sp<GrDrawContext> drawContext, unsigned flags) |
181 : INHERITED(drawContext->surfaceProps()) | 177 : INHERITED(drawContext->surfaceProps()) |
182 , fContext(SkRef(drawContext->accessRenderTarget()->getContext())) | 178 , fContext(SkRef(drawContext->accessRenderTarget()->getContext())) |
183 , fRenderTarget(drawContext->renderTarget()) | 179 , fRenderTarget(drawContext->renderTarget()) |
184 , fDrawContext(std::move(drawContext)) { | 180 , fDrawContext(std::move(drawContext)) { |
185 fOpaque = SkToBool(flags & kIsOpaque_Flag); | 181 fOpaque = SkToBool(flags & kIsOpaque_Flag); |
186 | 182 |
187 SkAlphaType at = fOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType; | 183 SkAlphaType at = fOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType; |
188 SkImageInfo info = fRenderTarget->surfacePriv().info(at).makeWH(width, heigh
t); | 184 SkImageInfo info = fRenderTarget->surfacePriv().info(at).makeWH(fDrawContext
->width(), |
| 185 fDrawContext
->height()); |
189 SkPixelRef* pr = new SkGrPixelRef(info, fRenderTarget.get()); | 186 SkPixelRef* pr = new SkGrPixelRef(info, fRenderTarget.get()); |
190 fLegacyBitmap.setInfo(info); | 187 fLegacyBitmap.setInfo(info); |
191 fLegacyBitmap.setPixelRef(pr)->unref(); | 188 fLegacyBitmap.setPixelRef(pr)->unref(); |
192 | 189 |
193 if (flags & kNeedClear_Flag) { | 190 if (flags & kNeedClear_Flag) { |
194 this->clearAll(); | 191 this->clearAll(); |
195 } | 192 } |
196 } | 193 } |
197 | 194 |
198 sk_sp<GrDrawContext> SkGpuDevice::CreateDrawContext(GrContext* context, | 195 sk_sp<GrDrawContext> SkGpuDevice::CreateDrawContext(GrContext* context, |
199 SkBudgeted budgeted, | 196 SkBudgeted budgeted, |
200 const SkImageInfo& origInfo, | 197 const SkImageInfo& origInfo, |
201 int sampleCount, | 198 int sampleCount, |
202 const SkSurfaceProps* surfac
eProps) { | 199 const SkSurfaceProps* surfac
eProps) { |
(...skipping 1676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1879 if (!dc) { | 1876 if (!dc) { |
1880 SkErrorInternals::SetError( kInternalError_SkError, | 1877 SkErrorInternals::SetError( kInternalError_SkError, |
1881 "---- failed to create gpu device texture [%
d %d]\n", | 1878 "---- failed to create gpu device texture [%
d %d]\n", |
1882 cinfo.fInfo.width(), cinfo.fInfo.height()); | 1879 cinfo.fInfo.width(), cinfo.fInfo.height()); |
1883 return nullptr; | 1880 return nullptr; |
1884 } | 1881 } |
1885 | 1882 |
1886 // Skia's convention is to only clear a device if it is non-opaque. | 1883 // Skia's convention is to only clear a device if it is non-opaque. |
1887 InitContents init = cinfo.fInfo.isOpaque() ? kUninit_InitContents : kClear_I
nitContents; | 1884 InitContents init = cinfo.fInfo.isOpaque() ? kUninit_InitContents : kClear_I
nitContents; |
1888 | 1885 |
1889 return SkGpuDevice::Make(std::move(dc), | 1886 return SkGpuDevice::Make(std::move(dc), init).release(); |
1890 cinfo.fInfo.width(), cinfo.fInfo.height(), | |
1891 init).release(); | |
1892 } | 1887 } |
1893 | 1888 |
1894 sk_sp<SkSurface> SkGpuDevice::makeSurface(const SkImageInfo& info, const SkSurfa
ceProps& props) { | 1889 sk_sp<SkSurface> SkGpuDevice::makeSurface(const SkImageInfo& info, const SkSurfa
ceProps& props) { |
1895 ASSERT_SINGLE_OWNER | 1890 ASSERT_SINGLE_OWNER |
1896 // TODO: Change the signature of newSurface to take a budgeted parameter. | 1891 // TODO: Change the signature of newSurface to take a budgeted parameter. |
1897 static const SkBudgeted kBudgeted = SkBudgeted::kNo; | 1892 static const SkBudgeted kBudgeted = SkBudgeted::kNo; |
1898 return SkSurface::MakeRenderTarget(fContext, kBudgeted, info, fDrawContext->
desc().fSampleCnt, | 1893 return SkSurface::MakeRenderTarget(fContext, kBudgeted, info, fDrawContext->
desc().fSampleCnt, |
1899 &props); | 1894 &props); |
1900 } | 1895 } |
1901 | 1896 |
1902 SkImageFilterCache* SkGpuDevice::getImageFilterCache() { | 1897 SkImageFilterCache* SkGpuDevice::getImageFilterCache() { |
1903 ASSERT_SINGLE_OWNER | 1898 ASSERT_SINGLE_OWNER |
1904 // We always return a transient cache, so it is freed after each | 1899 // We always return a transient cache, so it is freed after each |
1905 // filter traversal. | 1900 // filter traversal. |
1906 return SkImageFilterCache::Create(kDefaultImageFilterCacheSize); | 1901 return SkImageFilterCache::Create(kDefaultImageFilterCacheSize); |
1907 } | 1902 } |
1908 | 1903 |
1909 #endif | 1904 #endif |
OLD | NEW |