| Index: cc/resources/resource_provider.cc
|
| diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
|
| index 9779a546958441a5af186e05e316b4dcc795e1bd..850e02a5b49cbff10cc418cbe965d4d1d89631e0 100644
|
| --- a/cc/resources/resource_provider.cc
|
| +++ b/cc/resources/resource_provider.cc
|
| @@ -54,21 +54,6 @@ bool IsTextureFormatSupportedForStorage(GLenum format) {
|
| return (format == GL_RGBA || format == GL_BGRA_EXT);
|
| }
|
|
|
| -unsigned CreateTextureId(WebGraphicsContext3D* context3d) {
|
| - unsigned texture_id = 0;
|
| - GLC(context3d, texture_id = context3d->createTexture());
|
| - GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, texture_id));
|
| - GLC(context3d, context3d->texParameteri(
|
| - GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
|
| - GLC(context3d, context3d->texParameteri(
|
| - GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
|
| - GLC(context3d, context3d->texParameteri(
|
| - GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
|
| - GLC(context3d, context3d->texParameteri(
|
| - GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
|
| - return texture_id;
|
| -}
|
| -
|
| } // namespace
|
|
|
| ResourceProvider::Resource::Resource()
|
| @@ -93,6 +78,7 @@ ResourceProvider::Resource::Resource()
|
| filter(0),
|
| image_id(0),
|
| texture_pool(0),
|
| + wrap_mode(0),
|
| hint(TextureUsageAny),
|
| type(static_cast<ResourceType>(0)) {}
|
|
|
| @@ -104,6 +90,7 @@ ResourceProvider::Resource::Resource(
|
| GLenum format,
|
| GLenum filter,
|
| GLenum texture_pool,
|
| + GLint wrap_mode,
|
| TextureUsageHint hint)
|
| : gl_id(texture_id),
|
| gl_pixel_buffer_id(0),
|
| @@ -126,11 +113,18 @@ ResourceProvider::Resource::Resource(
|
| filter(filter),
|
| image_id(0),
|
| texture_pool(texture_pool),
|
| + wrap_mode(wrap_mode),
|
| hint(hint),
|
| - type(GLTexture) {}
|
| + type(GLTexture) {
|
| + DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT);
|
| +}
|
|
|
| ResourceProvider::Resource::Resource(
|
| - uint8_t* pixels, gfx::Size size, GLenum format, GLenum filter)
|
| + uint8_t* pixels,
|
| + gfx::Size size,
|
| + GLenum format,
|
| + GLenum filter,
|
| + GLint wrap_mode)
|
| : gl_id(0),
|
| gl_pixel_buffer_id(0),
|
| gl_upload_query_id(0),
|
| @@ -152,8 +146,11 @@ ResourceProvider::Resource::Resource(
|
| filter(filter),
|
| image_id(0),
|
| texture_pool(0),
|
| + wrap_mode(wrap_mode),
|
| hint(TextureUsageAny),
|
| - type(Bitmap) {}
|
| + type(Bitmap) {
|
| + DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT);
|
| +}
|
|
|
| ResourceProvider::Child::Child() {}
|
|
|
| @@ -193,13 +190,16 @@ bool ResourceProvider::InUseByConsumer(ResourceId id) {
|
| }
|
|
|
| ResourceProvider::ResourceId ResourceProvider::CreateResource(
|
| - gfx::Size size, GLenum format, TextureUsageHint hint) {
|
| + gfx::Size size, GLenum format, GLint wrap_mode, TextureUsageHint hint) {
|
| DCHECK(!size.IsEmpty());
|
| switch (default_resource_type_) {
|
| case GLTexture:
|
| - return CreateGLTexture(
|
| - size, format, GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, hint);
|
| + return CreateGLTexture(size, format, GL_TEXTURE_POOL_UNMANAGED_CHROMIUM,
|
| + wrap_mode, hint);
|
| case Bitmap:
|
| + // The only wrap_mode currently implemented in software mode is
|
| + // GL_CLAMP_TO_EDGE.
|
| + // http://crbug.com/284796
|
| DCHECK(format == GL_RGBA);
|
| return CreateBitmap(size);
|
| case InvalidType:
|
| @@ -211,12 +211,12 @@ ResourceProvider::ResourceId ResourceProvider::CreateResource(
|
| }
|
|
|
| ResourceProvider::ResourceId ResourceProvider::CreateManagedResource(
|
| - gfx::Size size, GLenum format, TextureUsageHint hint) {
|
| + gfx::Size size, GLenum format, GLint wrap_mode, TextureUsageHint hint) {
|
| DCHECK(!size.IsEmpty());
|
| switch (default_resource_type_) {
|
| case GLTexture:
|
| - return CreateGLTexture(
|
| - size, format, GL_TEXTURE_POOL_MANAGED_CHROMIUM, hint);
|
| + return CreateGLTexture(size, format, GL_TEXTURE_POOL_MANAGED_CHROMIUM,
|
| + wrap_mode, hint);
|
| case Bitmap:
|
| DCHECK(format == GL_RGBA);
|
| return CreateBitmap(size);
|
| @@ -229,13 +229,17 @@ ResourceProvider::ResourceId ResourceProvider::CreateManagedResource(
|
| }
|
|
|
| ResourceProvider::ResourceId ResourceProvider::CreateGLTexture(
|
| - gfx::Size size, GLenum format, GLenum texture_pool, TextureUsageHint hint) {
|
| + gfx::Size size,
|
| + GLenum format,
|
| + GLenum texture_pool,
|
| + GLint wrap_mode,
|
| + TextureUsageHint hint) {
|
| DCHECK_LE(size.width(), max_texture_size_);
|
| DCHECK_LE(size.height(), max_texture_size_);
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| ResourceId id = next_id_++;
|
| - Resource resource(0, size, format, GL_LINEAR, texture_pool, hint);
|
| + Resource resource(0, size, format, GL_LINEAR, texture_pool, wrap_mode, hint);
|
| resource.allocated = false;
|
| resources_[id] = resource;
|
| return id;
|
| @@ -247,7 +251,7 @@ ResourceProvider::ResourceId ResourceProvider::CreateBitmap(gfx::Size size) {
|
| uint8_t* pixels = new uint8_t[4 * size.GetArea()];
|
|
|
| ResourceId id = next_id_++;
|
| - Resource resource(pixels, size, GL_RGBA, GL_LINEAR);
|
| + Resource resource(pixels, size, GL_RGBA, GL_LINEAR, GL_CLAMP_TO_EDGE);
|
| resource.allocated = true;
|
| resources_[id] = resource;
|
| return id;
|
| @@ -272,7 +276,8 @@ ResourceProvider::CreateResourceFromExternalTexture(
|
| texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
|
|
|
| ResourceId id = next_id_++;
|
| - Resource resource(texture_id, gfx::Size(), 0, GL_LINEAR, 0, TextureUsageAny);
|
| + Resource resource(texture_id, gfx::Size(), 0, GL_LINEAR, 0, GL_CLAMP_TO_EDGE,
|
| + TextureUsageAny);
|
| resource.external = true;
|
| resource.allocated = true;
|
| resources_[id] = resource;
|
| @@ -287,14 +292,15 @@ ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox(
|
| DCHECK(mailbox.IsValid());
|
| Resource& resource = resources_[id];
|
| if (mailbox.IsTexture()) {
|
| - resource = Resource(0, gfx::Size(), 0, GL_LINEAR, 0, TextureUsageAny);
|
| + resource = Resource(0, gfx::Size(), 0, GL_LINEAR, 0, GL_CLAMP_TO_EDGE,
|
| + TextureUsageAny);
|
| } else {
|
| DCHECK(mailbox.IsSharedMemory());
|
| base::SharedMemory* shared_memory = mailbox.shared_memory();
|
| DCHECK(shared_memory->memory());
|
| uint8_t* pixels = reinterpret_cast<uint8_t*>(shared_memory->memory());
|
| resource = Resource(pixels, mailbox.shared_memory_size(),
|
| - GL_RGBA, GL_LINEAR);
|
| + GL_RGBA, GL_LINEAR, GL_CLAMP_TO_EDGE);
|
| }
|
| resource.external = true;
|
| resource.allocated = true;
|
| @@ -884,7 +890,8 @@ void ResourceProvider::ReceiveFromChild(
|
| it->mailbox.name));
|
| ResourceId id = next_id_++;
|
| Resource resource(
|
| - texture_id, it->size, it->format, it->filter, 0, TextureUsageAny);
|
| + texture_id, it->size, it->format, it->filter, 0, GL_CLAMP_TO_EDGE,
|
| + TextureUsageAny);
|
| resource.mailbox.SetName(it->mailbox);
|
| // Don't allocate a texture for a child.
|
| resource.allocated = true;
|
| @@ -1242,6 +1249,11 @@ void ResourceProvider::CreateForTesting(ResourceId id) {
|
| LazyCreate(GetResource(id));
|
| }
|
|
|
| +GLint ResourceProvider::WrapModeForTesting(ResourceId id) {
|
| + Resource* resource = GetResource(id);
|
| + return resource->wrap_mode;
|
| +}
|
| +
|
| void ResourceProvider::LazyCreate(Resource* resource) {
|
| if (resource->type != GLTexture || resource->gl_id != 0)
|
| return;
|
| @@ -1252,8 +1264,18 @@ void ResourceProvider::LazyCreate(Resource* resource) {
|
|
|
| WebGraphicsContext3D* context3d = Context3d();
|
| DCHECK(context3d);
|
| +
|
| // Create and set texture properties. Allocation is delayed until needed.
|
| - resource->gl_id = CreateTextureId(context3d);
|
| + GLC(context3d, resource->gl_id = context3d->createTexture());
|
| + GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id));
|
| + GLC(context3d, context3d->texParameteri(
|
| + GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
|
| + GLC(context3d, context3d->texParameteri(
|
| + GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
|
| + GLC(context3d, context3d->texParameteri(
|
| + GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, resource->wrap_mode));
|
| + GLC(context3d, context3d->texParameteri(
|
| + GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, resource->wrap_mode));
|
| GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D,
|
| GL_TEXTURE_POOL_CHROMIUM,
|
| resource->texture_pool));
|
|
|