| Index: src/gpu/gl/GrGLGpu.cpp
|
| diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
|
| index 76cb1a068a2bc3dee7ae2df28bc167d1eda2aad9..21adb4abdad98816b94212d8c87653b33c5a8bbe 100644
|
| --- a/src/gpu/gl/GrGLGpu.cpp
|
| +++ b/src/gpu/gl/GrGLGpu.cpp
|
| @@ -582,6 +582,26 @@ GrTexture* GrGLGpu::onWrapBackendTexture(const GrBackendTextureDesc& desc,
|
| if (!this->glCaps().rectangleTextureSupport()) {
|
| return nullptr;
|
| }
|
| + } else if (GR_GL_TEXTURE_BUFFER == idDesc.fInfo.fTarget) {
|
| + if (!this->glCaps().glslCaps()->bufferTextureSupport()) {
|
| + SkDEBUGFAIL("Buffer textures are not supported.");
|
| + return nullptr;
|
| + }
|
| + if (renderTarget) {
|
| + SkDEBUGFAIL("Rendering to a buffer texture is not supported.");
|
| + return nullptr;
|
| + }
|
| + if (0 != desc.fHeight) {
|
| + // This texture is just a 1-dimensional window into a buffer object. It has no height
|
| + // and its GPU memory size is effectively zero, because the actual memory is attributed
|
| + // to the buffer object itself.
|
| + SkDEBUGFAIL("Buffer textures must have a height of 0.");
|
| + return nullptr;
|
| + }
|
| + if (0 != desc.fSampleCnt) {
|
| + SkDEBUGFAIL("Multisampled buffer textures are not supported.");
|
| + return nullptr;
|
| + }
|
| } else if (GR_GL_TEXTURE_2D != idDesc.fInfo.fTarget) {
|
| return nullptr;
|
| }
|
| @@ -2102,8 +2122,12 @@ bool GrGLGpu::flushGLState(const GrPipeline& pipeline, const GrPrimitiveProcesso
|
|
|
| int numTextureAccesses = textureAccesses.count();
|
| for (int i = 0; i < numTextureAccesses; i++) {
|
| - this->bindTexture(i, textureAccesses[i]->getParams(),
|
| - static_cast<GrGLTexture*>(textureAccesses[i]->getTexture()));
|
| + GrGLTexture* texture = static_cast<GrGLTexture*>(textureAccesses[i]->getTexture());
|
| + if (!texture->supportsTextureParams()) {
|
| + this->bindTexture(i, texture);
|
| + } else {
|
| + this->flushTexture(i, textureAccesses[i]->getParams(), texture);
|
| + }
|
| }
|
|
|
| GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(pipeline.getRenderTarget());
|
| @@ -3271,6 +3295,24 @@ void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo, const GrSw
|
| }
|
| }
|
|
|
| +void GrGLGpu::bindTexture(int unitIdx, GrGLTexture* texture) {
|
| + SkASSERT(texture);
|
| +
|
| + // If we created a rt/tex and rendered to it without using a texture and now we're texturing
|
| + // from the rt it will still be the last bound texture, but it needs resolving. So keep this
|
| + // out of the "last != next" check.
|
| + GrGLRenderTarget* texRT = static_cast<GrGLRenderTarget*>(texture->asRenderTarget());
|
| + if (texRT) {
|
| + this->onResolveRenderTarget(texRT);
|
| + }
|
| +
|
| + if (fHWBoundTextureUniqueIDs[unitIdx] != texture->getUniqueID()) {
|
| + this->setTextureUnit(unitIdx);
|
| + GL_CALL(BindTexture(texture->target(), texture->textureID()));
|
| + fHWBoundTextureUniqueIDs[unitIdx] = texture->getUniqueID();
|
| + }
|
| +}
|
| +
|
| static inline GrGLenum tile_to_gl_wrap(SkShader::TileMode tm) {
|
| static const GrGLenum gWrapModes[] = {
|
| GR_GL_CLAMP_TO_EDGE,
|
| @@ -3311,8 +3353,8 @@ static void get_tex_param_swizzle(GrPixelConfig config,
|
| }
|
| }
|
|
|
| -void GrGLGpu::bindTexture(int unitIdx, const GrTextureParams& params, GrGLTexture* texture) {
|
| - SkASSERT(texture);
|
| +void GrGLGpu::flushTexture(int unitIdx, const GrTextureParams& params, GrGLTexture* texture) {
|
| + this->bindTexture(unitIdx, texture);
|
|
|
| #ifdef SK_DEBUG
|
| if (!this->caps()->npotTextureTileSupport()) {
|
| @@ -3326,22 +3368,6 @@ void GrGLGpu::bindTexture(int unitIdx, const GrTextureParams& params, GrGLTextur
|
| }
|
| #endif
|
|
|
| - // If we created a rt/tex and rendered to it without using a texture and now we're texturing
|
| - // from the rt it will still be the last bound texture, but it needs resolving. So keep this
|
| - // out of the "last != next" check.
|
| - GrGLRenderTarget* texRT = static_cast<GrGLRenderTarget*>(texture->asRenderTarget());
|
| - if (texRT) {
|
| - this->onResolveRenderTarget(texRT);
|
| - }
|
| -
|
| - uint32_t textureID = texture->getUniqueID();
|
| - GrGLenum target = texture->target();
|
| - if (fHWBoundTextureUniqueIDs[unitIdx] != textureID) {
|
| - this->setTextureUnit(unitIdx);
|
| - GL_CALL(BindTexture(target, texture->textureID()));
|
| - fHWBoundTextureUniqueIDs[unitIdx] = textureID;
|
| - }
|
| -
|
| ResetTimestamp timestamp;
|
| const GrGLTexture::TexParams& oldTexParams = texture->getCachedTexParams(×tamp);
|
| bool setAll = timestamp < this->getResetTimestamp();
|
| @@ -3357,7 +3383,9 @@ void GrGLGpu::bindTexture(int unitIdx, const GrTextureParams& params, GrGLTextur
|
| GR_GL_LINEAR,
|
| GR_GL_LINEAR
|
| };
|
| +
|
| GrTextureParams::FilterMode filterMode = params.filterMode();
|
| + GrGLenum target = texture->target();
|
|
|
| if (GrTextureParams::kMipMap_FilterMode == filterMode) {
|
| if (!this->caps()->mipMapSupport() || GrPixelConfigIsCompressed(texture->config())) {
|
| @@ -3798,7 +3826,7 @@ void GrGLGpu::createCopyPrograms() {
|
| " %s = %s(u_texture, v_texCoord);"
|
| "}",
|
| fsOutName,
|
| - GrGLSLTexture2DFunctionName(kVec2f_GrSLType, kSamplerTypes[i], this->glslGeneration())
|
| + GrGLSLTextureFunctionName(kVec2f_GrSLType, kSamplerTypes[i], this->glslGeneration())
|
| );
|
|
|
| GL_CALL_RET(fCopyPrograms[i].fProgram, CreateProgram());
|
| @@ -4014,7 +4042,7 @@ void GrGLGpu::copySurfaceAsDraw(GrSurface* dst,
|
|
|
| GrGLTexture* srcTex = static_cast<GrGLTexture*>(src->asTexture());
|
| GrTextureParams params(SkShader::kClamp_TileMode, GrTextureParams::kNone_FilterMode);
|
| - this->bindTexture(0, params, srcTex);
|
| + this->flushTexture(0, params, srcTex);
|
|
|
| GrGLIRect dstVP;
|
| this->bindSurfaceFBOForCopy(dst, GR_GL_FRAMEBUFFER, &dstVP, kDst_TempFBOTarget);
|
|
|