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

Side by Side Diff: src/gpu/gl/GrGLAssembleInterface.cpp

Issue 437473002: Wrap NV_path_rendering API with GrGLPathRendering (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix builds more Created 6 years, 4 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 | « include/gpu/gl/GrGLInterface.h ('k') | src/gpu/gl/GrGLInterface.cpp » ('j') | 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 /* 2 /*
3 * Copyright 2014 Google Inc. 3 * Copyright 2014 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "GrGLAssembleInterface.h" 10 #include "GrGLAssembleInterface.h"
11 #include "GrGLUtil.h" 11 #include "GrGLUtil.h"
12 12
13 #define GET_PROC(F) functions->f ## F = (GrGL ## F ## Proc) get(ctx, "gl" #F) 13 #define GET_PROC(F) functions->f ## F = (GrGL ## F ## Proc) get(ctx, "gl" #F)
14 #define GET_PROC_SUFFIX(F, S) functions->f ## F = (GrGL ## F ## Proc) get(ctx, " gl" #F #S) 14 #define GET_PROC_SUFFIX(F, S) functions->f ## F = (GrGL ## F ## Proc) get(ctx, " gl" #F #S)
15 #define GET_PROC_LOCAL(F) GrGL ## F ## Proc F = (GrGL ## F ## Proc) get(ctx, "gl " #F) 15 #define GET_PROC_LOCAL(F) GrGL ## F ## Proc F = (GrGL ## F ## Proc) get(ctx, "gl " #F)
16 16
17 // The glStencilThenCover* methods are a new addition to NV_path_rendering. They
18 // aren't available on all drivers. In the event that they are not present, this
19 // function can be used to add methods to the given GrGLInterface that emulate
20 // them using the existing glStencil*/glCover* methods.
21 static void emulate_nvpr_stencil_then_cover(GrGLInterface*);
22
23 const GrGLInterface* GrGLAssembleGLInterface(void* ctx, GrGLGetProc get) { 17 const GrGLInterface* GrGLAssembleGLInterface(void* ctx, GrGLGetProc get) {
24 GET_PROC_LOCAL(GetString); 18 GET_PROC_LOCAL(GetString);
25 GET_PROC_LOCAL(GetStringi); 19 GET_PROC_LOCAL(GetStringi);
26 GET_PROC_LOCAL(GetIntegerv); 20 GET_PROC_LOCAL(GetIntegerv);
27 21
28 // GetStringi may be NULL depending on the GL version. 22 // GetStringi may be NULL depending on the GL version.
29 if (NULL == GetString || NULL == GetIntegerv) { 23 if (NULL == GetString || NULL == GetIntegerv) {
30 return NULL; 24 return NULL;
31 } 25 }
32 26
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 GET_PROC_SUFFIX(PathStencilFunc, NV); 232 GET_PROC_SUFFIX(PathStencilFunc, NV);
239 GET_PROC_SUFFIX(StencilFillPath, NV); 233 GET_PROC_SUFFIX(StencilFillPath, NV);
240 GET_PROC_SUFFIX(StencilStrokePath, NV); 234 GET_PROC_SUFFIX(StencilStrokePath, NV);
241 GET_PROC_SUFFIX(StencilFillPathInstanced, NV); 235 GET_PROC_SUFFIX(StencilFillPathInstanced, NV);
242 GET_PROC_SUFFIX(StencilStrokePathInstanced, NV); 236 GET_PROC_SUFFIX(StencilStrokePathInstanced, NV);
243 GET_PROC_SUFFIX(PathTexGen, NV); 237 GET_PROC_SUFFIX(PathTexGen, NV);
244 GET_PROC_SUFFIX(CoverFillPath, NV); 238 GET_PROC_SUFFIX(CoverFillPath, NV);
245 GET_PROC_SUFFIX(CoverStrokePath, NV); 239 GET_PROC_SUFFIX(CoverStrokePath, NV);
246 GET_PROC_SUFFIX(CoverFillPathInstanced, NV); 240 GET_PROC_SUFFIX(CoverFillPathInstanced, NV);
247 GET_PROC_SUFFIX(CoverStrokePathInstanced, NV); 241 GET_PROC_SUFFIX(CoverStrokePathInstanced, NV);
242 // NV_path_rendering v1.2 (These methods may not be present)
248 GET_PROC_SUFFIX(StencilThenCoverFillPath, NV); 243 GET_PROC_SUFFIX(StencilThenCoverFillPath, NV);
249 GET_PROC_SUFFIX(StencilThenCoverStrokePath, NV); 244 GET_PROC_SUFFIX(StencilThenCoverStrokePath, NV);
250 GET_PROC_SUFFIX(StencilThenCoverFillPathInstanced, NV); 245 GET_PROC_SUFFIX(StencilThenCoverFillPathInstanced, NV);
251 GET_PROC_SUFFIX(StencilThenCoverStrokePathInstanced, NV); 246 GET_PROC_SUFFIX(StencilThenCoverStrokePathInstanced, NV);
247 // NV_path_rendering v1.3 (These methods may not be present)
252 GET_PROC_SUFFIX(ProgramPathFragmentInputGen, NV); 248 GET_PROC_SUFFIX(ProgramPathFragmentInputGen, NV);
253
254 if (NULL == interface->fFunctions.fStencilThenCoverFillPath ||
255 NULL == interface->fFunctions.fStencilThenCoverStrokePath ||
256 NULL == interface->fFunctions.fStencilThenCoverFillPathInstanced ||
257 NULL == interface->fFunctions.fStencilThenCoverFillPathInstanced) {
258 emulate_nvpr_stencil_then_cover(interface);
259 }
260 } 249 }
261 250
262 if (extensions.has("GL_EXT_debug_marker")) { 251 if (extensions.has("GL_EXT_debug_marker")) {
263 GET_PROC_SUFFIX(InsertEventMarker, EXT); 252 GET_PROC_SUFFIX(InsertEventMarker, EXT);
264 GET_PROC_SUFFIX(PushGroupMarker, EXT); 253 GET_PROC_SUFFIX(PushGroupMarker, EXT);
265 GET_PROC_SUFFIX(PopGroupMarker, EXT); 254 GET_PROC_SUFFIX(PopGroupMarker, EXT);
266 } 255 }
267 256
268 if (glVer >= GR_GL_VER(4,3) || extensions.has("GL_ARB_invalidate_subdata")) { 257 if (glVer >= GR_GL_VER(4,3) || extensions.has("GL_ARB_invalidate_subdata")) {
269 GET_PROC(InvalidateBufferData); 258 GET_PROC(InvalidateBufferData);
270 GET_PROC(InvalidateBufferSubData); 259 GET_PROC(InvalidateBufferSubData);
271 GET_PROC(InvalidateFramebuffer); 260 GET_PROC(InvalidateFramebuffer);
272 GET_PROC(InvalidateSubFramebuffer); 261 GET_PROC(InvalidateSubFramebuffer);
273 GET_PROC(InvalidateTexImage); 262 GET_PROC(InvalidateTexImage);
274 GET_PROC(InvalidateTexSubImage); 263 GET_PROC(InvalidateTexSubImage);
275 } 264 }
276 265
277 if (glVer >= GR_GL_VER(4,3) || extensions.has("GL_ARB_program_interface_quer y")) { 266 if (glVer >= GR_GL_VER(4,3) || extensions.has("GL_ARB_program_interface_quer y")) {
278 GET_PROC(GetProgramResourceLocation); 267 GET_PROC(GetProgramResourceLocation);
279 } 268 }
280 269
281 interface->fStandard = kGL_GrGLStandard; 270 interface->fStandard = kGL_GrGLStandard;
282 interface->fExtensions.swap(&extensions); 271 interface->fExtensions.swap(&extensions);
283 272
284 return interface; 273 return interface;
285 } 274 }
286
287 static GrGLStencilFillPathProc gStencilFillPath;
288 static GrGLCoverFillPathProc gCoverFillPath;
289 static GrGLvoid GR_GL_FUNCTION_TYPE stencil_then_cover_fill_path(
290 GrGLuint path, GrGLenum fillMode,
291 GrGLuint mask, GrGLenum coverMode) {
292 gStencilFillPath(path, fillMode, mask);
293 gCoverFillPath(path, coverMode);
294 }
295
296
297 static GrGLStencilStrokePathProc gStencilStrokePath;
298 static GrGLCoverStrokePathProc gCoverStrokePath;
299 static GrGLvoid GR_GL_FUNCTION_TYPE stencil_then_cover_stroke_path(
300 GrGLuint path, GrGLint reference,
301 GrGLuint mask, GrGLenum coverMode) {
302 gStencilStrokePath(path, reference, mask);
303 gCoverStrokePath(path, coverMode);
304 }
305
306 static GrGLStencilFillPathInstancedProc gStencilFillPathInstanced;
307 static GrGLCoverFillPathInstancedProc gCoverFillPathInstanced;
308 static GrGLvoid GR_GL_FUNCTION_TYPE stencil_then_cover_fill_path_instanced(
309 GrGLsizei numPaths, GrGLenum pathNameTyp e,
310 const GrGLvoid *paths, GrGLuint pathBase ,
311 GrGLenum fillMode, GrGLuint mask,
312 GrGLenum coverMode, GrGLenum transformTy pe,
313 const GrGLfloat *transformValues) {
314 gStencilFillPathInstanced(numPaths, pathNameType, paths, pathBase,
315 fillMode, mask, transformType, transformValues);
316 gCoverFillPathInstanced(numPaths, pathNameType, paths, pathBase,
317 coverMode, transformType, transformValues);
318 }
319
320 static GrGLStencilStrokePathInstancedProc gStencilStrokePathInstanced;
321 static GrGLCoverStrokePathInstancedProc gCoverStrokePathInstanced;
322 static GrGLvoid GR_GL_FUNCTION_TYPE stencil_then_cover_stroke_path_instanced(
323 GrGLsizei numPaths, GrGLenum pathNameTyp e,
324 const GrGLvoid *paths, GrGLuint pathBase ,
325 GrGLint reference, GrGLuint mask,
326 GrGLenum coverMode, GrGLenum transformTy pe,
327 const GrGLfloat *transformValues) {
328 gStencilStrokePathInstanced(numPaths, pathNameType, paths, pathBase,
329 reference, mask, transformType, transformValues) ;
330 gCoverStrokePathInstanced(numPaths, pathNameType, paths, pathBase,
331 coverMode, transformType, transformValues);
332 }
333
334 static void emulate_nvpr_stencil_then_cover(GrGLInterface* interface) {
335 if (NULL == gStencilFillPath) {
336 gStencilFillPath = (GrGLStencilFillPathProc)interface->fFunctions.fStenc ilFillPath;
337 }
338 if (NULL == gCoverFillPath) {
339 gCoverFillPath = (GrGLCoverFillPathProc)interface->fFunctions.fCoverFill Path;
340 }
341 if (NULL == gStencilStrokePath) {
342 gStencilStrokePath = (GrGLStencilStrokePathProc)interface->fFunctions.fS tencilStrokePath;
343 }
344 if (NULL == gCoverStrokePath) {
345 gCoverStrokePath = (GrGLCoverStrokePathProc)interface->fFunctions.fCover StrokePath;
346 }
347 if (NULL == gStencilFillPathInstanced) {
348 gStencilFillPathInstanced = (GrGLStencilFillPathInstancedProc)
349 interface->fFunctions.fStencilFillPathInstanced;
350 }
351 if (NULL == gCoverFillPathInstanced) {
352 gCoverFillPathInstanced = (GrGLCoverFillPathInstancedProc)
353 interface->fFunctions.fCoverFillPathInstanced;
354 }
355 if (NULL == gStencilStrokePathInstanced) {
356 gStencilStrokePathInstanced = (GrGLStencilStrokePathInstancedProc)
357 interface->fFunctions.fStencilStrokePathInstanced;
358 }
359 if (NULL == gCoverStrokePathInstanced) {
360 gCoverStrokePathInstanced = (GrGLCoverStrokePathInstancedProc)
361 interface->fFunctions.fCoverStrokePathInstanced;
362 }
363
364 if (interface->fFunctions.fStencilFillPath != gStencilFillPath ||
365 interface->fFunctions.fCoverFillPath != gCoverFillPath ||
366 interface->fFunctions.fStencilStrokePath != gStencilStrokePath ||
367 interface->fFunctions.fCoverStrokePath != gCoverStrokePath ||
368 interface->fFunctions.fStencilFillPathInstanced != gStencilFillPathInsta nced ||
369 interface->fFunctions.fCoverFillPathInstanced != gCoverFillPathInstanced ||
370 interface->fFunctions.fStencilStrokePathInstanced != gStencilStrokePathI nstanced ||
371 interface->fFunctions.fCoverStrokePathInstanced != gCoverStrokePathInsta nced) {
372 // While not every windowing system requires GetProcAddress to return
373 // the same addresses in different contexts, it is guaranteed to do so
374 // in any context that supports NV_path_rendering.
375 SkFAIL("GetProcAddress returned different addresses for the same nvpr fu nctions");
376 return;
377 }
378
379 interface->fFunctions.fStencilThenCoverFillPath = &stencil_then_cover_fill_p ath;
380 interface->fFunctions.fStencilThenCoverStrokePath = &stencil_then_cover_stro ke_path;
381 interface->fFunctions.fStencilThenCoverFillPathInstanced = &stencil_then_cov er_fill_path_instanced;
382 interface->fFunctions.fStencilThenCoverStrokePathInstanced = &stencil_then_c over_stroke_path_instanced;
383 }
OLDNEW
« no previous file with comments | « include/gpu/gl/GrGLInterface.h ('k') | src/gpu/gl/GrGLInterface.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698