Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
ddd8fdc7
Q
qemu
项目概览
openeuler
/
qemu
通知
10
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Q
qemu
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ddd8fdc7
编写于
9月 04, 2012
作者:
G
Gerd Hoffmann
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
spice: make number of surfaces runtime-configurable.
Signed-off-by:
N
Gerd Hoffmann
<
kraxel@redhat.com
>
上级
2e0e3c39
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
23 addition
and
19 deletion
+23
-19
hw/qxl.c
hw/qxl.c
+17
-14
hw/qxl.h
hw/qxl.h
+1
-2
ui/spice-display.c
ui/spice-display.c
+4
-1
ui/spice-display.h
ui/spice-display.h
+1
-2
未找到文件。
hw/qxl.c
浏览文件 @
ddd8fdc7
...
@@ -236,7 +236,8 @@ static void qxl_spice_destroy_surfaces_complete(PCIQXLDevice *qxl)
...
@@ -236,7 +236,8 @@ static void qxl_spice_destroy_surfaces_complete(PCIQXLDevice *qxl)
{
{
trace_qxl_spice_destroy_surfaces_complete
(
qxl
->
id
);
trace_qxl_spice_destroy_surfaces_complete
(
qxl
->
id
);
qemu_mutex_lock
(
&
qxl
->
track_lock
);
qemu_mutex_lock
(
&
qxl
->
track_lock
);
memset
(
&
qxl
->
guest_surfaces
.
cmds
,
0
,
sizeof
(
qxl
->
guest_surfaces
.
cmds
));
memset
(
qxl
->
guest_surfaces
.
cmds
,
0
,
sizeof
(
qxl
->
guest_surfaces
.
cmds
)
*
qxl
->
ssd
.
num_surfaces
);
qxl
->
guest_surfaces
.
count
=
0
;
qxl
->
guest_surfaces
.
count
=
0
;
qemu_mutex_unlock
(
&
qxl
->
track_lock
);
qemu_mutex_unlock
(
&
qxl
->
track_lock
);
}
}
...
@@ -345,7 +346,7 @@ static void init_qxl_rom(PCIQXLDevice *d)
...
@@ -345,7 +346,7 @@ static void init_qxl_rom(PCIQXLDevice *d)
rom
->
slot_id_bits
=
MEMSLOT_SLOT_BITS
;
rom
->
slot_id_bits
=
MEMSLOT_SLOT_BITS
;
rom
->
slots_start
=
1
;
rom
->
slots_start
=
1
;
rom
->
slots_end
=
NUM_MEMSLOTS
-
1
;
rom
->
slots_end
=
NUM_MEMSLOTS
-
1
;
rom
->
n_surfaces
=
cpu_to_le32
(
NUM_SURFACES
);
rom
->
n_surfaces
=
cpu_to_le32
(
d
->
ssd
.
num_surfaces
);
for
(
i
=
0
,
n
=
0
;
i
<
ARRAY_SIZE
(
qxl_modes
);
i
++
)
{
for
(
i
=
0
,
n
=
0
;
i
<
ARRAY_SIZE
(
qxl_modes
);
i
++
)
{
fb
=
qxl_modes
[
i
].
y_res
*
qxl_modes
[
i
].
stride
;
fb
=
qxl_modes
[
i
].
y_res
*
qxl_modes
[
i
].
stride
;
...
@@ -449,9 +450,9 @@ static int qxl_track_command(PCIQXLDevice *qxl, struct QXLCommandExt *ext)
...
@@ -449,9 +450,9 @@ static int qxl_track_command(PCIQXLDevice *qxl, struct QXLCommandExt *ext)
}
}
uint32_t
id
=
le32_to_cpu
(
cmd
->
surface_id
);
uint32_t
id
=
le32_to_cpu
(
cmd
->
surface_id
);
if
(
id
>=
NUM_SURFACES
)
{
if
(
id
>=
qxl
->
ssd
.
num_surfaces
)
{
qxl_set_guest_bug
(
qxl
,
"QXL_CMD_SURFACE id %d >= %d"
,
id
,
qxl_set_guest_bug
(
qxl
,
"QXL_CMD_SURFACE id %d >= %d"
,
id
,
NUM_SURFACES
);
qxl
->
ssd
.
num_surfaces
);
return
1
;
return
1
;
}
}
qemu_mutex_lock
(
&
qxl
->
track_lock
);
qemu_mutex_lock
(
&
qxl
->
track_lock
);
...
@@ -527,7 +528,7 @@ static void interface_get_init_info(QXLInstance *sin, QXLDevInitInfo *info)
...
@@ -527,7 +528,7 @@ static void interface_get_init_info(QXLInstance *sin, QXLDevInitInfo *info)
info
->
num_memslots_groups
=
NUM_MEMSLOTS_GROUPS
;
info
->
num_memslots_groups
=
NUM_MEMSLOTS_GROUPS
;
info
->
internal_groupslot_id
=
0
;
info
->
internal_groupslot_id
=
0
;
info
->
qxl_ram_size
=
le32_to_cpu
(
qxl
->
shadow_rom
.
num_pages
)
<<
TARGET_PAGE_BITS
;
info
->
qxl_ram_size
=
le32_to_cpu
(
qxl
->
shadow_rom
.
num_pages
)
<<
TARGET_PAGE_BITS
;
info
->
n_surfaces
=
NUM_SURFACES
;
info
->
n_surfaces
=
qxl
->
ssd
.
num_surfaces
;
}
}
static
const
char
*
qxl_mode_to_string
(
int
mode
)
static
const
char
*
qxl_mode_to_string
(
int
mode
)
...
@@ -1436,7 +1437,7 @@ async_common:
...
@@ -1436,7 +1437,7 @@ async_common:
QXLCookie
*
cookie
=
NULL
;
QXLCookie
*
cookie
=
NULL
;
QXLRect
update
=
d
->
ram
->
update_area
;
QXLRect
update
=
d
->
ram
->
update_area
;
if
(
d
->
ram
->
update_surface
>
NUM_SURFACES
)
{
if
(
d
->
ram
->
update_surface
>
d
->
ssd
.
num_surfaces
)
{
qxl_set_guest_bug
(
d
,
"QXL_IO_UPDATE_AREA: invalid surface id %d
\n
"
,
qxl_set_guest_bug
(
d
,
"QXL_IO_UPDATE_AREA: invalid surface id %d
\n
"
,
d
->
ram
->
update_surface
);
d
->
ram
->
update_surface
);
return
;
return
;
...
@@ -1529,7 +1530,7 @@ async_common:
...
@@ -1529,7 +1530,7 @@ async_common:
}
}
break
;
break
;
case
QXL_IO_DESTROY_SURFACE_WAIT
:
case
QXL_IO_DESTROY_SURFACE_WAIT
:
if
(
val
>=
NUM_SURFACES
)
{
if
(
val
>=
d
->
ssd
.
num_surfaces
)
{
qxl_set_guest_bug
(
d
,
"QXL_IO_DESTROY_SURFACE (async=%d):"
qxl_set_guest_bug
(
d
,
"QXL_IO_DESTROY_SURFACE (async=%d):"
"%"
PRIu64
" >= NUM_SURFACES"
,
async
,
val
);
"%"
PRIu64
" >= NUM_SURFACES"
,
async
,
val
);
goto
cancel_async
;
goto
cancel_async
;
...
@@ -1707,7 +1708,7 @@ static void qxl_dirty_surfaces(PCIQXLDevice *qxl)
...
@@ -1707,7 +1708,7 @@ static void qxl_dirty_surfaces(PCIQXLDevice *qxl)
vram_start
=
(
intptr_t
)
memory_region_get_ram_ptr
(
&
qxl
->
vram_bar
);
vram_start
=
(
intptr_t
)
memory_region_get_ram_ptr
(
&
qxl
->
vram_bar
);
/* dirty the off-screen surfaces */
/* dirty the off-screen surfaces */
for
(
i
=
0
;
i
<
NUM_SURFACES
;
i
++
)
{
for
(
i
=
0
;
i
<
qxl
->
ssd
.
num_surfaces
;
i
++
)
{
QXLSurfaceCmd
*
cmd
;
QXLSurfaceCmd
*
cmd
;
intptr_t
surface_offset
;
intptr_t
surface_offset
;
int
surface_size
;
int
surface_size
;
...
@@ -1835,7 +1836,6 @@ static int qxl_init_common(PCIQXLDevice *qxl)
...
@@ -1835,7 +1836,6 @@ static int qxl_init_common(PCIQXLDevice *qxl)
qxl
->
mode
=
QXL_MODE_UNDEFINED
;
qxl
->
mode
=
QXL_MODE_UNDEFINED
;
qxl
->
generation
=
1
;
qxl
->
generation
=
1
;
qxl
->
num_memslots
=
NUM_MEMSLOTS
;
qxl
->
num_memslots
=
NUM_MEMSLOTS
;
qxl
->
num_surfaces
=
NUM_SURFACES
;
qemu_mutex_init
(
&
qxl
->
track_lock
);
qemu_mutex_init
(
&
qxl
->
track_lock
);
qemu_mutex_init
(
&
qxl
->
async_lock
);
qemu_mutex_init
(
&
qxl
->
async_lock
);
qxl
->
current_async
=
QXL_UNDEFINED_IO
;
qxl
->
current_async
=
QXL_UNDEFINED_IO
;
...
@@ -1877,6 +1877,7 @@ static int qxl_init_common(PCIQXLDevice *qxl)
...
@@ -1877,6 +1877,7 @@ static int qxl_init_common(PCIQXLDevice *qxl)
init_qxl_rom
(
qxl
);
init_qxl_rom
(
qxl
);
init_qxl_ram
(
qxl
);
init_qxl_ram
(
qxl
);
qxl
->
guest_surfaces
.
cmds
=
g_new0
(
QXLPHYSICAL
,
qxl
->
ssd
.
num_surfaces
);
memory_region_init_ram
(
&
qxl
->
vram_bar
,
"qxl.vram"
,
qxl
->
vram_size
);
memory_region_init_ram
(
&
qxl
->
vram_bar
,
"qxl.vram"
,
qxl
->
vram_size
);
vmstate_register_ram
(
&
qxl
->
vram_bar
,
&
qxl
->
pci
.
qdev
);
vmstate_register_ram
(
&
qxl
->
vram_bar
,
&
qxl
->
pci
.
qdev
);
memory_region_init_alias
(
&
qxl
->
vram32_bar
,
"qxl.vram32"
,
&
qxl
->
vram_bar
,
memory_region_init_alias
(
&
qxl
->
vram32_bar
,
"qxl.vram32"
,
&
qxl
->
vram_bar
,
...
@@ -2042,8 +2043,8 @@ static int qxl_post_load(void *opaque, int version)
...
@@ -2042,8 +2043,8 @@ static int qxl_post_load(void *opaque, int version)
qxl_create_guest_primary
(
d
,
1
,
QXL_SYNC
);
qxl_create_guest_primary
(
d
,
1
,
QXL_SYNC
);
/* replay surface-create and cursor-set commands */
/* replay surface-create and cursor-set commands */
cmds
=
g_malloc0
(
sizeof
(
QXLCommandExt
)
*
(
NUM_SURFACES
+
1
));
cmds
=
g_malloc0
(
sizeof
(
QXLCommandExt
)
*
(
d
->
ssd
.
num_surfaces
+
1
));
for
(
in
=
0
,
out
=
0
;
in
<
NUM_SURFACES
;
in
++
)
{
for
(
in
=
0
,
out
=
0
;
in
<
d
->
ssd
.
num_surfaces
;
in
++
)
{
if
(
d
->
guest_surfaces
.
cmds
[
in
]
==
0
)
{
if
(
d
->
guest_surfaces
.
cmds
[
in
]
==
0
)
{
continue
;
continue
;
}
}
...
@@ -2143,8 +2144,9 @@ static VMStateDescription qxl_vmstate = {
...
@@ -2143,8 +2144,9 @@ static VMStateDescription qxl_vmstate = {
qxl_memslot
,
struct
guest_slots
),
qxl_memslot
,
struct
guest_slots
),
VMSTATE_STRUCT
(
guest_primary
.
surface
,
PCIQXLDevice
,
0
,
VMSTATE_STRUCT
(
guest_primary
.
surface
,
PCIQXLDevice
,
0
,
qxl_surface
,
QXLSurfaceCreate
),
qxl_surface
,
QXLSurfaceCreate
),
VMSTATE_INT32_EQUAL
(
num_surfaces
,
PCIQXLDevice
),
VMSTATE_INT32_EQUAL
(
ssd
.
num_surfaces
,
PCIQXLDevice
),
VMSTATE_ARRAY
(
guest_surfaces
.
cmds
,
PCIQXLDevice
,
NUM_SURFACES
,
0
,
VMSTATE_VARRAY_INT32
(
guest_surfaces
.
cmds
,
PCIQXLDevice
,
ssd
.
num_surfaces
,
0
,
vmstate_info_uint64
,
uint64_t
),
vmstate_info_uint64
,
uint64_t
),
VMSTATE_UINT64
(
guest_cursor
,
PCIQXLDevice
),
VMSTATE_UINT64
(
guest_cursor
,
PCIQXLDevice
),
VMSTATE_END_OF_LIST
()
VMSTATE_END_OF_LIST
()
...
@@ -2173,6 +2175,7 @@ static Property qxl_properties[] = {
...
@@ -2173,6 +2175,7 @@ static Property qxl_properties[] = {
DEFINE_PROP_UINT32
(
"vram_size_mb"
,
PCIQXLDevice
,
vram32_size_mb
,
-
1
),
DEFINE_PROP_UINT32
(
"vram_size_mb"
,
PCIQXLDevice
,
vram32_size_mb
,
-
1
),
DEFINE_PROP_UINT32
(
"vram64_size_mb"
,
PCIQXLDevice
,
vram_size_mb
,
-
1
),
DEFINE_PROP_UINT32
(
"vram64_size_mb"
,
PCIQXLDevice
,
vram_size_mb
,
-
1
),
DEFINE_PROP_UINT32
(
"vgamem_mb"
,
PCIQXLDevice
,
vgamem_size_mb
,
16
),
DEFINE_PROP_UINT32
(
"vgamem_mb"
,
PCIQXLDevice
,
vgamem_size_mb
,
16
),
DEFINE_PROP_INT32
(
"surfaces"
,
PCIQXLDevice
,
ssd
.
num_surfaces
,
1024
),
DEFINE_PROP_END_OF_LIST
(),
DEFINE_PROP_END_OF_LIST
(),
};
};
...
...
hw/qxl.h
浏览文件 @
ddd8fdc7
...
@@ -40,7 +40,6 @@ typedef struct PCIQXLDevice {
...
@@ -40,7 +40,6 @@ typedef struct PCIQXLDevice {
uint32_t
revision
;
uint32_t
revision
;
int32_t
num_memslots
;
int32_t
num_memslots
;
int32_t
num_surfaces
;
uint32_t
current_async
;
uint32_t
current_async
;
QemuMutex
async_lock
;
QemuMutex
async_lock
;
...
@@ -65,7 +64,7 @@ typedef struct PCIQXLDevice {
...
@@ -65,7 +64,7 @@ typedef struct PCIQXLDevice {
}
guest_primary
;
}
guest_primary
;
struct
surfaces
{
struct
surfaces
{
QXLPHYSICAL
cmds
[
NUM_SURFACES
]
;
QXLPHYSICAL
*
cmds
;
uint32_t
count
;
uint32_t
count
;
uint32_t
max
;
uint32_t
max
;
}
guest_surfaces
;
}
guest_surfaces
;
...
...
ui/spice-display.c
浏览文件 @
ddd8fdc7
...
@@ -317,6 +317,9 @@ void qemu_spice_display_init_common(SimpleSpiceDisplay *ssd, DisplayState *ds)
...
@@ -317,6 +317,9 @@ void qemu_spice_display_init_common(SimpleSpiceDisplay *ssd, DisplayState *ds)
qemu_mutex_init
(
&
ssd
->
lock
);
qemu_mutex_init
(
&
ssd
->
lock
);
ssd
->
mouse_x
=
-
1
;
ssd
->
mouse_x
=
-
1
;
ssd
->
mouse_y
=
-
1
;
ssd
->
mouse_y
=
-
1
;
if
(
ssd
->
num_surfaces
==
0
)
{
ssd
->
num_surfaces
=
1024
;
}
ssd
->
bufsize
=
(
16
*
1024
*
1024
);
ssd
->
bufsize
=
(
16
*
1024
*
1024
);
ssd
->
buf
=
g_malloc
(
ssd
->
bufsize
);
ssd
->
buf
=
g_malloc
(
ssd
->
bufsize
);
}
}
...
@@ -427,7 +430,7 @@ static void interface_get_init_info(QXLInstance *sin, QXLDevInitInfo *info)
...
@@ -427,7 +430,7 @@ static void interface_get_init_info(QXLInstance *sin, QXLDevInitInfo *info)
info
->
num_memslots_groups
=
NUM_MEMSLOTS_GROUPS
;
info
->
num_memslots_groups
=
NUM_MEMSLOTS_GROUPS
;
info
->
internal_groupslot_id
=
0
;
info
->
internal_groupslot_id
=
0
;
info
->
qxl_ram_size
=
ssd
->
bufsize
;
info
->
qxl_ram_size
=
ssd
->
bufsize
;
info
->
n_surfaces
=
NUM_SURFACES
;
info
->
n_surfaces
=
ssd
->
num_surfaces
;
}
}
static
int
interface_get_command
(
QXLInstance
*
sin
,
struct
QXLCommandExt
*
ext
)
static
int
interface_get_command
(
QXLInstance
*
sin
,
struct
QXLCommandExt
*
ext
)
...
...
ui/spice-display.h
浏览文件 @
ddd8fdc7
...
@@ -32,8 +32,6 @@
...
@@ -32,8 +32,6 @@
#define MEMSLOT_GROUP_GUEST 1
#define MEMSLOT_GROUP_GUEST 1
#define NUM_MEMSLOTS_GROUPS 2
#define NUM_MEMSLOTS_GROUPS 2
#define NUM_SURFACES 1024
/*
/*
* Internal enum to differenciate between options for
* Internal enum to differenciate between options for
* io calls that have a sync (old) version and an _async (new)
* io calls that have a sync (old) version and an _async (new)
...
@@ -80,6 +78,7 @@ struct SimpleSpiceDisplay {
...
@@ -80,6 +78,7 @@ struct SimpleSpiceDisplay {
QXLInstance
qxl
;
QXLInstance
qxl
;
uint32_t
unique
;
uint32_t
unique
;
QemuPfConv
*
conv
;
QemuPfConv
*
conv
;
int32_t
num_surfaces
;
QXLRect
dirty
;
QXLRect
dirty
;
int
notify
;
int
notify
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录