if (dri2_surf->back->bo == NULL) {
if (surf->base.modifiers)
dri2_surf->back->bo = gbm_bo_create_with_modifiers(&dri2_dpy->gbm_dri->base,
- surf->base.width, surf->base.height,
+ surf->base.width,
+ surf->base.height,
surf->base.format,
surf->base.modifiers,
surf->base.count);
struct dri2_egl_surface *dri2_surf = loaderPrivate;
int i, j;
- dri2_surf->buffer_count = 0;
for (i = 0, j = 0; i < 2 * count; i += 2, j++) {
assert(attachments[i] < __DRI_BUFFER_COUNT);
- assert(dri2_surf->buffer_count < 5);
+ assert(j < ARRAY_SIZE(dri2_surf->buffers));
switch (attachments[i]) {
case __DRI_BUFFER_BACK_LEFT:
struct dri2_egl_surface *dri2_surf = loaderPrivate;
int internal_stride;
struct gbm_dri_bo *bo;
+ uint32_t bpp;
+ int x_bytes, width_bytes;
+ char *src, *dst;
if (op != __DRI_SWRAST_IMAGE_OP_DRAW &&
op != __DRI_SWRAST_IMAGE_OP_SWAP)
return;
bo = gbm_dri_bo(dri2_surf->current->bo);
+
+ bpp = gbm_bo_get_bpp(&bo->base);
+ if (bpp == 0)
+ return;
+
+ x_bytes = x * (bpp >> 3);
+ width_bytes = width * (bpp >> 3);
+
if (gbm_dri_bo_map_dumb(bo) == NULL)
return;
internal_stride = bo->base.stride;
+ dst = bo->map + x_bytes + (y * internal_stride);
+ src = data;
+
for (int i = 0; i < height; i++) {
- memcpy(bo->map + (x + i) * internal_stride + y,
- data + i * stride, stride);
+ memcpy(dst, src, width_bytes);
+ dst += internal_stride;
+ src += stride;
}
gbm_dri_bo_unmap_dumb(bo);
struct dri2_egl_surface *dri2_surf = loaderPrivate;
int internal_stride, stride;
struct gbm_dri_bo *bo;
+ uint32_t bpp;
+ int x_bytes, width_bytes;
+ char *src, *dst;
if (get_swrast_front_bo(dri2_surf) < 0)
return;
bo = gbm_dri_bo(dri2_surf->current->bo);
- if (gbm_dri_bo_map_dumb(bo) == NULL)
+
+ bpp = gbm_bo_get_bpp(&bo->base);
+ if (bpp == 0)
return;
+ x_bytes = x * (bpp >> 3);
+ width_bytes = width * (bpp >> 3);
+
internal_stride = bo->base.stride;
- stride = width * 4;
+ stride = width_bytes;
+
+ if (gbm_dri_bo_map_dumb(bo) == NULL)
+ return;
+
+ dst = data;
+ src = bo->map + x_bytes + (y * internal_stride);
for (int i = 0; i < height; i++) {
- memcpy(data + i * stride,
- bo->map + (x + i) * internal_stride + y, stride);
+ memcpy(dst, src, width_bytes);
+ dst += stride;
+ src += internal_stride;
}
gbm_dri_bo_unmap_dumb(bo);