[PATCH xserver 01/12] glamor: Simplify temporary picture uploading call stack.
Eric Anholt
eric at anholt.net
Mon Feb 1 22:58:04 CET 2016
glamor_upload_sub_pixmap_to_texture() only had the one caller, so we
can merge it in, fix its silly return value, and propagate a bunch of
constants.
Signed-off-by: Eric Anholt <eric at anholt.net>
---
glamor/glamor_picture.c | 68 ++++++++++++++++++-------------------------------
glamor/glamor_priv.h | 18 +------------
glamor/glamor_render.c | 27 ++++++++------------
3 files changed, 37 insertions(+), 76 deletions(-)
diff --git a/glamor/glamor_picture.c b/glamor/glamor_picture.c
index b069ce5..e91461c 100644
--- a/glamor/glamor_picture.c
+++ b/glamor/glamor_picture.c
@@ -797,11 +797,15 @@ glamor_put_bits(char *dst_bits, int dst_stride, char *src_bits,
}
}
-static Bool
-glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
- int h, int stride, void *bits, int pbo,
- PictFormatShort pict_format)
+/* Upload picture to texture. We may need to flip the y axis or
+ * wire alpha to 1. So we may conditional create fbo for the picture.
+ * */
+Bool
+glamor_upload_picture_to_texture(PicturePtr picture)
{
+ PixmapPtr pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
+ void *bits = pixmap->devPrivate.ptr;
+ int stride = pixmap->devKind;
ScreenPtr screen = pixmap->drawable.pScreen;
glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
GLenum format, type;
@@ -810,7 +814,7 @@ glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
Bool force_clip;
if (glamor_get_tex_format_type_from_pixmap(pixmap,
- pict_format,
+ picture->format,
&format,
&type,
&no_alpha,
@@ -822,8 +826,7 @@ glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
return FALSE;
pixmap_priv = glamor_get_pixmap_private(pixmap);
- force_clip = glamor_priv->gl_flavor != GLAMOR_GL_DESKTOP
- && !glamor_check_fbo_size(glamor_priv, w, h);
+ force_clip = glamor_priv->gl_flavor != GLAMOR_GL_DESKTOP;
if (glamor_pixmap_priv_is_large(pixmap_priv) || force_clip) {
RegionRec region;
@@ -833,13 +836,13 @@ glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
void *sub_bits;
int i, j;
- sub_bits = xallocarray(h, stride);
+ sub_bits = xallocarray(pixmap->drawable.height, stride);
if (sub_bits == NULL)
return FALSE;
- box.x1 = x;
- box.y1 = y;
- box.x2 = x + w;
- box.y2 = y + h;
+ box.x1 = 0;
+ box.y1 = 0;
+ box.x2 = pixmap->drawable.width;
+ box.y2 = pixmap->drawable.height;
RegionInitBoxes(®ion, &box, 1);
if (!force_clip)
clipped_regions =
@@ -860,8 +863,6 @@ glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
int temp_stride;
void *temp_bits;
- assert(pbo == 0);
-
glamor_set_pixmap_fbo_current(pixmap_priv, clipped_regions[i].block_idx);
boxes = RegionRects(clipped_regions[i].region);
@@ -871,26 +872,26 @@ glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
temp_stride = PixmapBytePad(boxes[j].x2 - boxes[j].x1,
pixmap->drawable.depth);
- if (boxes[j].x1 == x && temp_stride == stride) {
- temp_bits = (char *) bits + (boxes[j].y1 - y) * stride;
+ if (boxes[j].x1 == 0 && temp_stride == stride) {
+ temp_bits = (char *) bits + boxes[j].y1 * stride;
}
else {
temp_bits = sub_bits;
glamor_put_bits(temp_bits, temp_stride, bits, stride,
pixmap->drawable.bitsPerPixel,
- boxes[j].x1 - x, boxes[j].y1 - y,
+ boxes[j].x1, boxes[j].y1,
boxes[j].x2 - boxes[j].x1,
boxes[j].y2 - boxes[j].y1);
}
DEBUGF("upload x %d y %d w %d h %d temp stride %d \n",
- boxes[j].x1 - x, boxes[j].y1 - y,
+ boxes[j].x1, boxes[j].y1,
boxes[j].x2 - boxes[j].x1,
boxes[j].y2 - boxes[j].y1, temp_stride);
if (_glamor_upload_bits_to_pixmap_texture
(pixmap, format, type, no_alpha, revert, swap_rb,
boxes[j].x1, boxes[j].y1, boxes[j].x2 - boxes[j].x1,
boxes[j].y2 - boxes[j].y1, temp_stride, temp_bits,
- pbo) == FALSE) {
+ 0) == FALSE) {
RegionUninit(®ion);
free(sub_bits);
assert(0);
@@ -907,28 +908,9 @@ glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
else
return _glamor_upload_bits_to_pixmap_texture(pixmap, format, type,
no_alpha, revert, swap_rb,
- x, y, w, h, stride, bits,
- pbo);
-}
-
-/* Upload picture to texture. We may need to flip the y axis or
- * wire alpha to 1. So we may conditional create fbo for the picture.
- * */
-enum glamor_pixmap_status
-glamor_upload_picture_to_texture(PicturePtr picture)
-{
- PixmapPtr pixmap;
-
- assert(picture->pDrawable);
- pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
-
- if (glamor_upload_sub_pixmap_to_texture(pixmap, 0, 0,
- pixmap->drawable.width,
- pixmap->drawable.height,
- pixmap->devKind,
- pixmap->devPrivate.ptr, 0,
- picture->format))
- return GLAMOR_UPLOAD_DONE;
- else
- return GLAMOR_UPLOAD_FAILED;
+ 0, 0,
+ pixmap->drawable.width,
+ pixmap->drawable.height,
+ stride, bits,
+ 0);
}
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index a70f10e..422b0fd 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -514,22 +514,6 @@ glamor_pixmap_hcnt(glamor_pixmap_private *priv)
for (box_index = 0; box_index < glamor_pixmap_hcnt(priv) * \
glamor_pixmap_wcnt(priv); box_index++) \
-/**
- * Pixmap upload status, used by glamor_render.c's support for
- * temporarily uploading pixmaps to GL textures to get a Composite
- * operation done.
- */
-typedef enum glamor_pixmap_status {
- /** initial status, don't need to do anything. */
- GLAMOR_NONE,
- /** marked as need to be uploaded to gl texture. */
- GLAMOR_UPLOAD_PENDING,
- /** the pixmap has been uploaded successfully. */
- GLAMOR_UPLOAD_DONE,
- /** fail to upload the pixmap. */
- GLAMOR_UPLOAD_FAILED
-} glamor_pixmap_status_t;
-
/* GC private structure. Currently holds only any computed dash pixmap */
typedef struct {
@@ -739,7 +723,7 @@ Bool glamor_composite_largepixmap_region(CARD8 op,
* Upload a picture to gl texture. Similar to the
* glamor_upload_pixmap_to_texture. Used in rendering.
**/
-enum glamor_pixmap_status glamor_upload_picture_to_texture(PicturePtr picture);
+Bool glamor_upload_picture_to_texture(PicturePtr picture);
void glamor_add_traps(PicturePtr pPicture,
INT16 x_off, INT16 y_off, int ntrap, xTrap *traps);
diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index 73ac831..d47e7d7 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -788,8 +788,8 @@ glamor_composite_choose_shader(CARD8 op,
{
ScreenPtr screen = dest->pDrawable->pScreen;
glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
- enum glamor_pixmap_status source_status = GLAMOR_NONE;
- enum glamor_pixmap_status mask_status = GLAMOR_NONE;
+ Bool source_needs_upload = FALSE;
+ Bool mask_needs_upload = FALSE;
PictFormatShort saved_source_format = 0;
struct shader_key key;
GLfloat source_solid_color[4];
@@ -900,7 +900,7 @@ glamor_composite_choose_shader(CARD8 op,
}
if (source_pixmap_priv->gl_fbo == GLAMOR_FBO_UNATTACHED) {
#ifdef GLAMOR_PIXMAP_DYNAMIC_UPLOAD
- source_status = GLAMOR_UPLOAD_PENDING;
+ source_needs_upload = TRUE;
#else
glamor_fallback("no texture in source\n");
goto fail;
@@ -916,7 +916,7 @@ glamor_composite_choose_shader(CARD8 op,
}
if (mask_pixmap_priv->gl_fbo == GLAMOR_FBO_UNATTACHED) {
#ifdef GLAMOR_PIXMAP_DYNAMIC_UPLOAD
- mask_status = GLAMOR_UPLOAD_PENDING;
+ mask_needs_upload = TRUE;
#else
glamor_fallback("no texture in mask\n");
goto fail;
@@ -925,8 +925,7 @@ glamor_composite_choose_shader(CARD8 op,
}
#ifdef GLAMOR_PIXMAP_DYNAMIC_UPLOAD
- if (source_status == GLAMOR_UPLOAD_PENDING
- && mask_status == GLAMOR_UPLOAD_PENDING
+ if (source_needs_upload && mask_needs_upload
&& source_pixmap == mask_pixmap) {
if (source->format != mask->format) {
@@ -962,20 +961,17 @@ glamor_composite_choose_shader(CARD8 op,
if (!PICT_FORMAT_A(mask->format)
&& PICT_FORMAT_A(saved_source_format))
key.mask = SHADER_MASK_TEXTURE;
-
- mask_status = GLAMOR_NONE;
}
- source_status = glamor_upload_picture_to_texture(source);
- if (source_status != GLAMOR_UPLOAD_DONE) {
+ if (!glamor_upload_picture_to_texture(source)) {
glamor_fallback("Failed to upload source texture.\n");
goto fail;
}
+ mask_needs_upload = FALSE;
}
else {
- if (source_status == GLAMOR_UPLOAD_PENDING) {
- source_status = glamor_upload_picture_to_texture(source);
- if (source_status != GLAMOR_UPLOAD_DONE) {
+ if (source_needs_upload) {
+ if (!glamor_upload_picture_to_texture(source)) {
glamor_fallback("Failed to upload source texture.\n");
goto fail;
}
@@ -986,9 +982,8 @@ glamor_composite_choose_shader(CARD8 op,
}
}
- if (mask_status == GLAMOR_UPLOAD_PENDING) {
- mask_status = glamor_upload_picture_to_texture(mask);
- if (mask_status != GLAMOR_UPLOAD_DONE) {
+ if (mask_needs_upload) {
+ if (!glamor_upload_picture_to_texture(mask)) {
glamor_fallback("Failed to upload mask texture.\n");
goto fail;
}
--
2.7.0
More information about the xorg-devel
mailing list