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

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

Issue 400713003: Add a GrPathRange class (Closed) Base URL: https://skia.googlesource.com/skia.git@clupload-ispath
Patch Set: Created 6 years, 5 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
OLDNEW
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 8
9 #include "GrGpuGL.h" 9 #include "GrGpuGL.h"
10 #include "GrGLNameAllocator.h" 10 #include "GrGLNameAllocator.h"
11 #include "GrGLStencilBuffer.h" 11 #include "GrGLStencilBuffer.h"
12 #include "GrGLPath.h" 12 #include "GrGLPath.h"
13 #include "GrGLPathRange.h"
13 #include "GrGLShaderBuilder.h" 14 #include "GrGLShaderBuilder.h"
14 #include "GrTemplates.h" 15 #include "GrTemplates.h"
15 #include "GrTypes.h" 16 #include "GrTypes.h"
16 #include "SkStrokeRec.h" 17 #include "SkStrokeRec.h"
17 #include "SkTemplates.h" 18 #include "SkTemplates.h"
18 19
19 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X) 20 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X)
20 #define GL_CALL_RET(RET, X) GR_GL_CALL_RET(this->glInterface(), RET, X) 21 #define GL_CALL_RET(RET, X) GR_GL_CALL_RET(this->glInterface(), RET, X)
21 22
22 #define SKIP_CACHE_CHECK true 23 #define SKIP_CACHE_CHECK true
23 24
24 #if GR_GL_CHECK_ALLOC_WITH_GET_ERROR 25 #if GR_GL_CHECK_ALLOC_WITH_GET_ERROR
25 #define CLEAR_ERROR_BEFORE_ALLOC(iface) GrGLClearErr(iface) 26 #define CLEAR_ERROR_BEFORE_ALLOC(iface) GrGLClearErr(iface)
26 #define GL_ALLOC_CALL(iface, call) GR_GL_CALL_NOERRCHECK(iface, call) 27 #define GL_ALLOC_CALL(iface, call) GR_GL_CALL_NOERRCHECK(iface, call)
27 #define CHECK_ALLOC_ERROR(iface) GR_GL_GET_ERROR(iface) 28 #define CHECK_ALLOC_ERROR(iface) GR_GL_GET_ERROR(iface)
28 #else 29 #else
29 #define CLEAR_ERROR_BEFORE_ALLOC(iface) 30 #define CLEAR_ERROR_BEFORE_ALLOC(iface)
30 #define GL_ALLOC_CALL(iface, call) GR_GL_CALL(iface, call) 31 #define GL_ALLOC_CALL(iface, call) GR_GL_CALL(iface, call)
31 #define CHECK_ALLOC_ERROR(iface) GR_GL_NO_ERROR 32 #define CHECK_ALLOC_ERROR(iface) GR_GL_NO_ERROR
32 #endif 33 #endif
33 34
34 35
35 /////////////////////////////////////////////////////////////////////////////// 36 ///////////////////////////////////////////////////////////////////////////////
36 37
38 static const GrGLenum gXformFormat2GLType[] = {
39 GR_GL_NONE,
40 GR_GL_TRANSLATE_X,
41 GR_GL_TRANSLATE_Y,
42 GR_GL_TRANSLATE_2D,
43 GR_GL_TRANSPOSE_AFFINE_2D
44 };
45
46 GR_STATIC_ASSERT(0 == kNone_GrTransformFormat);
47 GR_STATIC_ASSERT(1 == kTranslateX_GrTransformFormat);
48 GR_STATIC_ASSERT(2 == kTranslateY_GrTransformFormat);
49 GR_STATIC_ASSERT(3 == kTranslate_GrTransformFormat);
50 GR_STATIC_ASSERT(4 == kAffine_GrTransformFormat);
51 GR_STATIC_ASSERT(kAffine_GrTransformFormat == kLast_GrTransformFormat);
52
37 static const GrGLenum gXfermodeCoeff2Blend[] = { 53 static const GrGLenum gXfermodeCoeff2Blend[] = {
38 GR_GL_ZERO, 54 GR_GL_ZERO,
39 GR_GL_ONE, 55 GR_GL_ONE,
40 GR_GL_SRC_COLOR, 56 GR_GL_SRC_COLOR,
41 GR_GL_ONE_MINUS_SRC_COLOR, 57 GR_GL_ONE_MINUS_SRC_COLOR,
42 GR_GL_DST_COLOR, 58 GR_GL_DST_COLOR,
43 GR_GL_ONE_MINUS_DST_COLOR, 59 GR_GL_ONE_MINUS_DST_COLOR,
44 GR_GL_SRC_ALPHA, 60 GR_GL_SRC_ALPHA,
45 GR_GL_ONE_MINUS_SRC_ALPHA, 61 GR_GL_ONE_MINUS_SRC_ALPHA,
46 GR_GL_DST_ALPHA, 62 GR_GL_DST_ALPHA,
(...skipping 1308 matching lines...) Expand 10 before | Expand all | Expand 10 after
1355 } 1371 }
1356 return NULL; 1372 return NULL;
1357 } 1373 }
1358 } 1374 }
1359 1375
1360 GrPath* GrGpuGL::onCreatePath(const SkPath& inPath, const SkStrokeRec& stroke) { 1376 GrPath* GrGpuGL::onCreatePath(const SkPath& inPath, const SkStrokeRec& stroke) {
1361 SkASSERT(this->caps()->pathRenderingSupport()); 1377 SkASSERT(this->caps()->pathRenderingSupport());
1362 return SkNEW_ARGS(GrGLPath, (this, inPath, stroke)); 1378 return SkNEW_ARGS(GrGLPath, (this, inPath, stroke));
1363 } 1379 }
1364 1380
1381 GrPathRange* GrGpuGL::onCreatePathRange(size_t size, const SkStrokeRec& stroke) {
1382 SkASSERT(this->caps()->pathRenderingSupport());
1383 return SkNEW_ARGS(GrGLPathRange, (this, size, stroke));
1384 }
1385
1365 void GrGpuGL::flushScissor() { 1386 void GrGpuGL::flushScissor() {
1366 if (fScissorState.fEnabled) { 1387 if (fScissorState.fEnabled) {
1367 // Only access the RT if scissoring is being enabled. We can call this b efore performing 1388 // Only access the RT if scissoring is being enabled. We can call this b efore performing
1368 // a glBitframebuffer for a surface->surface copy, which requires no RT to be bound to the 1389 // a glBitframebuffer for a surface->surface copy, which requires no RT to be bound to the
1369 // GrDrawState. 1390 // GrDrawState.
1370 const GrDrawState& drawState = this->getDrawState(); 1391 const GrDrawState& drawState = this->getDrawState();
1371 const GrGLRenderTarget* rt = 1392 const GrGLRenderTarget* rt =
1372 static_cast<const GrGLRenderTarget*>(drawState.getRenderTarget()); 1393 static_cast<const GrGLRenderTarget*>(drawState.getRenderTarget());
1373 1394
1374 SkASSERT(NULL != rt); 1395 SkASSERT(NULL != rt);
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
1893 SkScalar bloat = drawState->getViewMatrix().getMaxScale() * SK_Scala rHalf; 1914 SkScalar bloat = drawState->getViewMatrix().getMaxScale() * SK_Scala rHalf;
1894 bounds.outset(bloat, bloat); 1915 bounds.outset(bloat, bloat);
1895 } else { 1916 } else {
1896 avmr.setIdentity(drawState); 1917 avmr.setIdentity(drawState);
1897 } 1918 }
1898 1919
1899 this->drawSimpleRect(bounds, NULL); 1920 this->drawSimpleRect(bounds, NULL);
1900 } 1921 }
1901 } 1922 }
1902 1923
1903 void GrGpuGL::onGpuDrawPaths(int pathCount, const GrPath** paths, 1924 void GrGpuGL::onGpuDrawPaths(const GrPathRange* pathRange,
1904 const SkMatrix* transforms, 1925 const uint32_t indices[], int count,
1905 SkPath::FillType fill, 1926 const float transforms[], GrTransformFormat transfo rmsFormat,
1906 SkStrokeRec::Style stroke) { 1927 SkPath::FillType fill) {
1907 SkASSERT(this->caps()->pathRenderingSupport()); 1928 SkASSERT(this->caps()->pathRenderingSupport());
1908 SkASSERT(NULL != this->drawState()->getRenderTarget()); 1929 SkASSERT(NULL != this->drawState()->getRenderTarget());
1909 SkASSERT(NULL != this->drawState()->getRenderTarget()->getStencilBuffer()); 1930 SkASSERT(NULL != this->drawState()->getRenderTarget()->getStencilBuffer());
1910 SkASSERT(!fCurrentProgram->hasVertexShader()); 1931 SkASSERT(!fCurrentProgram->hasVertexShader());
1911 SkASSERT(stroke != SkStrokeRec::kHairline_Style);
1912 1932
1913 SkAutoMalloc pathData(pathCount * sizeof(GrGLuint)); 1933 GrGLuint baseID = static_cast<const GrGLPathRange*>(pathRange)->basePathID() ;
1914 SkAutoMalloc transformData(pathCount * sizeof(GrGLfloat) * 6);
1915 GrGLfloat* transformValues =
1916 reinterpret_cast<GrGLfloat*>(transformData.get());
1917 GrGLuint* pathIDs = reinterpret_cast<GrGLuint*>(pathData.get());
1918
1919 for (int i = 0; i < pathCount; ++i) {
1920 SkASSERT(transforms[i].asAffine(NULL));
1921 const SkMatrix& m = transforms[i];
1922 transformValues[i * 6] = m.getScaleX();
1923 transformValues[i * 6 + 1] = m.getSkewY();
1924 transformValues[i * 6 + 2] = m.getSkewX();
1925 transformValues[i * 6 + 3] = m.getScaleY();
1926 transformValues[i * 6 + 4] = m.getTranslateX();
1927 transformValues[i * 6 + 5] = m.getTranslateY();
1928 pathIDs[i] = static_cast<const GrGLPath*>(paths[i])->pathID();
1929 }
1930 1934
1931 flushPathStencilSettings(fill); 1935 flushPathStencilSettings(fill);
1936 const SkStrokeRec& stroke = pathRange->getStroke();
1937 SkASSERT(!stroke.isHairlineStyle());
1932 1938
1933 SkPath::FillType nonInvertedFill = 1939 SkPath::FillType nonInvertedFill =
1934 SkPath::ConvertToNonInverseFillType(fill); 1940 SkPath::ConvertToNonInverseFillType(fill);
1935 1941
1936 SkASSERT(!fHWPathStencilSettings.isTwoSided()); 1942 SkASSERT(!fHWPathStencilSettings.isTwoSided());
1937 GrGLenum fillMode = 1943 GrGLenum fillMode =
1938 gr_stencil_op_to_gl_path_rendering_fill_mode( 1944 gr_stencil_op_to_gl_path_rendering_fill_mode(
1939 fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face)); 1945 fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face));
1940 GrGLint writeMask = 1946 GrGLint writeMask =
1941 fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face); 1947 fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face);
1942 1948
1943 bool doFill = stroke == SkStrokeRec::kFill_Style 1949 if (stroke.isFillStyle() || SkStrokeRec::kStrokeAndFill_Style == stroke.getS tyle()) {
1944 || stroke == SkStrokeRec::kStrokeAndFill_Style; 1950 GL_CALL(StencilFillPathInstanced(count, GR_GL_UNSIGNED_INT, indices, bas eID, fillMode,
1945 bool doStroke = stroke == SkStrokeRec::kStroke_Style 1951 writeMask, gXformFormat2GLType[transfor msFormat],
1946 || stroke == SkStrokeRec::kStrokeAndFill_Style; 1952 transforms));
1947
1948 if (doFill) {
1949 GL_CALL(StencilFillPathInstanced(pathCount, GR_GL_UNSIGNED_INT,
1950 pathIDs, 0,
1951 fillMode, writeMask,
1952 GR_GL_AFFINE_2D, transformValues));
1953 } 1953 }
1954 if (doStroke) { 1954 if (stroke.needToApply()) {
1955 GL_CALL(StencilStrokePathInstanced(pathCount, GR_GL_UNSIGNED_INT, 1955 GL_CALL(StencilStrokePathInstanced(count, GR_GL_UNSIGNED_INT, indices, b aseID, 0xffff,
1956 pathIDs, 0, 1956 writeMask, gXformFormat2GLType[transf ormsFormat],
1957 0xffff, writeMask, 1957 transforms));
1958 GR_GL_AFFINE_2D, transformValues));
1959 } 1958 }
1960 1959
1961 if (nonInvertedFill == fill) { 1960 if (nonInvertedFill == fill) {
1962 if (doStroke) { 1961 if (stroke.needToApply()) {
1963 GL_CALL(CoverStrokePathInstanced( 1962 GL_CALL(CoverStrokePathInstanced(
1964 pathCount, GR_GL_UNSIGNED_INT, pathIDs, 0, 1963 count, GR_GL_UNSIGNED_INT, indices, baseID,
1965 GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES, 1964 GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES,
1966 GR_GL_AFFINE_2D, transformValues)); 1965 gXformFormat2GLType[transformsFormat], transforms));
1967 } else { 1966 } else {
1968 GL_CALL(CoverFillPathInstanced( 1967 GL_CALL(CoverFillPathInstanced(
1969 pathCount, GR_GL_UNSIGNED_INT, pathIDs, 0, 1968 count, GR_GL_UNSIGNED_INT, indices, baseID,
1970 GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES, 1969 GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES,
1971 GR_GL_AFFINE_2D, transformValues)); 1970 gXformFormat2GLType[transformsFormat], transforms));
1972
1973 } 1971 }
1974 } else { 1972 } else {
1975 GrDrawState* drawState = this->drawState(); 1973 GrDrawState* drawState = this->drawState();
1976 GrDrawState::AutoViewMatrixRestore avmr; 1974 GrDrawState::AutoViewMatrixRestore avmr;
1977 SkRect bounds = SkRect::MakeLTRB(0, 0, 1975 SkRect bounds = SkRect::MakeLTRB(0, 0,
1978 SkIntToScalar(drawState->getRenderTarge t()->width()), 1976 SkIntToScalar(drawState->getRenderTarge t()->width()),
1979 SkIntToScalar(drawState->getRenderTarge t()->height())); 1977 SkIntToScalar(drawState->getRenderTarge t()->height()));
1980 SkMatrix vmi; 1978 SkMatrix vmi;
1981 // mapRect through persp matrix may not be correct 1979 // mapRect through persp matrix may not be correct
1982 if (!drawState->getViewMatrix().hasPerspective() && drawState->getViewIn verse(&vmi)) { 1980 if (!drawState->getViewMatrix().hasPerspective() && drawState->getViewIn verse(&vmi)) {
(...skipping 1035 matching lines...) Expand 10 before | Expand all | Expand 10 after
3018 this->setVertexArrayID(gpu, 0); 3016 this->setVertexArrayID(gpu, 0);
3019 } 3017 }
3020 int attrCount = gpu->glCaps().maxVertexAttributes(); 3018 int attrCount = gpu->glCaps().maxVertexAttributes();
3021 if (fDefaultVertexArrayAttribState.count() != attrCount) { 3019 if (fDefaultVertexArrayAttribState.count() != attrCount) {
3022 fDefaultVertexArrayAttribState.resize(attrCount); 3020 fDefaultVertexArrayAttribState.resize(attrCount);
3023 } 3021 }
3024 attribState = &fDefaultVertexArrayAttribState; 3022 attribState = &fDefaultVertexArrayAttribState;
3025 } 3023 }
3026 return attribState; 3024 return attribState;
3027 } 3025 }
OLDNEW
« src/gpu/GrStencilAndCoverTextContext.cpp ('K') | « src/gpu/gl/GrGpuGL.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698