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

Side by Side Diff: src/gpu/GrTextureToYUVPlanes.cpp

Issue 1970743002: Switch GrTextureToYUVPlanes over to newDrawContext calls (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 7 months 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 | « no previous file | 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 #include "GrTextureToYUVPlanes.h" 8 #include "GrTextureToYUVPlanes.h"
9 #include "effects/GrSimpleTextureEffect.h" 9 #include "effects/GrSimpleTextureEffect.h"
10 #include "effects/GrYUVEffect.h" 10 #include "effects/GrYUVEffect.h"
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 paint.addColorFragmentProcessor(fp); 45 paint.addColorFragmentProcessor(fp);
46 dst->drawRect(GrClip::WideOpen(), paint, SkMatrix::I(), SkRect::MakeIWH(dstW , dstH)); 46 dst->drawRect(GrClip::WideOpen(), paint, SkMatrix::I(), SkRect::MakeIWH(dstW , dstH));
47 return true; 47 return true;
48 } 48 }
49 49
50 bool GrTextureToYUVPlanes(GrTexture* texture, const SkISize sizes[3], void* cons t planes[3], 50 bool GrTextureToYUVPlanes(GrTexture* texture, const SkISize sizes[3], void* cons t planes[3],
51 const size_t rowBytes[3], SkYUVColorSpace colorSpace) { 51 const size_t rowBytes[3], SkYUVColorSpace colorSpace) {
52 if (GrContext* context = texture->getContext()) { 52 if (GrContext* context = texture->getContext()) {
53 // Depending on the relative sizes of the y, u, and v planes we may do 1 to 3 draws/ 53 // Depending on the relative sizes of the y, u, and v planes we may do 1 to 3 draws/
54 // readbacks. 54 // readbacks.
55 SkAutoTUnref<GrTexture> yuvTex; 55 sk_sp<GrDrawContext> yuvDrawContext;
56 SkAutoTUnref<GrTexture> yTex; 56 sk_sp<GrDrawContext> yDrawContext;
57 SkAutoTUnref<GrTexture> uvTex; 57 sk_sp<GrDrawContext> uvDrawContext;
58 SkAutoTUnref<GrTexture> uTex; 58 sk_sp<GrDrawContext> uDrawContext;
59 SkAutoTUnref<GrTexture> vTex; 59 sk_sp<GrDrawContext> vDrawContext;
60 60
61 GrPixelConfig singleChannelPixelConfig; 61 GrPixelConfig singleChannelPixelConfig;
62 if (context->caps()->isConfigRenderable(kAlpha_8_GrPixelConfig, false)) { 62 if (context->caps()->isConfigRenderable(kAlpha_8_GrPixelConfig, false)) {
63 singleChannelPixelConfig = kAlpha_8_GrPixelConfig; 63 singleChannelPixelConfig = kAlpha_8_GrPixelConfig;
64 } else { 64 } else {
65 singleChannelPixelConfig = kRGBA_8888_GrPixelConfig; 65 singleChannelPixelConfig = kRGBA_8888_GrPixelConfig;
66 } 66 }
67 67
68 // We issue draw(s) to convert from RGBA to Y, U, and V. All three plane s may have different 68 // We issue draw(s) to convert from RGBA to Y, U, and V. All three plane s may have different
69 // sizes however we optimize for two other cases - all planes are the sa me (1 draw to YUV), 69 // sizes however we optimize for two other cases - all planes are the sa me (1 draw to YUV),
70 // and U and V are the same but Y differs (2 draws, one for Y, one for U V). 70 // and U and V are the same but Y differs (2 draws, one for Y, one for U V).
71 if (sizes[0] == sizes[1] && sizes[1] == sizes[2]) { 71 if (sizes[0] == sizes[1] && sizes[1] == sizes[2]) {
72 GrSurfaceDesc yuvDesc; 72 yuvDrawContext = context->newDrawContext(SkBackingFit::kApprox,
73 yuvDesc.fConfig = kRGBA_8888_GrPixelConfig; 73 sizes[0].fWidth, sizes[0].f Height,
74 yuvDesc.fFlags = kRenderTarget_GrSurfaceFlag; 74 kRGBA_8888_GrPixelConfig);
75 yuvDesc.fWidth = sizes[0].fWidth; 75 if (!yuvDrawContext) {
76 yuvDesc.fHeight = sizes[0].fHeight;
77 yuvTex.reset(context->textureProvider()->createApproxTexture(yuvDesc ));
78 if (!yuvTex) {
79 return false; 76 return false;
80 } 77 }
81 } else { 78 } else {
82 GrSurfaceDesc yDesc; 79 yDrawContext = context->newDrawContext(SkBackingFit::kApprox,
83 yDesc.fConfig = singleChannelPixelConfig; 80 sizes[0].fWidth, sizes[0].fHe ight,
84 yDesc.fFlags = kRenderTarget_GrSurfaceFlag; 81 singleChannelPixelConfig);
85 yDesc.fWidth = sizes[0].fWidth; 82 if (!yDrawContext) {
86 yDesc.fHeight = sizes[0].fHeight;
87 yTex.reset(context->textureProvider()->createApproxTexture(yDesc));
88 if (!yTex) {
89 return false; 83 return false;
90 } 84 }
91 if (sizes[1] == sizes[2]) { 85 if (sizes[1] == sizes[2]) {
92 GrSurfaceDesc uvDesc;
93 // TODO: Add support for GL_RG when available. 86 // TODO: Add support for GL_RG when available.
94 uvDesc.fConfig = kRGBA_8888_GrPixelConfig; 87 uvDrawContext = context->newDrawContext(SkBackingFit::kApprox,
95 uvDesc.fFlags = kRenderTarget_GrSurfaceFlag; 88 sizes[1].fWidth, sizes[1 ].fHeight,
96 uvDesc.fWidth = sizes[1].fWidth; 89 kRGBA_8888_GrPixelConfig );
97 uvDesc.fHeight = sizes[1].fHeight; 90 if (!uvDrawContext) {
98 uvTex.reset(context->textureProvider()->createApproxTexture(uvDe sc));
99 if (!uvTex) {
100 return false; 91 return false;
101 } 92 }
102 } else { 93 } else {
103 GrSurfaceDesc uvDesc; 94 uDrawContext = context->newDrawContext(SkBackingFit::kApprox,
104 uvDesc.fConfig = singleChannelPixelConfig; 95 sizes[1].fWidth, sizes[1] .fHeight,
105 uvDesc.fFlags = kRenderTarget_GrSurfaceFlag; 96 singleChannelPixelConfig) ;
106 uvDesc.fWidth = sizes[1].fWidth; 97 vDrawContext = context->newDrawContext(SkBackingFit::kApprox,
107 uvDesc.fHeight = sizes[1].fHeight; 98 sizes[2].fWidth, sizes[2] .fHeight,
108 uTex.reset(context->textureProvider()->createApproxTexture(uvDes c)); 99 singleChannelPixelConfig) ;
109 uvDesc.fWidth = sizes[2].fWidth; 100 if (!uDrawContext || !vDrawContext) {
110 uvDesc.fHeight = sizes[2].fHeight;
111 vTex.reset(context->textureProvider()->createApproxTexture(uvDes c));
112 if (!uTex || !vTex) {
113 return false; 101 return false;
114 } 102 }
115 } 103 }
116 } 104 }
117 105
118 // Do all the draws before any readback. 106 // Do all the draws before any readback.
119 if (yuvTex) { 107 if (yuvDrawContext) {
120 sk_sp<GrDrawContext> dc(context->drawContext(sk_ref_sp(yuvTex->asRen derTarget()))); 108 if (!convert_texture(texture, yuvDrawContext.get(),
121 if (!dc) { 109 sizes[0].fWidth, sizes[0].fHeight,
110 colorSpace, GrYUVEffect::CreateRGBToYUV)) {
122 return false; 111 return false;
123 } 112 }
124 if (!convert_texture(texture, dc.get(), sizes[0].fWidth, sizes[0].fH eight, colorSpace, 113 } else {
125 GrYUVEffect::CreateRGBToYUV)) { 114 SkASSERT(yDrawContext);
115 if (!convert_texture(texture, yDrawContext.get(),
116 sizes[0].fWidth, sizes[0].fHeight,
117 colorSpace, GrYUVEffect::CreateRGBToY)) {
126 return false; 118 return false;
127 } 119 }
128 120 if (uvDrawContext) {
129 } else { 121 if (!convert_texture(texture, uvDrawContext.get(),
130 SkASSERT(yTex); 122 sizes[1].fWidth, sizes[1].fHeight,
131 sk_sp<GrDrawContext> dc(context->drawContext(sk_ref_sp(yTex->asRende rTarget())));
132 if (!dc) {
133 return false;
134 }
135 if (!convert_texture(texture, dc.get(), sizes[0].fWidth, sizes[0].fH eight, colorSpace,
136 GrYUVEffect::CreateRGBToY)) {
137 return false;
138 }
139 if (uvTex) {
140 dc = context->drawContext(sk_ref_sp(uvTex->asRenderTarget()));
141 if (!dc) {
142 return false;
143 }
144 if (!convert_texture(texture, dc.get(), sizes[1].fWidth, sizes[1 ].fHeight,
145 colorSpace, GrYUVEffect::CreateRGBToUV)) { 123 colorSpace, GrYUVEffect::CreateRGBToUV)) {
146 return false; 124 return false;
147 } 125 }
148 } else { 126 } else {
149 SkASSERT(uTex && vTex); 127 SkASSERT(uDrawContext && vDrawContext);
150 dc = context->drawContext(sk_ref_sp(uTex->asRenderTarget())); 128 if (!convert_texture(texture, uDrawContext.get(),
151 if (!dc) { 129 sizes[1].fWidth, sizes[1].fHeight,
152 return false;
153 }
154 if (!convert_texture(texture, dc.get(), sizes[1].fWidth, sizes[1 ].fHeight,
155 colorSpace, GrYUVEffect::CreateRGBToU)) { 130 colorSpace, GrYUVEffect::CreateRGBToU)) {
156 return false; 131 return false;
157 } 132 }
158 dc = context->drawContext(sk_ref_sp(vTex->asRenderTarget())); 133 if (!convert_texture(texture, vDrawContext.get(),
159 if (!dc) { 134 sizes[2].fWidth, sizes[2].fHeight,
160 return false;
161 }
162 if (!convert_texture(texture, dc.get(), sizes[2].fWidth, sizes[2 ].fHeight,
163 colorSpace, GrYUVEffect::CreateRGBToV)) { 135 colorSpace, GrYUVEffect::CreateRGBToV)) {
164 return false; 136 return false;
165 } 137 }
166 } 138 }
167 } 139 }
168 140
169 if (yuvTex) { 141 if (yuvDrawContext) {
170 SkASSERT(sizes[0] == sizes[1] && sizes[1] == sizes[2]); 142 SkASSERT(sizes[0] == sizes[1] && sizes[1] == sizes[2]);
143 sk_sp<GrTexture> yuvTex(yuvDrawContext->asTexture());
144 if (!yuvTex) {
bsalomon 2016/05/11 14:29:52 could this be an assert? Can we say that newDrawCo
robertphillips 2016/05/11 15:06:03 Done.
145 return false;
146 }
171 SkISize yuvSize = sizes[0]; 147 SkISize yuvSize = sizes[0];
172 // We have no kRGB_888 pixel format, so readback rgba and then copy three channels. 148 // We have no kRGB_888 pixel format, so readback rgba and then copy three channels.
173 SkAutoSTMalloc<128 * 128, uint32_t> tempYUV(yuvSize.fWidth * yuvSize .fHeight); 149 SkAutoSTMalloc<128 * 128, uint32_t> tempYUV(yuvSize.fWidth * yuvSize .fHeight);
174 if (!yuvTex->readPixels(0, 0, yuvSize.fWidth, yuvSize.fHeight, 150 if (!yuvTex->readPixels(0, 0, yuvSize.fWidth, yuvSize.fHeight,
175 kRGBA_8888_GrPixelConfig, tempYUV.get(), 0)) { 151 kRGBA_8888_GrPixelConfig, tempYUV.get(), 0)) {
176 return false; 152 return false;
177 } 153 }
178 size_t yRowBytes = rowBytes[0] ? rowBytes[0] : yuvSize.fWidth; 154 size_t yRowBytes = rowBytes[0] ? rowBytes[0] : yuvSize.fWidth;
179 size_t uRowBytes = rowBytes[1] ? rowBytes[1] : yuvSize.fWidth; 155 size_t uRowBytes = rowBytes[1] ? rowBytes[1] : yuvSize.fWidth;
180 size_t vRowBytes = rowBytes[2] ? rowBytes[2] : yuvSize.fWidth; 156 size_t vRowBytes = rowBytes[2] ? rowBytes[2] : yuvSize.fWidth;
(...skipping 10 matching lines...) Expand all
191 uint8_t* yLoc = ((uint8_t*)planes[0]) + j * yRowBytes + i; 167 uint8_t* yLoc = ((uint8_t*)planes[0]) + j * yRowBytes + i;
192 uint8_t* uLoc = ((uint8_t*)planes[1]) + j * uRowBytes + i; 168 uint8_t* uLoc = ((uint8_t*)planes[1]) + j * uRowBytes + i;
193 uint8_t* vLoc = ((uint8_t*)planes[2]) + j * vRowBytes + i; 169 uint8_t* vLoc = ((uint8_t*)planes[2]) + j * vRowBytes + i;
194 *yLoc = y; 170 *yLoc = y;
195 *uLoc = u; 171 *uLoc = u;
196 *vLoc = v; 172 *vLoc = v;
197 } 173 }
198 } 174 }
199 return true; 175 return true;
200 } else { 176 } else {
201 SkASSERT(yTex); 177 SkASSERT(yDrawContext);
178 sk_sp<GrTexture> yTex(yDrawContext->asTexture());
179 if (!yTex) {
180 return false;
181 }
202 if (!yTex->readPixels(0, 0, sizes[0].fWidth, sizes[0].fHeight, 182 if (!yTex->readPixels(0, 0, sizes[0].fWidth, sizes[0].fHeight,
203 kAlpha_8_GrPixelConfig, planes[0], rowBytes[0] )) { 183 kAlpha_8_GrPixelConfig, planes[0], rowBytes[0] )) {
204 return false; 184 return false;
205 } 185 }
206 if (uvTex) { 186 if (uvDrawContext) {
207 SkASSERT(sizes[1].fWidth == sizes[2].fWidth); 187 SkASSERT(sizes[1].fWidth == sizes[2].fWidth);
188 sk_sp<GrTexture> uvTex(uvDrawContext->asTexture());
189 if (!uvTex) {
190 return false;
191 }
208 SkISize uvSize = sizes[1]; 192 SkISize uvSize = sizes[1];
209 // We have no kRG_88 pixel format, so readback rgba and then cop y two channels. 193 // We have no kRG_88 pixel format, so readback rgba and then cop y two channels.
210 SkAutoSTMalloc<128 * 128, uint32_t> tempUV(uvSize.fWidth * uvSiz e.fHeight); 194 SkAutoSTMalloc<128 * 128, uint32_t> tempUV(uvSize.fWidth * uvSiz e.fHeight);
211 if (!uvTex->readPixels(0, 0, uvSize.fWidth, uvSize.fHeight, 195 if (!uvTex->readPixels(0, 0, uvSize.fWidth, uvSize.fHeight,
212 kRGBA_8888_GrPixelConfig, tempUV.get(), 0 )) { 196 kRGBA_8888_GrPixelConfig, tempUV.get(), 0 )) {
213 return false; 197 return false;
214 } 198 }
215 199
216 size_t uRowBytes = rowBytes[1] ? rowBytes[1] : uvSize.fWidth; 200 size_t uRowBytes = rowBytes[1] ? rowBytes[1] : uvSize.fWidth;
217 size_t vRowBytes = rowBytes[2] ? rowBytes[2] : uvSize.fWidth; 201 size_t vRowBytes = rowBytes[2] ? rowBytes[2] : uvSize.fWidth;
218 if (uRowBytes < (size_t)uvSize.fWidth || vRowBytes < (size_t)uvS ize.fWidth) { 202 if (uRowBytes < (size_t)uvSize.fWidth || vRowBytes < (size_t)uvS ize.fWidth) {
219 return false; 203 return false;
220 } 204 }
221 for (int j = 0; j < uvSize.fHeight; ++j) { 205 for (int j = 0; j < uvSize.fHeight; ++j) {
222 for (int i = 0; i < uvSize.fWidth; ++i) { 206 for (int i = 0; i < uvSize.fWidth; ++i) {
223 // These writes could surely be made more efficient. 207 // These writes could surely be made more efficient.
224 uint32_t u = GrColorUnpackR(tempUV.get()[j * uvSize.fWid th + i]); 208 uint32_t u = GrColorUnpackR(tempUV.get()[j * uvSize.fWid th + i]);
225 uint32_t v = GrColorUnpackG(tempUV.get()[j * uvSize.fWid th + i]); 209 uint32_t v = GrColorUnpackG(tempUV.get()[j * uvSize.fWid th + i]);
226 uint8_t* uLoc = ((uint8_t*)planes[1]) + j * uRowBytes + i; 210 uint8_t* uLoc = ((uint8_t*)planes[1]) + j * uRowBytes + i;
227 uint8_t* vLoc = ((uint8_t*)planes[2]) + j * vRowBytes + i; 211 uint8_t* vLoc = ((uint8_t*)planes[2]) + j * vRowBytes + i;
228 *uLoc = u; 212 *uLoc = u;
229 *vLoc = v; 213 *vLoc = v;
230 } 214 }
231 } 215 }
232 return true; 216 return true;
233 } else { 217 } else {
234 SkASSERT(uTex && vTex); 218 SkASSERT(uDrawContext && vDrawContext);
235 if (!uTex->readPixels(0, 0, sizes[1].fWidth, sizes[1].fHeight, 219 sk_sp<GrTexture> tex(uDrawContext->asTexture());
236 kAlpha_8_GrPixelConfig, planes[1], rowByte s[1])) { 220 if (!tex) {
237 return false; 221 return false;
238 } 222 }
239 if (!vTex->readPixels(0, 0, sizes[2].fWidth, sizes[2].fHeight, 223 if (!tex->readPixels(0, 0, sizes[1].fWidth, sizes[1].fHeight,
240 kAlpha_8_GrPixelConfig, planes[2], rowByte s[2])) { 224 kAlpha_8_GrPixelConfig, planes[1], rowBytes [1])) {
225 return false;
226 }
227 tex = vDrawContext->asTexture();
228 if (!tex) {
229 return false;
230 }
231 if (!tex->readPixels(0, 0, sizes[2].fWidth, sizes[2].fHeight,
232 kAlpha_8_GrPixelConfig, planes[2], rowBytes [2])) {
241 return false; 233 return false;
242 } 234 }
243 return true; 235 return true;
244 } 236 }
245 } 237 }
246 } 238 }
247 return false; 239 return false;
248 } 240 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698