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

Unified Diff: cc/resources/resource_provider.cc

Issue 14409006: cc: Changes to use GL API for GpuMemoryBuffers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@glapi
Patch Set: Add internalformat parameter to CreateImageCHROMIUM in fake_web_graphics_context_3d to fix clang bu… Created 7 years, 7 months 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
« no previous file with comments | « cc/resources/resource_provider.h ('k') | cc/resources/resource_provider_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/resources/resource_provider.cc
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
index 35457f70bb16657d25d438ef4d3bd52f8a73ce46..7439b42fa101b9de5a3277dc16c2306601659a6e 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -85,6 +85,7 @@ ResourceProvider::Resource::Resource()
size(),
format(0),
filter(0),
+ image_id(0),
type(static_cast<ResourceType>(0)) {}
ResourceProvider::Resource::~Resource() {}
@@ -109,6 +110,7 @@ ResourceProvider::Resource::Resource(
size(size),
format(format),
filter(filter),
+ image_id(0),
type(GLTexture) {}
ResourceProvider::Resource::Resource(
@@ -131,6 +133,7 @@ ResourceProvider::Resource::Resource(
size(size),
format(format),
filter(filter),
+ image_id(0),
type(Bitmap) {}
ResourceProvider::Child::Child() {}
@@ -308,6 +311,12 @@ void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it,
if (style == ForShutdown && resource->exported)
lost_resource = true;
+ if (resource->image_id) {
+ WebGraphicsContext3D* context3d = output_surface_->context3d();
+ DCHECK(context3d);
+ GLC(context3d, context3d->destroyImageCHROMIUM(resource->image_id));
+ }
+
if (resource->gl_id && !resource->external) {
WebGraphicsContext3D* context3d = output_surface_->context3d();
DCHECK(context3d);
@@ -631,7 +640,8 @@ ResourceProvider::ResourceProvider(OutputSurface* output_surface)
use_texture_usage_hint_(false),
use_shallow_flush_(false),
max_texture_size_(0),
- best_texture_format_(0) {}
+ best_texture_format_(0) {
+}
bool ResourceProvider::Initialize(int highp_threshold_min) {
DCHECK(thread_checker_.CalledOnValidThread());
@@ -891,6 +901,7 @@ void ResourceProvider::AcquirePixelBuffer(ResourceId id) {
Resource* resource = &it->second;
DCHECK(!resource->external);
DCHECK(!resource->exported);
+ DCHECK(!resource->image_id);
if (resource->gl_id) {
WebGraphicsContext3D* context3d = output_surface_->context3d();
@@ -924,6 +935,7 @@ void ResourceProvider::ReleasePixelBuffer(ResourceId id) {
Resource* resource = &it->second;
DCHECK(!resource->external);
DCHECK(!resource->exported);
+ DCHECK(!resource->image_id);
if (resource->gl_id) {
if (!resource->gl_pixel_buffer_id)
@@ -956,6 +968,7 @@ uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id) {
Resource* resource = &it->second;
DCHECK(!resource->external);
DCHECK(!resource->exported);
+ DCHECK(!resource->image_id);
if (resource->gl_id) {
WebGraphicsContext3D* context3d = output_surface_->context3d();
@@ -984,6 +997,7 @@ void ResourceProvider::UnmapPixelBuffer(ResourceId id) {
Resource* resource = &it->second;
DCHECK(!resource->external);
DCHECK(!resource->exported);
+ DCHECK(!resource->image_id);
if (resource->gl_id) {
WebGraphicsContext3D* context3d = output_surface_->context3d();
@@ -992,8 +1006,7 @@ void ResourceProvider::UnmapPixelBuffer(ResourceId id) {
context3d->bindBuffer(
GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
resource->gl_pixel_buffer_id);
- context3d->unmapBufferCHROMIUM(
- GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM);
+ context3d->unmapBufferCHROMIUM(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM);
context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
}
}
@@ -1008,6 +1021,7 @@ void ResourceProvider::SetPixelsFromBuffer(ResourceId id) {
DCHECK(!resource->external);
DCHECK(!resource->exported);
DCHECK(ReadLockFenceHasPassed(resource));
+ DCHECK(!resource->image_id);
LazyAllocate(resource);
if (resource->gl_id) {
@@ -1073,6 +1087,7 @@ void ResourceProvider::BeginSetPixels(ResourceId id) {
DCHECK(!resource->pending_set_pixels);
DCHECK(resource->gl_id || resource->allocated);
DCHECK(ReadLockFenceHasPassed(resource));
+ DCHECK(!resource->image_id);
bool allocate = !resource->allocated;
resource->allocated = true;
@@ -1242,4 +1257,118 @@ void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id,
resource->enable_read_lock_fences = enable;
}
+void ResourceProvider::AcquireImage(ResourceId id) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ ResourceMap::iterator it = resources_.find(id);
+ CHECK(it != resources_.end());
+ Resource* resource = &it->second;
+
+ DCHECK(resource->gl_id);
+ DCHECK(!resource->pixels);
+ DCHECK(!resource->external);
+ DCHECK(!resource->exported);
+
+ if (resource->image_id != 0) {
+ // If we had previously allocated an image for this resource,
+ // release it before allocating a new one to prevent leaks.
+ ReleaseImage(id);
+ }
+
+ WebGraphicsContext3D* context3d = output_surface_->context3d();
+ DCHECK(context3d);
+ resource->image_id = context3d->createImageCHROMIUM(
+ resource->size.width(), resource->size.height(), GL_RGBA8_OES);
+}
+
+void ResourceProvider::ReleaseImage(ResourceId id) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ ResourceMap::iterator it = resources_.find(id);
+ CHECK(it != resources_.end());
+ Resource* resource = &it->second;
+
+ DCHECK(!resource->external);
+ DCHECK(!resource->exported);
+ DCHECK(!resource->pixels);
+
+ if (resource->image_id == 0)
+ return;
+
+ WebGraphicsContext3D* context3d = output_surface_->context3d();
+ DCHECK(context3d);
+ context3d->destroyImageCHROMIUM(resource->image_id);
+ resource->image_id = 0;
+}
+
+uint8_t* ResourceProvider::MapImage(ResourceId id) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ ResourceMap::iterator it = resources_.find(id);
+ CHECK(it != resources_.end());
+ Resource* resource = &it->second;
+
+ DCHECK(ReadLockFenceHasPassed(resource));
+ DCHECK(!resource->external);
+ DCHECK(!resource->exported);
+ DCHECK(!resource->pixels);
+ DCHECK(resource->image_id);
+
+ WebGraphicsContext3D* context3d = output_surface_->context3d();
+ DCHECK(context3d);
+ return static_cast<uint8_t*>(
+ context3d->mapImageCHROMIUM(resource->image_id, GL_READ_WRITE));
+}
+
+void ResourceProvider::UnmapImage(ResourceId id) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ ResourceMap::iterator it = resources_.find(id);
+ CHECK(it != resources_.end());
+ Resource* resource = &it->second;
+
+ DCHECK(!resource->external);
+ DCHECK(!resource->exported);
+ DCHECK(!resource->pixels);
+ DCHECK(resource->image_id);
+
+ WebGraphicsContext3D* context3d = output_surface_->context3d();
+ DCHECK(context3d);
+ context3d->unmapImageCHROMIUM(resource->image_id);
+}
+
+void ResourceProvider::BindImage(ResourceId id) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ ResourceMap::iterator it = resources_.find(id);
+ CHECK(it != resources_.end());
+ Resource* resource = &it->second;
+
+ DCHECK(!resource->external);
+ DCHECK(!resource->exported);
+ DCHECK(!resource->pixels);
+ DCHECK(resource->image_id);
+ DCHECK(resource->gl_id);
+
+ WebGraphicsContext3D* context3d = output_surface_->context3d();
+ DCHECK(context3d);
+ context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id);
+ context3d->bindTexImage2DCHROMIUM(GL_TEXTURE_2D, resource->image_id);
+}
+
+int ResourceProvider::GetImageStride(ResourceId id) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ ResourceMap::iterator it = resources_.find(id);
+ CHECK(it != resources_.end());
+ Resource* resource = &it->second;
+
+ DCHECK(!resource->external);
+ DCHECK(!resource->exported);
+ DCHECK(!resource->pixels);
+ DCHECK(resource->image_id);
+
+ WebGraphicsContext3D* context3d = output_surface_->context3d();
+ DCHECK(context3d);
+ int stride = 0;
+ context3d->getImageParameterivCHROMIUM(
+ resource->image_id, GL_IMAGE_ROWBYTES_CHROMIUM, &stride);
+ return stride;
+}
+
+
} // namespace cc
« no previous file with comments | « cc/resources/resource_provider.h ('k') | cc/resources/resource_provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698