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 | 8 |
9 #include "GrGpuGL.h" | 9 #include "GrGpuGL.h" |
10 #include "GrGLStencilBuffer.h" | 10 #include "GrGLStencilBuffer.h" |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
129 | 129 |
130 static bool gPrintStartupSpew; | 130 static bool gPrintStartupSpew; |
131 | 131 |
132 GrGpuGL::GrGpuGL(const GrGLContext& ctx, GrContext* context) | 132 GrGpuGL::GrGpuGL(const GrGLContext& ctx, GrContext* context) |
133 : GrGpu(context) | 133 : GrGpu(context) |
134 , fGLContext(ctx) { | 134 , fGLContext(ctx) { |
135 | 135 |
136 SkASSERT(ctx.isInitialized()); | 136 SkASSERT(ctx.isInitialized()); |
137 fCaps.reset(SkRef(ctx.caps())); | 137 fCaps.reset(SkRef(ctx.caps())); |
138 | 138 |
139 if (this->glCaps().pathRenderingSupport()) { | |
140 fPathRendering.reset(GrGLPathRendering::Create(glInterface())); | |
141 } | |
142 | |
139 fHWBoundTextureUniqueIDs.reset(this->glCaps().maxFragmentTextureUnits()); | 143 fHWBoundTextureUniqueIDs.reset(this->glCaps().maxFragmentTextureUnits()); |
140 fHWPathTexGenSettings.reset(this->glCaps().maxFixedFunctionTextureCoords()); | 144 if (this->glCaps().pathRenderingSupport() && |
145 !this->pathRendering()->caps().fragmentInputGenSupport) { | |
bsalomon
2014/08/07 21:02:52
Maybe we should move the hw path tex gen settings
Chris Dalton
2014/08/07 23:02:55
The original idea for GrGLPathRendering was to mir
| |
146 fHWPathTexGenSettings.reset(this->glCaps().maxFixedFunctionTextureCoords ()); | |
147 } | |
141 | 148 |
142 GrGLClearErr(fGLContext.interface()); | 149 GrGLClearErr(fGLContext.interface()); |
143 if (gPrintStartupSpew) { | 150 if (gPrintStartupSpew) { |
144 const GrGLubyte* vendor; | 151 const GrGLubyte* vendor; |
145 const GrGLubyte* renderer; | 152 const GrGLubyte* renderer; |
146 const GrGLubyte* version; | 153 const GrGLubyte* version; |
147 GL_CALL_RET(vendor, GetString(GR_GL_VENDOR)); | 154 GL_CALL_RET(vendor, GetString(GR_GL_VENDOR)); |
148 GL_CALL_RET(renderer, GetString(GR_GL_RENDERER)); | 155 GL_CALL_RET(renderer, GetString(GR_GL_RENDERER)); |
149 GL_CALL_RET(version, GetString(GR_GL_VERSION)); | 156 GL_CALL_RET(version, GetString(GR_GL_VERSION)); |
150 GrPrintf("------------------------- create GrGpuGL %p --------------\n", | 157 GrPrintf("------------------------- create GrGpuGL %p --------------\n", |
151 this); | 158 this); |
152 GrPrintf("------ VENDOR %s\n", vendor); | 159 GrPrintf("------ VENDOR %s\n", vendor); |
153 GrPrintf("------ RENDERER %s\n", renderer); | 160 GrPrintf("------ RENDERER %s\n", renderer); |
154 GrPrintf("------ VERSION %s\n", version); | 161 GrPrintf("------ VERSION %s\n", version); |
155 GrPrintf("------ EXTENSIONS\n"); | 162 GrPrintf("------ EXTENSIONS\n"); |
156 ctx.extensions().print(); | 163 ctx.extensions().print(); |
157 GrPrintf("\n"); | 164 GrPrintf("\n"); |
158 GrPrintf(this->glCaps().dump().c_str()); | 165 GrPrintf(this->glCaps().dump().c_str()); |
159 } | 166 } |
160 | 167 |
161 fProgramCache = SkNEW_ARGS(ProgramCache, (this)); | 168 fProgramCache = SkNEW_ARGS(ProgramCache, (this)); |
162 | 169 |
163 SkASSERT(this->glCaps().maxVertexAttributes() >= GrDrawState::kMaxVertexAttr ibCnt); | 170 SkASSERT(this->glCaps().maxVertexAttributes() >= GrDrawState::kMaxVertexAttr ibCnt); |
164 | 171 |
165 fLastSuccessfulStencilFmtIdx = 0; | 172 fLastSuccessfulStencilFmtIdx = 0; |
166 fHWProgramID = 0; | 173 fHWProgramID = 0; |
167 | |
168 if (this->glCaps().pathRenderingSupport()) { | |
169 fPathRendering.reset(GrGLPathRendering::Create(glInterface())); | |
170 } | |
171 } | 174 } |
172 | 175 |
173 GrGpuGL::~GrGpuGL() { | 176 GrGpuGL::~GrGpuGL() { |
174 if (0 != fHWProgramID) { | 177 if (0 != fHWProgramID) { |
175 // detach the current program so there is no confusion on OpenGL's part | 178 // detach the current program so there is no confusion on OpenGL's part |
176 // that we want it to be deleted | 179 // that we want it to be deleted |
177 SkASSERT(fHWProgramID == fCurrentProgram->programID()); | 180 SkASSERT(fHWProgramID == fCurrentProgram->programID()); |
178 GL_CALL(UseProgram(0)); | 181 GL_CALL(UseProgram(0)); |
179 } | 182 } |
180 | 183 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
322 fHWGeometryState.invalidate(); | 325 fHWGeometryState.invalidate(); |
323 } | 326 } |
324 | 327 |
325 if (resetBits & kRenderTarget_GrGLBackendState) { | 328 if (resetBits & kRenderTarget_GrGLBackendState) { |
326 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; | 329 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; |
327 } | 330 } |
328 | 331 |
329 if (resetBits & kPathRendering_GrGLBackendState) { | 332 if (resetBits & kPathRendering_GrGLBackendState) { |
330 if (this->caps()->pathRenderingSupport()) { | 333 if (this->caps()->pathRenderingSupport()) { |
331 fHWProjectionMatrixState.invalidate(); | 334 fHWProjectionMatrixState.invalidate(); |
332 // we don't use the model view matrix. | 335 // we don't use the model view matrix. |
bsalomon
2014/08/07 21:02:52
Again, I think we should move this state tracking
| |
333 GL_CALL(MatrixLoadIdentity(GR_GL_MODELVIEW)); | 336 GrGLenum matrixMode = |
337 this->glStandard() == kGLES_GrGLStandard ? GR_GL_PATH_MODELVIEW : GR_GL_MODELVIEW; | |
334 | 338 |
335 for (int i = 0; i < this->glCaps().maxFixedFunctionTextureCoords(); ++i) { | 339 GL_CALL(MatrixLoadIdentity(matrixMode)); |
336 fPathRendering->pathTexGen(GR_GL_TEXTURE0 + i, GR_GL_NONE, 0, NU LL); | 340 |
337 fHWPathTexGenSettings[i].fMode = GR_GL_NONE; | 341 if (!this->pathRendering()->caps().fragmentInputGenSupport) { |
338 fHWPathTexGenSettings[i].fNumComponents = 0; | 342 for (int i = 0; i < this->glCaps().maxFixedFunctionTextureCoords (); ++i) { |
343 fPathRendering->pathTexGen(GR_GL_TEXTURE0 + i, GR_GL_NONE, 0 , NULL); | |
344 fHWPathTexGenSettings[i].fMode = GR_GL_NONE; | |
345 fHWPathTexGenSettings[i].fNumComponents = 0; | |
346 } | |
347 fHWActivePathTexGenSets = 0; | |
339 } | 348 } |
340 fHWActivePathTexGenSets = 0; | |
341 } | 349 } |
342 fHWPathStencilSettings.invalidate(); | 350 fHWPathStencilSettings.invalidate(); |
343 } | 351 } |
344 | 352 |
345 // we assume these values | 353 // we assume these values |
346 if (resetBits & kPixelStore_GrGLBackendState) { | 354 if (resetBits & kPixelStore_GrGLBackendState) { |
347 if (this->glCaps().unpackRowLengthSupport()) { | 355 if (this->glCaps().unpackRowLengthSupport()) { |
348 GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0)); | 356 GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0)); |
349 } | 357 } |
350 if (this->glCaps().packRowLengthSupport()) { | 358 if (this->glCaps().packRowLengthSupport()) { |
(...skipping 1536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1887 GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFro nt_Face); | 1895 GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFro nt_Face); |
1888 fPathRendering->stencilFillPath(id, fillMode, writeMask); | 1896 fPathRendering->stencilFillPath(id, fillMode, writeMask); |
1889 } | 1897 } |
1890 | 1898 |
1891 void GrGpuGL::onGpuDrawPath(const GrPath* path, SkPath::FillType fill) { | 1899 void GrGpuGL::onGpuDrawPath(const GrPath* path, SkPath::FillType fill) { |
1892 SkASSERT(this->caps()->pathRenderingSupport()); | 1900 SkASSERT(this->caps()->pathRenderingSupport()); |
1893 | 1901 |
1894 GrGLuint id = static_cast<const GrGLPath*>(path)->pathID(); | 1902 GrGLuint id = static_cast<const GrGLPath*>(path)->pathID(); |
1895 SkASSERT(NULL != this->drawState()->getRenderTarget()); | 1903 SkASSERT(NULL != this->drawState()->getRenderTarget()); |
1896 SkASSERT(NULL != this->drawState()->getRenderTarget()->getStencilBuffer()); | 1904 SkASSERT(NULL != this->drawState()->getRenderTarget()->getStencilBuffer()); |
1897 SkASSERT(!fCurrentProgram->hasVertexShader()); | |
1898 | 1905 |
1899 flushPathStencilSettings(fill); | 1906 flushPathStencilSettings(fill); |
1900 const SkStrokeRec& stroke = path->getStroke(); | 1907 const SkStrokeRec& stroke = path->getStroke(); |
1901 | 1908 |
1902 SkPath::FillType nonInvertedFill = SkPath::ConvertToNonInverseFillType(fill) ; | 1909 SkPath::FillType nonInvertedFill = SkPath::ConvertToNonInverseFillType(fill) ; |
1903 SkASSERT(!fHWPathStencilSettings.isTwoSided()); | 1910 SkASSERT(!fHWPathStencilSettings.isTwoSided()); |
1904 GrGLenum fillMode = | 1911 GrGLenum fillMode = |
1905 gr_stencil_op_to_gl_path_rendering_fill_mode(fHWPathStencilSettings.pass Op(GrStencilSettings::kFront_Face)); | 1912 gr_stencil_op_to_gl_path_rendering_fill_mode(fHWPathStencilSettings.pass Op(GrStencilSettings::kFront_Face)); |
1906 GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFro nt_Face); | 1913 GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFro nt_Face); |
1907 | 1914 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1940 } | 1947 } |
1941 | 1948 |
1942 this->drawSimpleRect(bounds); | 1949 this->drawSimpleRect(bounds); |
1943 } | 1950 } |
1944 } | 1951 } |
1945 | 1952 |
1946 void GrGpuGL::onGpuDrawPaths(const GrPathRange* pathRange, | 1953 void GrGpuGL::onGpuDrawPaths(const GrPathRange* pathRange, |
1947 const uint32_t indices[], int count, | 1954 const uint32_t indices[], int count, |
1948 const float transforms[], PathTransformType transfo rmsType, | 1955 const float transforms[], PathTransformType transfo rmsType, |
1949 SkPath::FillType fill) { | 1956 SkPath::FillType fill) { |
1950 SkASSERT(this->caps()->pathRenderingSupport()); | 1957 SkASSERT(this->caps()->pathRenderingSupport()); |
bsalomon
2014/08/07 21:02:52
Move whole impl to path rendering class?
| |
1951 SkASSERT(NULL != this->drawState()->getRenderTarget()); | 1958 SkASSERT(NULL != this->drawState()->getRenderTarget()); |
1952 SkASSERT(NULL != this->drawState()->getRenderTarget()->getStencilBuffer()); | 1959 SkASSERT(NULL != this->drawState()->getRenderTarget()->getStencilBuffer()); |
1953 SkASSERT(!fCurrentProgram->hasVertexShader()); | |
1954 | 1960 |
1955 GrGLuint baseID = static_cast<const GrGLPathRange*>(pathRange)->basePathID() ; | 1961 GrGLuint baseID = static_cast<const GrGLPathRange*>(pathRange)->basePathID() ; |
1956 | 1962 |
1957 flushPathStencilSettings(fill); | 1963 flushPathStencilSettings(fill); |
1958 const SkStrokeRec& stroke = pathRange->getStroke(); | 1964 const SkStrokeRec& stroke = pathRange->getStroke(); |
1959 | 1965 |
1960 SkPath::FillType nonInvertedFill = | 1966 SkPath::FillType nonInvertedFill = |
1961 SkPath::ConvertToNonInverseFillType(fill); | 1967 SkPath::ConvertToNonInverseFillType(fill); |
1962 | 1968 |
1963 SkASSERT(!fHWPathStencilSettings.isTwoSided()); | 1969 SkASSERT(!fHWPathStencilSettings.isTwoSided()); |
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2379 matrix.cheapEqualTo(fHWProjectionMatrixState.fViewMatrix)) { | 2385 matrix.cheapEqualTo(fHWProjectionMatrixState.fViewMatrix)) { |
2380 return; | 2386 return; |
2381 } | 2387 } |
2382 | 2388 |
2383 fHWProjectionMatrixState.fViewMatrix = matrix; | 2389 fHWProjectionMatrixState.fViewMatrix = matrix; |
2384 fHWProjectionMatrixState.fRenderTargetSize = renderTargetSize; | 2390 fHWProjectionMatrixState.fRenderTargetSize = renderTargetSize; |
2385 fHWProjectionMatrixState.fRenderTargetOrigin = renderTargetOrigin; | 2391 fHWProjectionMatrixState.fRenderTargetOrigin = renderTargetOrigin; |
2386 | 2392 |
2387 GrGLfloat glMatrix[4 * 4]; | 2393 GrGLfloat glMatrix[4 * 4]; |
2388 fHWProjectionMatrixState.getRTAdjustedGLMatrix<4>(glMatrix); | 2394 fHWProjectionMatrixState.getRTAdjustedGLMatrix<4>(glMatrix); |
2389 GL_CALL(MatrixLoadf(GR_GL_PROJECTION, glMatrix)); | 2395 |
2396 GrGLenum matrixMode = | |
bsalomon
2014/08/07 21:02:52
Move to PR class?
| |
2397 this->glStandard() == kGLES_GrGLStandard ? GR_GL_PATH_PROJECTION : GR_GL _PROJECTION; | |
2398 | |
2399 GL_CALL(MatrixLoadf(matrixMode, glMatrix)); | |
2390 } | 2400 } |
2391 | 2401 |
2392 void GrGpuGL::enablePathTexGen(int unitIdx, | 2402 void GrGpuGL::enablePathTexGen(int unitIdx, |
2393 PathTexGenComponents components, | 2403 PathTexGenComponents components, |
2394 const GrGLfloat* coefficients) { | 2404 const GrGLfloat* coefficients) { |
2395 SkASSERT(this->glCaps().pathRenderingSupport()); | 2405 SkASSERT(this->glCaps().pathRenderingSupport()); |
2396 SkASSERT(components >= kS_PathTexGenComponents && | 2406 SkASSERT(components >= kS_PathTexGenComponents && |
2397 components <= kSTR_PathTexGenComponents); | 2407 components <= kSTR_PathTexGenComponents); |
2398 SkASSERT(this->glCaps().maxFixedFunctionTextureCoords() >= unitIdx); | 2408 SkASSERT(this->glCaps().maxFixedFunctionTextureCoords() >= unitIdx); |
2399 | 2409 |
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2967 this->setVertexArrayID(gpu, 0); | 2977 this->setVertexArrayID(gpu, 0); |
2968 } | 2978 } |
2969 int attrCount = gpu->glCaps().maxVertexAttributes(); | 2979 int attrCount = gpu->glCaps().maxVertexAttributes(); |
2970 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 2980 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
2971 fDefaultVertexArrayAttribState.resize(attrCount); | 2981 fDefaultVertexArrayAttribState.resize(attrCount); |
2972 } | 2982 } |
2973 attribState = &fDefaultVertexArrayAttribState; | 2983 attribState = &fDefaultVertexArrayAttribState; |
2974 } | 2984 } |
2975 return attribState; | 2985 return attribState; |
2976 } | 2986 } |
OLD | NEW |