| Index: src/gpu/GrGpu.cpp
 | 
| diff --git a/src/gpu/GrGpu.cpp b/src/gpu/GrGpu.cpp
 | 
| index efd687d6a858923db669e28984f69c5e3e51ef49..4e0464a4ce6cb74f0e2c734b5fef8b1f3685e391 100644
 | 
| --- a/src/gpu/GrGpu.cpp
 | 
| +++ b/src/gpu/GrGpu.cpp
 | 
| @@ -98,7 +98,7 @@
 | 
|   * @param isRT Indicates if the texture can be a render target.
 | 
|   */
 | 
|  static bool check_texture_creation_params(const GrCaps& caps, const GrSurfaceDesc& desc,
 | 
| -                                          bool* isRT, const SkTArray<GrMipLevel>& texels) {
 | 
| +                                          bool* isRT) {
 | 
|      if (!caps.isConfigTexturable(desc.fConfig)) {
 | 
|          return false;
 | 
|      }
 | 
| @@ -124,12 +124,6 @@
 | 
|              return false;
 | 
|          }
 | 
|      }
 | 
| -
 | 
| -    for (int i = 0; i < texels.count(); ++i) {
 | 
| -        if (!texels[i].fPixels) {
 | 
| -            return false;
 | 
| -        }
 | 
| -    }
 | 
|      return true;
 | 
|  }
 | 
|  
 | 
| @@ -139,7 +133,7 @@
 | 
|  
 | 
|      const GrCaps* caps = this->caps();
 | 
|      bool isRT = false;
 | 
| -    bool textureCreationParamsValid = check_texture_creation_params(*caps, desc, &isRT, texels);
 | 
| +    bool textureCreationParamsValid = check_texture_creation_params(*caps, desc, &isRT);
 | 
|      if (!textureCreationParamsValid) {
 | 
|          return nullptr;
 | 
|      }
 | 
| @@ -183,6 +177,17 @@
 | 
|          }
 | 
|      }
 | 
|      return tex;
 | 
| +}
 | 
| +
 | 
| +GrTexture* GrGpu::createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted,
 | 
| +                                const void* srcData, size_t rowBytes) {
 | 
| +    GrMipLevel level;
 | 
| +    level.fPixels = srcData;
 | 
| +    level.fRowBytes = rowBytes;
 | 
| +    SkSTArray<1, GrMipLevel> levels;
 | 
| +    levels.push_back(level);
 | 
| +
 | 
| +    return this->createTexture(desc, budgeted, levels);
 | 
|  }
 | 
|  
 | 
|  GrTexture* GrGpu::wrapBackendTexture(const GrBackendTextureDesc& desc, GrWrapOwnership ownership) {
 | 
| @@ -386,10 +391,15 @@
 | 
|      if (!surface) {
 | 
|          return false;
 | 
|      }
 | 
| +    bool validMipDataFound = false;
 | 
|      for (int currentMipLevel = 0; currentMipLevel < texels.count(); currentMipLevel++) {
 | 
| -        if (!texels[currentMipLevel].fPixels ) {
 | 
| -            return false;
 | 
| -        }
 | 
| +        if (texels[currentMipLevel].fPixels != nullptr) {
 | 
| +            validMipDataFound = true;
 | 
| +            break;
 | 
| +        }
 | 
| +    }
 | 
| +    if (!validMipDataFound) {
 | 
| +        return false;
 | 
|      }
 | 
|  
 | 
|      this->handleDirtyContext();
 | 
| 
 |