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

Unified Diff: cc/resource_provider.cc

Issue 11358181: Use nearest neighbor filtering for non-translated quads (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Associate resources with min/mag filters and use NEAREST for tile quads when feasible. Created 8 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: cc/resource_provider.cc
diff --git a/cc/resource_provider.cc b/cc/resource_provider.cc
index 4269b8123185b5400c66356bc9c4b9ce30697cb6..399e7a0e7f0c34614354efbf1d94272ec875bce3 100644
--- a/cc/resource_provider.cc
+++ b/cc/resource_provider.cc
@@ -58,11 +58,13 @@ ResourceProvider::Resource::Resource()
, markedForDeletion(false)
, size()
, format(0)
+ , minFilter(0)
+ , magFilter(0)
, type(static_cast<ResourceType>(0))
{
}
-ResourceProvider::Resource::Resource(unsigned textureId, int pool, const gfx::Size& size, GLenum format)
+ResourceProvider::Resource::Resource(unsigned textureId, int pool, const gfx::Size& size, GLenum format, GLenum minFilter, GLenum magFilter)
: glId(textureId)
, pixels(0)
, pool(pool)
@@ -73,11 +75,13 @@ ResourceProvider::Resource::Resource(unsigned textureId, int pool, const gfx::Si
, markedForDeletion(false)
, size(size)
, format(format)
+ , minFilter(minFilter)
+ , magFilter(magFilter)
, type(GLTexture)
{
}
-ResourceProvider::Resource::Resource(uint8_t* pixels, int pool, const gfx::Size& size, GLenum format)
+ResourceProvider::Resource::Resource(uint8_t* pixels, int pool, const gfx::Size& size, GLenum format, GLenum minFilter, GLenum magFilter)
: glId(0)
, pixels(pixels)
, pool(pool)
@@ -88,6 +92,8 @@ ResourceProvider::Resource::Resource(uint8_t* pixels, int pool, const gfx::Size&
, markedForDeletion(false)
, size(size)
, format(format)
+ , minFilter(minFilter)
+ , magFilter(magFilter)
, type(Bitmap)
{
}
@@ -168,7 +174,7 @@ ResourceProvider::ResourceId ResourceProvider::createGLTexture(int pool, const g
GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.width(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0));
ResourceId id = m_nextId++;
- Resource resource(textureId, pool, size, format);
+ Resource resource(textureId, pool, size, format, GL_LINEAR, GL_LINEAR);
m_resources[id] = resource;
return id;
}
@@ -180,7 +186,7 @@ ResourceProvider::ResourceId ResourceProvider::createBitmap(int pool, const gfx:
uint8_t* pixels = new uint8_t[size.width() * size.height() * 4];
ResourceId id = m_nextId++;
- Resource resource(pixels, pool, size, GL_RGBA);
+ Resource resource(pixels, pool, size, GL_RGBA, GL_LINEAR, GL_LINEAR);
m_resources[id] = resource;
return id;
}
@@ -198,7 +204,7 @@ ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture
GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
ResourceId id = m_nextId++;
- Resource resource(textureId, 0, gfx::Size(), 0);
+ Resource resource(textureId, 0, gfx::Size(), 0, GL_LINEAR, GL_LINEAR);
resource.external = true;
m_resources[id] = resource;
return id;
@@ -408,6 +414,12 @@ ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL()
m_resourceProvider->unlockForRead(m_resourceId);
}
+ResourceProvider::ScopedSamplerGL::ScopedSamplerGL(ResourceProvider* resourceProvider, ResourceProvider::ResourceId resourceId, GLenum target, GLenum minFilter, GLenum magFilter)
+ : ScopedReadLockGL(resourceProvider, resourceId)
+{
+ resourceProvider->bindForSampling(resourceId, target, minFilter, magFilter);
+}
+
ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL(ResourceProvider* resourceProvider, ResourceProvider::ResourceId resourceId)
: m_resourceProvider(resourceProvider)
, m_resourceId(resourceId)
@@ -600,7 +612,7 @@ void ResourceProvider::receiveFromChild(int child, const TransferableResourceLis
GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId));
GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mailbox.name));
ResourceId id = m_nextId++;
- Resource resource(textureId, childInfo.pool, it->size, it->format);
+ Resource resource(textureId, childInfo.pool, it->size, it->format, it->minFilter, it->magFilter);
resource.mailbox.setName(it->mailbox.name);
m_resources[id] = resource;
childInfo.parentToChildMap[id] = it->id;
@@ -646,6 +658,8 @@ bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI
return false;
resource->id = id;
resource->format = source->format;
+ resource->minFilter = source->minFilter;
+ resource->magFilter = source->magFilter;
resource->size = source->size;
if (source->mailbox.isZero()) {
@@ -660,4 +674,25 @@ bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI
return true;
}
+void ResourceProvider::bindForSampling(ResourceProvider::ResourceId resourceId, GLenum target, GLenum minFilter, GLenum magFilter)
+{
+ DCHECK(m_threadChecker.CalledOnValidThread());
+ WebGraphicsContext3D* context3d = m_context->context3D();
+ ResourceMap::iterator it = m_resources.find(resourceId);
+ CHECK(it != m_resources.end());
+ Resource* resource = &it->second;
+ DCHECK(resource->lockForReadCount);
+ DCHECK(!resource->lockedForWrite);
+
+ GLC(context3d, context3d->bindTexture(target, resource->glId));
+ if (minFilter != resource->minFilter) {
+ GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MIN_FILTER, minFilter));
+ resource->minFilter = minFilter;
+ }
+ if (magFilter != resource->magFilter) {
+ GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MAG_FILTER, magFilter));
+ resource->magFilter = magFilter;
+ }
+}
+
} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698