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

Unified Diff: ui/gl/gl_image_memory.cc

Issue 1401423003: Re-land: ui: Move GLImage::BindTexImage fallback from GLImage implementations to GLES2CmdDecoder. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix stream texture issue Created 5 years, 2 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 | « ui/gl/gl_image_memory.h ('k') | ui/gl/gl_image_ozone_native_pixmap.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gl/gl_image_memory.cc
diff --git a/ui/gl/gl_image_memory.cc b/ui/gl/gl_image_memory.cc
index c91ad5635f9ccad1e124e926a436b49fcc442146..045c50c464fa143353938887763329af87e22911 100644
--- a/ui/gl/gl_image_memory.cc
+++ b/ui/gl/gl_image_memory.cc
@@ -7,12 +7,6 @@
#include "base/logging.h"
#include "base/trace_event/trace_event.h"
#include "ui/gl/gl_bindings.h"
-#include "ui/gl/scoped_binders.h"
-
-#if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \
- defined(USE_OZONE)
-#include "ui/gl/gl_surface_egl.h"
-#endif
namespace gfx {
namespace {
@@ -152,26 +146,11 @@ GLsizei SizeInBytes(const Size& size, BufferFormat format) {
GLImageMemory::GLImageMemory(const Size& size, unsigned internalformat)
: size_(size),
internalformat_(internalformat),
- memory_(NULL),
- format_(BufferFormat::RGBA_8888),
- in_use_(false),
- target_(0),
- need_do_bind_tex_image_(false)
-#if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \
- defined(USE_OZONE)
- ,
- egl_texture_id_(0u),
- egl_image_(EGL_NO_IMAGE_KHR)
-#endif
-{
-}
+ memory_(nullptr),
+ format_(BufferFormat::RGBA_8888) {}
GLImageMemory::~GLImageMemory() {
-#if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \
- defined(USE_OZONE)
- DCHECK_EQ(EGL_NO_IMAGE_KHR, egl_image_);
- DCHECK_EQ(0u, egl_texture_id_);
-#endif
+ DCHECK(!memory_);
}
// static
@@ -243,20 +222,7 @@ bool GLImageMemory::Initialize(const unsigned char* memory,
}
void GLImageMemory::Destroy(bool have_context) {
-#if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \
- defined(USE_OZONE)
- if (egl_image_ != EGL_NO_IMAGE_KHR) {
- eglDestroyImageKHR(GLSurfaceEGL::GetHardwareDisplay(), egl_image_);
- egl_image_ = EGL_NO_IMAGE_KHR;
- }
-
- if (egl_texture_id_) {
- if (have_context)
- glDeleteTextures(1, &egl_texture_id_);
- egl_texture_id_ = 0u;
- }
-#endif
- memory_ = NULL;
+ memory_ = nullptr;
}
Size GLImageMemory::GetSize() {
@@ -268,19 +234,27 @@ unsigned GLImageMemory::GetInternalFormat() {
}
bool GLImageMemory::BindTexImage(unsigned target) {
- if (target_ && target_ != target) {
- LOG(ERROR) << "GLImage can only be bound to one target";
+ return false;
+}
+
+bool GLImageMemory::CopyTexImage(unsigned target) {
+ TRACE_EVENT2("gpu", "GLImageMemory::CopyTexImage", "width", size_.width(),
+ "height", size_.height());
+
+ // GL_TEXTURE_EXTERNAL_OES is not a supported target.
+ if (target == GL_TEXTURE_EXTERNAL_OES)
return false;
- }
- target_ = target;
- // Defer DoBindTexImage if not currently in use.
- if (!in_use_) {
- need_do_bind_tex_image_ = true;
- return true;
+ if (IsCompressedFormat(format_)) {
+ glCompressedTexImage2D(target, 0, TextureFormat(format_), size_.width(),
+ size_.height(), 0, SizeInBytes(size_, format_),
+ memory_);
+ } else {
+ glTexImage2D(target, 0, TextureFormat(format_), size_.width(),
+ size_.height(), 0, DataFormat(format_), DataType(format_),
+ memory_);
}
- DoBindTexImage(target);
return true;
}
@@ -290,7 +264,7 @@ bool GLImageMemory::CopyTexSubImage(unsigned target,
TRACE_EVENT2("gpu", "GLImageMemory::CopyTexSubImage", "width", rect.width(),
"height", rect.height());
- // GL_TEXTURE_EXTERNAL_OES is not a supported CopyTexSubImage target.
+ // GL_TEXTURE_EXTERNAL_OES is not a supported target.
if (target == GL_TEXTURE_EXTERNAL_OES)
return false;
@@ -308,36 +282,18 @@ bool GLImageMemory::CopyTexSubImage(unsigned target,
DCHECK(memory_);
const unsigned char* data = memory_ + rect.y() * stride_in_bytes;
if (IsCompressedFormat(format_)) {
- glCompressedTexSubImage2D(target,
- 0, // level
- offset.x(), offset.y(), rect.width(),
+ glCompressedTexSubImage2D(target, 0, offset.x(), offset.y(), rect.width(),
rect.height(), DataFormat(format_),
SizeInBytes(rect.size(), format_), data);
} else {
- glTexSubImage2D(target, 0, // level
- offset.x(), offset.y(), rect.width(), rect.height(),
- DataFormat(format_), DataType(format_), data);
+ glTexSubImage2D(target, 0, offset.x(), offset.y(), rect.width(),
+ rect.height(), DataFormat(format_), DataType(format_),
+ data);
}
return true;
}
-void GLImageMemory::WillUseTexImage() {
- DCHECK(!in_use_);
- in_use_ = true;
-
- if (!need_do_bind_tex_image_)
- return;
-
- DCHECK(target_);
- DoBindTexImage(target_);
-}
-
-void GLImageMemory::DidUseTexImage() {
- DCHECK(in_use_);
- in_use_ = false;
-}
-
bool GLImageMemory::ScheduleOverlayPlane(AcceleratedWidget widget,
int z_order,
OverlayTransform transform,
@@ -346,132 +302,4 @@ bool GLImageMemory::ScheduleOverlayPlane(AcceleratedWidget widget,
return false;
}
-void GLImageMemory::DoBindTexImage(unsigned target) {
- TRACE_EVENT0("gpu", "GLImageMemory::DoBindTexImage");
-
- DCHECK(need_do_bind_tex_image_);
- need_do_bind_tex_image_ = false;
-
- DCHECK(memory_);
-#if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \
- defined(USE_OZONE)
- if (target == GL_TEXTURE_EXTERNAL_OES) {
- if (egl_image_ == EGL_NO_IMAGE_KHR) {
- DCHECK_EQ(0u, egl_texture_id_);
- glGenTextures(1, &egl_texture_id_);
-
- {
- ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- if (IsCompressedFormat(format_)) {
- glCompressedTexImage2D(GL_TEXTURE_2D,
- 0, // mip level
- TextureFormat(format_), size_.width(),
- size_.height(),
- 0, // border
- SizeInBytes(size_, format_), memory_);
- } else {
- glTexImage2D(GL_TEXTURE_2D,
- 0, // mip level
- TextureFormat(format_),
- size_.width(),
- size_.height(),
- 0, // border
- DataFormat(format_),
- DataType(format_),
- memory_);
- }
- }
-
- EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};
- // Need to pass current EGL rendering context to eglCreateImageKHR for
- // target type EGL_GL_TEXTURE_2D_KHR.
- egl_image_ =
- eglCreateImageKHR(GLSurfaceEGL::GetHardwareDisplay(),
- eglGetCurrentContext(),
- EGL_GL_TEXTURE_2D_KHR,
- reinterpret_cast<EGLClientBuffer>(egl_texture_id_),
- attrs);
- DCHECK_NE(EGL_NO_IMAGE_KHR, egl_image_)
- << "Error creating EGLImage: " << eglGetError();
- } else {
- ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_);
-
- if (IsCompressedFormat(format_)) {
- glCompressedTexSubImage2D(GL_TEXTURE_2D,
- 0, // mip level
- 0, // x-offset
- 0, // y-offset
- size_.width(), size_.height(),
- DataFormat(format_),
- SizeInBytes(size_, format_), memory_);
- } else {
- glTexSubImage2D(GL_TEXTURE_2D,
- 0, // mip level
- 0, // x-offset
- 0, // y-offset
- size_.width(),
- size_.height(),
- DataFormat(format_),
- DataType(format_),
- memory_);
- }
- }
-
- glEGLImageTargetTexture2DOES(target, egl_image_);
- DCHECK_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
- return;
- }
-#endif
-
- DCHECK_NE(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), target);
- if (IsCompressedFormat(format_)) {
- glCompressedTexImage2D(target,
- 0, // mip level
- TextureFormat(format_), size_.width(),
- size_.height(),
- 0, // border
- SizeInBytes(size_, format_), memory_);
- } else {
- glTexImage2D(target,
- 0, // mip level
- TextureFormat(format_),
- size_.width(),
- size_.height(),
- 0, // border
- DataFormat(format_),
- DataType(format_),
- memory_);
- }
-}
-
-void GLImageMemory::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd,
- uint64_t process_tracing_id,
- const std::string& dump_name) {
- // Note that the following calculation does not consider whether this GLImage
- // has been un-bound from a texture. It also relies on this GLImage only ever
- // being bound to a single texture. We could check these conditions more
- // thoroughly, but at the cost of extra GL queries.
- bool is_bound_to_texture = target_ && !need_do_bind_tex_image_;
-
-#if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \
- defined(USE_OZONE)
- is_bound_to_texture |= !!egl_texture_id_;
-#endif
-
- size_t size_in_bytes = is_bound_to_texture ? SizeInBytes(size_, format_) : 0;
-
- base::trace_event::MemoryAllocatorDump* dump =
- pmd->CreateAllocatorDump(dump_name + "/texture_memory");
- dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize,
- base::trace_event::MemoryAllocatorDump::kUnitsBytes,
- static_cast<uint64_t>(size_in_bytes));
-
- // No need for a global shared edge here. This object in the GPU process is
- // the sole owner of this texture id.
-}
-
} // namespace gfx
« no previous file with comments | « ui/gl/gl_image_memory.h ('k') | ui/gl/gl_image_ozone_native_pixmap.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698