Bug 1265824 - Avoid extra copies in driver draft
authorDoug Thayer <dothayer@mozilla.com>
Thu, 24 May 2018 09:06:13 -0700
changeset 799437 7f9385d872178c512417b1a7ea1bf52a63feca93
parent 798391 7faad784568da71c15a659485dc351813aabb453
child 799438 6be2c5b02477c88bc7255364e4f555003aba5360
push id111049
push userbmo:dothayer@mozilla.com
push dateThu, 24 May 2018 16:52:58 +0000
bugs1265824
milestone62.0a1
Bug 1265824 - Avoid extra copies in driver Using GL_TEXTURE_RECTANGLE along with glTextureRangeAPPLE ensures we avoid a driver-side copy of the buffer. Additionally, using GL_STORAGE_SHARED_APPLE avoids the copy into VRAM. The latter technique is potentially unnecessary - still experimenting. MozReview-Commit-ID: GRPWF6HUInO
gfx/layers/opengl/TextureHostOGL.cpp
--- a/gfx/layers/opengl/TextureHostOGL.cpp
+++ b/gfx/layers/opengl/TextureHostOGL.cpp
@@ -311,17 +311,17 @@ GLTextureSource::IsValid() const
 
 ////////////////////////////////////////////////////////////////////////
 // DirectMapTextureSource
 
 DirectMapTextureSource::DirectMapTextureSource(TextureSourceProvider* aProvider,
                                                gfx::DataSourceSurface* aSurface)
   : GLTextureSource(aProvider,
                     0,
-                    LOCAL_GL_TEXTURE_2D,
+                    LOCAL_GL_TEXTURE_RECTANGLE_ARB,
                     aSurface->GetSize(),
                     aSurface->GetFormat())
   , mSync(0)
 {
   MOZ_ASSERT(aSurface);
 
   UpdateInternal(aSurface, nullptr, nullptr, true);
 }
@@ -361,32 +361,31 @@ DirectMapTextureSource::UpdateInternal(g
                                        nsIntRegion* aDestRegion,
                                        gfx::IntPoint* aSrcOffset,
                                        bool aInit)
 {
   gl()->MakeCurrent();
 
   if (aInit) {
     gl()->fGenTextures(1, &mTextureHandle);
-
-    gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, mTextureHandle);
+    gl()->fBindTexture(LOCAL_GL_TEXTURE_RECTANGLE_ARB, mTextureHandle);
 
-    // APPLE_texture_range
-    // TODO: test with LOCAL_GL_STORAGE_SHARED_APPLE
-    gl()->fTextureRangeAPPLE(LOCAL_GL_TEXTURE_2D,
+    gl()->fTextureRangeAPPLE(LOCAL_GL_TEXTURE_RECTANGLE_ARB,
                              aSurface->Stride() * aSurface->GetSize().height,
                              aSurface->GetData());
-    gl()->fTexParameteri(LOCAL_GL_TEXTURE_2D,
+    gl()->fTexParameteri(LOCAL_GL_TEXTURE_RECTANGLE_ARB,
                          LOCAL_GL_TEXTURE_STORAGE_HINT_APPLE,
-                         LOCAL_GL_STORAGE_CACHED_APPLE);
+                         LOCAL_GL_STORAGE_SHARED_APPLE);
 
-    gl()->fTexParameteri(LOCAL_GL_TEXTURE_2D, LOCAL_GL_TEXTURE_WRAP_S, LOCAL_GL_CLAMP_TO_EDGE);
-    gl()->fTexParameteri(LOCAL_GL_TEXTURE_2D, LOCAL_GL_TEXTURE_WRAP_T, LOCAL_GL_CLAMP_TO_EDGE);
-
-    gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, 0);
+    gl()->fTexParameteri(LOCAL_GL_TEXTURE_RECTANGLE_ARB,
+                         LOCAL_GL_TEXTURE_WRAP_S,
+                         LOCAL_GL_CLAMP_TO_EDGE);
+    gl()->fTexParameteri(LOCAL_GL_TEXTURE_RECTANGLE_ARB,
+                         LOCAL_GL_TEXTURE_WRAP_T,
+                         LOCAL_GL_CLAMP_TO_EDGE);
   }
 
   MOZ_ASSERT(mTextureHandle);
 
   // APPLE_client_storage
   gl()->fPixelStorei(LOCAL_GL_UNPACK_CLIENT_STORAGE_APPLE, LOCAL_GL_TRUE);
 
   nsIntRegion destRegion = aDestRegion ? *aDestRegion
@@ -399,23 +398,17 @@ DirectMapTextureSource::UpdateInternal(g
                                        aSurface,
                                        destRegion,
                                        mTextureHandle,
                                        aSurface->GetSize(),
                                        nullptr,
                                        aInit,
                                        srcPoint,
                                        LOCAL_GL_TEXTURE0,
-                                       LOCAL_GL_TEXTURE_2D);
-
-  // Delete the previous sync object.
-  if (mSync) {
-    gl()->fDeleteSync(mSync);
-  }
-  mSync = gl()->fFenceSync(LOCAL_GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
+                                       LOCAL_GL_TEXTURE_RECTANGLE_ARB);
 
   gl()->fPixelStorei(LOCAL_GL_UNPACK_CLIENT_STORAGE_APPLE, LOCAL_GL_FALSE);
   return true;
 }
 
 ////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////
 // SurfaceTextureHost