static void virgl_cmd_submit_3d(VirtIOGPU *g,

                                struct virtio_gpu_ctrl_command *cmd)

{

    struct virtio_gpu_cmd_submit cs;

    void *buf;

    size_t s;



    VIRTIO_GPU_FILL_CMD(cs);

    trace_virtio_gpu_cmd_ctx_submit(cs.hdr.ctx_id, cs.size);



    buf = g_malloc(cs.size);

    s = iov_to_buf(cmd->elem.out_sg, cmd->elem.out_num,

                   sizeof(cs), buf, cs.size);

    if (s != cs.size) {

        qemu_log_mask(LOG_GUEST_ERROR, "%s: size mismatch (%zd/%d)",

                      __func__, s, cs.size);

        cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER;

        return;

    }



    if (virtio_gpu_stats_enabled(g->conf)) {

        g->stats.req_3d++;

        g->stats.bytes_3d += cs.size;

    }



    virgl_renderer_submit_cmd(buf, cs.hdr.ctx_id, cs.size / 4);



    g_free(buf);

}

static void virgl_cmd_submit_3d(VirtIOGPU *g,

                                struct virtio_gpu_ctrl_command *cmd)

{

    struct virtio_gpu_cmd_submit cs;

    void *buf;

    size_t s;



    VIRTIO_GPU_FILL_CMD(cs);

    trace_virtio_gpu_cmd_ctx_submit(cs.hdr.ctx_id, cs.size);



    buf = g_malloc(cs.size);

    s = iov_to_buf(cmd->elem.out_sg, cmd->elem.out_num,

                   sizeof(cs), buf, cs.size);

    if (s != cs.size) {

        qemu_log_mask(LOG_GUEST_ERROR, "%s: size mismatch (%zd/%d)",

                      __func__, s, cs.size);

        cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER;

        return;

    }



    if (virtio_gpu_stats_enabled(g->conf)) {

        g->stats.req_3d++;

        g->stats.bytes_3d += cs.size;

    }



    virgl_renderer_submit_cmd(buf, cs.hdr.ctx_id, cs.size / 4);



    g_free(buf);

}

static void FUNC_0(VirtIOGPU *VAR_0,

                                struct virtio_gpu_ctrl_command *VAR_1)

{

    struct virtio_gpu_cmd_submit VAR_2;

    void *VAR_3;

    size_t s;



    VIRTIO_GPU_FILL_CMD(VAR_2);

    trace_virtio_gpu_cmd_ctx_submit(VAR_2.hdr.ctx_id, VAR_2.size);



    VAR_3 = g_malloc(VAR_2.size);

    s = iov_to_buf(VAR_1->elem.out_sg, VAR_1->elem.out_num,

                   sizeof(VAR_2), VAR_3, VAR_2.size);

    if (s != VAR_2.size) {

        qemu_log_mask(LOG_GUEST_ERROR, "%s: size mismatch (%zd/%d)",

                      __func__, s, VAR_2.size);

        VAR_1->error = VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER;

        return;

    }



    if (virtio_gpu_stats_enabled(VAR_0->conf)) {

        VAR_0->stats.req_3d++;

        VAR_0->stats.bytes_3d += VAR_2.size;

    }



    virgl_renderer_submit_cmd(VAR_3, VAR_2.hdr.ctx_id, VAR_2.size / 4);



    g_free(VAR_3);

}

static void FUNC_0(VirtIOGPU *VAR_0,
struct virtio_gpu_ctrl_command *VAR_1)
{ struct virtio_gpu_cmd_submit VAR_2; void *VAR_3; size_t s; VIRTIO_GPU_FILL_CMD(VAR_2); trace_virtio_gpu_cmd_ctx_submit(VAR_2.hdr.ctx_id, VAR_2.size); VAR_3 = g_malloc(VAR_2.size); s = iov_to_buf(VAR_1->elem.out_sg, VAR_1->elem.out_num,
sizeof(VAR_2), VAR_3, VAR_2.size); if (s != VAR_2.size) { qemu_log_mask(LOG_GUEST_ERROR, "%s: size mismatch (%zd/%d)",
__func__, s, VAR_2.size); VAR_1->error = VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER; return; } if (virtio_gpu_stats_enabled(VAR_0->conf)) { VAR_0->stats.req_3d++; VAR_0->stats.bytes_3d += VAR_2.size; } virgl_renderer_submit_cmd(VAR_3, VAR_2.hdr.ctx_id, VAR_2.size / 4); g_free(VAR_3); }