[mutter] cogl: Remove mesa_46631_slow_read_pixels_workaround
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] cogl: Remove mesa_46631_slow_read_pixels_workaround
- Date: Wed, 19 Dec 2018 19:27:37 +0000 (UTC)
commit 6502735f0128614dd4c1e3df3ba75f0c3c3062bb
Author: Pekka Paalanen <pekka paalanen collabora co uk>
Date: Tue Nov 6 14:31:53 2018 +0200
cogl: Remove mesa_46631_slow_read_pixels_workaround
This function gets hit even today on relatively modern Intel systems (I
have a Haswell Desktop with Mesa 18.2.4) if the pixel format is right.
Presumably it makes things slower for no longer a reason.
According to cb146dc515bf484192a8edfab716550a996b05df, this
functionality was refactored into a workaround path in 2012. The commit
message mentions the problem existing before Mesa 8.0.2. The number
refers to https://bugs.freedesktop.org/show_bug.cgi?id=46631 .
The use case where I hit this is when improving support for DisplayLink
video outputs. These are used through a "secondary GPU", and since
DisplayLink does not have a GPU, Mutter uses the CPU copy path with Cogl
read-pixels[1]. If the DisplayLink framebuffer was allocated as
DRM_FORMAT_XRGB8888 (the only format it currently handles correctly),
mesa_46631_slow_read_pixels_workaround would get hit. The render buffer is
the same format as the framebuffer, yet doing the copy XRGB -> XRGB ends
up being slower than XRGB -> XBGR which makes no sense.
This patch is not sufficient to fix the XRGB -> XRGB copy performance,
but it is required.
This patch reverts CoglGpuInfoDriverBug into what it was before
cb146dc515bf484192a8edfab716550a996b05df.
[1] This is not actually true until
https://gitlab.gnome.org/GNOME/mutter/merge_requests/278 is
merged.
https://gitlab.gnome.org/GNOME/mutter/merge_requests/313
cogl/cogl/cogl-gpu-info-private.h | 7 +-
cogl/cogl/cogl-gpu-info.c | 10 +--
cogl/cogl/driver/gl/cogl-framebuffer-gl.c | 124 ------------------------------
3 files changed, 2 insertions(+), 139 deletions(-)
---
diff --git a/cogl/cogl/cogl-gpu-info-private.h b/cogl/cogl/cogl-gpu-info-private.h
index e532cdd5c..7ab4950f8 100644
--- a/cogl/cogl/cogl-gpu-info-private.h
+++ b/cogl/cogl/cogl-gpu-info-private.h
@@ -74,12 +74,7 @@ typedef enum
typedef enum
{
- /* If this bug is present then it is faster to read pixels into a
- * PBO and then memcpy out of the PBO into system memory rather than
- * directly read into system memory.
- * https://bugs.freedesktop.org/show_bug.cgi?id=46631
- */
- COGL_GPU_INFO_DRIVER_BUG_MESA_46631_SLOW_READ_PIXELS = 1 << 0
+ COGL_GPU_INFO_DRIVER_STUB
} CoglGpuInfoDriverBug;
typedef struct _CoglGpuInfoVersion CoglGpuInfoVersion;
diff --git a/cogl/cogl/cogl-gpu-info.c b/cogl/cogl/cogl-gpu-info.c
index a7897b236..d303da197 100644
--- a/cogl/cogl/cogl-gpu-info.c
+++ b/cogl/cogl/cogl-gpu-info.c
@@ -568,13 +568,5 @@ probed:
gpu->architecture_name);
/* Determine the driver bugs */
-
- /* In Mesa the glReadPixels implementation is really slow
- when using the Intel driver. The Intel
- driver has a fast blit path when reading into a PBO. Reading into
- a temporary PBO and then memcpying back out to the application's
- memory is faster than a regular glReadPixels in this case */
- if (gpu->vendor == COGL_GPU_INFO_VENDOR_INTEL &&
- gpu->driver_package == COGL_GPU_INFO_DRIVER_PACKAGE_MESA)
- gpu->driver_bugs |= COGL_GPU_INFO_DRIVER_BUG_MESA_46631_SLOW_READ_PIXELS;
+ gpu->driver_bugs = 0;
}
diff --git a/cogl/cogl/driver/gl/cogl-framebuffer-gl.c b/cogl/cogl/driver/gl/cogl-framebuffer-gl.c
index e6979a608..70cd4304b 100644
--- a/cogl/cogl/driver/gl/cogl-framebuffer-gl.c
+++ b/cogl/cogl/driver/gl/cogl-framebuffer-gl.c
@@ -1240,96 +1240,6 @@ _cogl_framebuffer_gl_draw_indexed_attributes (CoglFramebuffer *framebuffer,
_cogl_buffer_gl_unbind (buffer);
}
-static CoglBool
-mesa_46631_slow_read_pixels_workaround (CoglFramebuffer *framebuffer,
- int x,
- int y,
- CoglReadPixelsFlags source,
- CoglBitmap *bitmap,
- CoglError **error)
-{
- CoglContext *ctx;
- CoglPixelFormat format;
- CoglBitmap *pbo;
- int width;
- int height;
- CoglBool res;
- uint8_t *dst;
- const uint8_t *src;
-
- ctx = cogl_framebuffer_get_context (framebuffer);
-
- width = cogl_bitmap_get_width (bitmap);
- height = cogl_bitmap_get_height (bitmap);
- format = cogl_bitmap_get_format (bitmap);
-
- pbo = cogl_bitmap_new_with_size (ctx, width, height, format);
-
- /* Read into the pbo. We need to disable the flipping because the
- blit fast path in the driver does not work with
- GL_PACK_INVERT_MESA is set */
- res = _cogl_framebuffer_read_pixels_into_bitmap (framebuffer,
- x, y,
- source |
- COGL_READ_PIXELS_NO_FLIP,
- pbo,
- error);
- if (!res)
- {
- cogl_object_unref (pbo);
- return FALSE;
- }
-
- /* Copy the pixels back into application's buffer */
- dst = _cogl_bitmap_map (bitmap,
- COGL_BUFFER_ACCESS_WRITE,
- COGL_BUFFER_MAP_HINT_DISCARD,
- error);
- if (!dst)
- {
- cogl_object_unref (pbo);
- return FALSE;
- }
-
- src = _cogl_bitmap_map (pbo,
- COGL_BUFFER_ACCESS_READ,
- 0, /* hints */
- error);
- if (src)
- {
- int src_rowstride = cogl_bitmap_get_rowstride (pbo);
- int dst_rowstride = cogl_bitmap_get_rowstride (bitmap);
- int to_copy =
- _cogl_pixel_format_get_bytes_per_pixel (format) * width;
- int y;
-
- /* If the framebuffer is onscreen we need to flip the
- data while copying */
- if (!cogl_is_offscreen (framebuffer))
- {
- src += src_rowstride * (height - 1);
- src_rowstride = -src_rowstride;
- }
-
- for (y = 0; y < height; y++)
- {
- memcpy (dst, src, to_copy);
- dst += dst_rowstride;
- src += src_rowstride;
- }
-
- _cogl_bitmap_unmap (pbo);
- }
- else
- res = FALSE;
-
- _cogl_bitmap_unmap (bitmap);
-
- cogl_object_unref (pbo);
-
- return res;
-}
-
CoglBool
_cogl_framebuffer_gl_read_pixels_into_bitmap (CoglFramebuffer *framebuffer,
int x,
@@ -1350,40 +1260,6 @@ _cogl_framebuffer_gl_read_pixels_into_bitmap (CoglFramebuffer *framebuffer,
CoglBool pack_invert_set;
int status = FALSE;
- /* Workaround for cases where its faster to read into a temporary
- * PBO. This is only worth doing if:
- *
- * • The GPU is an Intel GPU. In that case there is a known
- * fast-path when reading into a PBO that will use the blitter
- * instead of the Mesa fallback code. The driver bug will only be
- * set if this is the case.
- * • We're not already reading into a PBO.
- * • The target format is BGRA. The fast-path blit does not get hit
- * otherwise.
- * • The size of the data is not trivially small. This isn't a
- * requirement to hit the fast-path blit but intuitively it feels
- * like if the amount of data is too small then the cost of
- * allocating a PBO will outweigh the cost of temporarily
- * converting the data to floats.
- */
- if ((ctx->gpu.driver_bugs &
- COGL_GPU_INFO_DRIVER_BUG_MESA_46631_SLOW_READ_PIXELS) &&
- (width > 8 || height > 8) &&
- (format & ~COGL_PREMULT_BIT) == COGL_PIXEL_FORMAT_BGRA_8888 &&
- cogl_bitmap_get_buffer (bitmap) == NULL)
- {
- CoglError *ignore_error = NULL;
-
- if (mesa_46631_slow_read_pixels_workaround (framebuffer,
- x, y,
- source,
- bitmap,
- &ignore_error))
- return TRUE;
- else
- cogl_error_free (ignore_error);
- }
-
_cogl_framebuffer_flush_state (framebuffer,
framebuffer,
COGL_FRAMEBUFFER_STATE_BIND);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]