617
scanout->fb = *fb;
618
}
619
620
+static uint32_t virtio_gpu_format_bytes_pp(pixman_format_code_t format)
621
+{
622
+ return DIV_ROUND_UP(PIXMAN_FORMAT_BPP(format), 8);
623
+}
624
+
625
static bool virtio_gpu_do_set_scanout(VirtIOGPU *g,
626
uint32_t scanout_id,
627
struct virtio_gpu_framebuffer *fb,
630
uint32_t *error)
631
{
632
struct virtio_gpu_scanout *scanout;
633
+ uint32_t bytes_pp = virtio_gpu_format_bytes_pp(fb->format);
634
uint8_t *data;
635
636
scanout = &g->parent_obj.scanout[scanout_id];
652
return false;
653
}
654
649
- if (fb->stride < (uint64_t)fb->width * fb->bytes_pp) {
655
+ if (fb->stride < (uint64_t)fb->width * bytes_pp) {
656
qemu_log_mask(LOG_GUEST_ERROR,
657
"%s: stride %u too small for width %u at %u bpp\n",
652
- __func__, fb->stride, fb->width, fb->bytes_pp);
658
+ __func__, fb->stride, fb->width, bytes_pp);
659
*error = VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER;
660
return false;
661
}
726
struct virtio_gpu_simple_resource *res;
727
struct virtio_gpu_framebuffer fb = { 0 };
728
struct virtio_gpu_set_scanout ss;
729
+ uint32_t bytes_pp;
730
731
VIRTIO_GPU_FILL_CMD(ss);
732
virtio_gpu_bswap_32(&ss, sizeof(ss));
752
}
753
754
fb.format = pixman_image_get_format(res->image);
748
- fb.bytes_pp = DIV_ROUND_UP(PIXMAN_FORMAT_BPP(fb.format), 8);
755
+ bytes_pp = virtio_gpu_format_bytes_pp(fb.format);
756
fb.width = pixman_image_get_width(res->image);
757
fb.height = pixman_image_get_height(res->image);
758
fb.stride = pixman_image_get_stride(res->image);
752
- fb.offset = ss.r.x * fb.bytes_pp + ss.r.y * fb.stride;
759
+ fb.offset = ss.r.x * bytes_pp + ss.r.y * fb.stride;
760
761
virtio_gpu_do_set_scanout(g, ss.scanout_id,
762
&fb, res, &ss.r, &cmd->error);
767
uint64_t blob_size)
768
{
769
uint64_t fbend;
770
+ uint32_t bytes_pp;
771
772
fb->format = virtio_gpu_get_pixman_format(ss->format);
773
if (!fb->format) {
777
return false;
778
}
779
772
- fb->bytes_pp = DIV_ROUND_UP(PIXMAN_FORMAT_BPP(fb->format), 8);
780
+ bytes_pp = virtio_gpu_format_bytes_pp(fb->format);
781
fb->width = ss->width;
782
fb->height = ss->height;
783
fb->stride = ss->strides[0];
784
777
- if (fb->stride < (uint64_t)fb->width * fb->bytes_pp) {
785
+ if (fb->stride < (uint64_t)fb->width * bytes_pp) {
786
qemu_log_mask(LOG_GUEST_ERROR,
787
"%s: stride %u too small for width %u at %u bpp\n",
780
- __func__, fb->stride, fb->width, fb->bytes_pp);
788
+ __func__, fb->stride, fb->width, bytes_pp);
789
return false;
790
}
791
796
return false;
797
}
798
791
- fb->offset = ss->offsets[0] + ss->r.x * fb->bytes_pp + ss->r.y * fb->stride;
799
+ fb->offset = ss->offsets[0] + ss->r.x * bytes_pp + ss->r.y * fb->stride;
800
801
fbend = fb->offset;
802
fbend += (uint64_t) fb->stride * ss->r.height;
1246
VMSTATE_UINT32(cursor.pos.y, struct virtio_gpu_scanout),
1247
VMSTATE_UINT32_TEST(fb.format, struct virtio_gpu_scanout,
1248
scanout_vmstate_after_v2),
1241
- VMSTATE_UINT32_TEST(fb.bytes_pp, struct virtio_gpu_scanout,
1242
- scanout_vmstate_after_v2),
1249
+ VMSTATE_UNUSED_TEST(scanout_vmstate_after_v2, 4),
1250
VMSTATE_UINT32_TEST(fb.width, struct virtio_gpu_scanout,
1251
scanout_vmstate_after_v2),
1252
VMSTATE_UINT32_TEST(fb.height, struct virtio_gpu_scanout,