static bool calc_image_hostmem(pixman_format_code_t pformat,
uint32_t width, uint32_t height,
- uint32_t *hostmem)
+ uint32_t *hostmem, uint32_t *rowstride_bytes)
{
uint64_t bpp = PIXMAN_FORMAT_BPP(pformat);
uint64_t stride = (((uint64_t)width * bpp + 0x1f) >> 5) * sizeof(uint32_t);
}
*hostmem = size;
+ *rowstride_bytes = stride;
return true;
}
pixman_format_code_t pformat;
struct virtio_gpu_simple_resource *res;
struct virtio_gpu_resource_create_2d c2d;
- uint32_t hostmem;
+ uint32_t hostmem, rowstride_bytes;
VIRTIO_GPU_FILL_CMD(c2d);
virtio_gpu_bswap_32(&c2d, sizeof(c2d));
return;
}
- if (!calc_image_hostmem(pformat, c2d.width, c2d.height, &hostmem)) {
+ if (!calc_image_hostmem(pformat, c2d.width, c2d.height,
+ &hostmem, &rowstride_bytes)) {
qemu_log_mask(LOG_GUEST_ERROR, "%s: image dimensions overflow\n",
__func__);
goto end;
pformat,
c2d.width,
c2d.height,
- c2d.height ? res->hostmem / c2d.height : 0,
+ rowstride_bytes,
&err)) {
warn_report_err(err);
goto end;
VirtIOGPU *g = opaque;
Error *err = NULL;
struct virtio_gpu_simple_resource *res;
- uint32_t resource_id, pformat, hostmem;
+ uint32_t resource_id, pformat, hostmem, rowstride_bytes;
int i, ret;
g->hostmem = 0;
return -EINVAL;
}
- if (!calc_image_hostmem(pformat, res->width, res->height, &hostmem)) {
+ if (!calc_image_hostmem(pformat, res->width, res->height,
+ &hostmem, &rowstride_bytes)) {
g_free(res);
return -EINVAL;
}
pformat,
res->width,
res->height,
- res->height ? res->hostmem / res->height : 0,
+ rowstride_bytes,
&err)) {
warn_report_err(err);
g_free(res);