VirtualBox

source: vbox/trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/presenter/display_window_rootvr.cpp@ 80334

最後變更 在這個檔案從80334是 78263,由 vboxsync 提交於 6 年 前

Config.kmk,GuestHost\OpenGL,HostServices\SharedOpenGL: Fix a bunch of compiler warnings and enable them again

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Author Date Id Revision
檔案大小: 8.9 KB
 
1/* $Id: display_window_rootvr.cpp 78263 2019-04-23 18:41:06Z vboxsync $ */
2
3/** @file
4 * Presenter API: CrFbDisplayWindowRootVr class implementation -- display seamless content (visible regions).
5 */
6
7/*
8 * Copyright (C) 2014-2019 Oracle Corporation
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.alldomusa.eu.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 */
18
19#include "server_presenter.h"
20
21
22CrFbDisplayWindowRootVr::CrFbDisplayWindowRootVr(const RTRECT *pViewportRect, uint64_t parentId) :
23 CrFbDisplayWindow(pViewportRect, parentId)
24{
25 CrVrScrCompositorInit(&mCompositor, NULL);
26}
27
28
29int CrFbDisplayWindowRootVr::EntryCreated(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hEntry)
30{
31 int rc = CrFbDisplayWindow::EntryCreated(pFb, hEntry);
32 if (!RT_SUCCESS(rc))
33 {
34 WARN(("err"));
35 return rc;
36 }
37
38 Assert(!CrFbDDataEntryGet(hEntry, slotGet()));
39
40 const VBOXVR_SCR_COMPOSITOR_ENTRY* pSrcEntry = CrFbEntryGetCompositorEntry(hEntry);
41 VBOXVR_SCR_COMPOSITOR_ENTRY *pMyEntry = entryAlloc();
42 CrVrScrCompositorEntryInit(pMyEntry, CrVrScrCompositorEntryRectGet(pSrcEntry), CrVrScrCompositorEntryTexGet(pSrcEntry), NULL);
43 CrVrScrCompositorEntryFlagsSet(pMyEntry, CrVrScrCompositorEntryFlagsGet(pSrcEntry));
44 rc = CrFbDDataEntryPut(hEntry, slotGet(), pMyEntry);
45 if (!RT_SUCCESS(rc))
46 {
47 WARN(("CrFbDDataEntryPut failed rc %d", rc));
48 entryFree(pMyEntry);
49 return rc;
50 }
51
52 return VINF_SUCCESS;
53}
54
55
56int CrFbDisplayWindowRootVr::EntryAdded(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hEntry)
57{
58 int rc = CrFbDisplayWindow::EntryAdded(pFb, hEntry);
59 if (!RT_SUCCESS(rc))
60 {
61 WARN(("err"));
62 return rc;
63 }
64
65 const VBOXVR_SCR_COMPOSITOR_ENTRY* pSrcEntry = CrFbEntryGetCompositorEntry(hEntry);
66 VBOXVR_SCR_COMPOSITOR_ENTRY *pMyEntry = (VBOXVR_SCR_COMPOSITOR_ENTRY*)CrFbDDataEntryGet(hEntry, slotGet());
67 Assert(pMyEntry);
68 CrVrScrCompositorEntryTexSet(pMyEntry, CrVrScrCompositorEntryTexGet(pSrcEntry));
69
70 return VINF_SUCCESS;
71}
72
73
74int CrFbDisplayWindowRootVr::EntryReplaced(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hNewEntry, HCR_FRAMEBUFFER_ENTRY hReplacedEntry)
75{
76 int rc = CrFbDisplayWindow::EntryReplaced(pFb, hNewEntry, hReplacedEntry);
77 if (!RT_SUCCESS(rc))
78 {
79 WARN(("err"));
80 return rc;
81 }
82
83 const VBOXVR_SCR_COMPOSITOR_ENTRY* pSrcNewEntry = CrFbEntryGetCompositorEntry(hNewEntry);
84 VBOXVR_SCR_COMPOSITOR_ENTRY *pMyEntry = (VBOXVR_SCR_COMPOSITOR_ENTRY*)CrFbDDataEntryGet(hNewEntry, slotGet());
85 CrVrScrCompositorEntryTexSet(pMyEntry, CrVrScrCompositorEntryTexGet(pSrcNewEntry));
86
87 return VINF_SUCCESS;
88}
89
90
91int CrFbDisplayWindowRootVr::EntryTexChanged(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hEntry)
92{
93 int rc = CrFbDisplayWindow::EntryTexChanged(pFb, hEntry);
94 if (!RT_SUCCESS(rc))
95 {
96 WARN(("err"));
97 return rc;
98 }
99
100 const VBOXVR_SCR_COMPOSITOR_ENTRY* pSrcEntry = CrFbEntryGetCompositorEntry(hEntry);
101 VBOXVR_SCR_COMPOSITOR_ENTRY *pMyEntry = (VBOXVR_SCR_COMPOSITOR_ENTRY*)CrFbDDataEntryGet(hEntry, slotGet());
102 CrVrScrCompositorEntryTexSet(pMyEntry, CrVrScrCompositorEntryTexGet(pSrcEntry));
103
104 return VINF_SUCCESS;
105}
106
107
108int CrFbDisplayWindowRootVr::EntryRemoved(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hEntry)
109{
110 int rc = CrFbDisplayWindow::EntryRemoved(pFb, hEntry);
111 if (!RT_SUCCESS(rc))
112 {
113 WARN(("err"));
114 return rc;
115 }
116
117 VBOXVR_SCR_COMPOSITOR_ENTRY *pMyEntry = (VBOXVR_SCR_COMPOSITOR_ENTRY*)CrFbDDataEntryGet(hEntry, slotGet());
118 rc = CrVrScrCompositorEntryRegionsSet(&mCompositor, pMyEntry, NULL, 0, NULL, false, NULL);
119 if (!RT_SUCCESS(rc))
120 {
121 WARN(("err"));
122 return rc;
123 }
124
125 return VINF_SUCCESS;
126}
127
128
129int CrFbDisplayWindowRootVr::EntryDestroyed(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hEntry)
130{
131 int rc = CrFbDisplayWindow::EntryDestroyed(pFb, hEntry);
132 if (!RT_SUCCESS(rc))
133 {
134 WARN(("err"));
135 return rc;
136 }
137
138 VBOXVR_SCR_COMPOSITOR_ENTRY *pMyEntry = (VBOXVR_SCR_COMPOSITOR_ENTRY*)CrFbDDataEntryGet(hEntry, slotGet());
139 CrVrScrCompositorEntryCleanup(pMyEntry);
140 entryFree(pMyEntry);
141
142 return VINF_SUCCESS;
143}
144
145
146int CrFbDisplayWindowRootVr::setViewportRect(const RTRECT *pViewportRect)
147{
148 int rc = CrFbDisplayWindow::setViewportRect(pViewportRect);
149 if (!RT_SUCCESS(rc))
150 {
151 WARN(("err"));
152 return rc;
153 }
154
155 rc = setRegionsChanged();
156 if (!RT_SUCCESS(rc))
157 {
158 WARN(("err"));
159 return rc;
160 }
161
162 return VINF_SUCCESS;
163}
164
165
166int CrFbDisplayWindowRootVr::windowSetCompositor(bool fSet)
167{
168 if (fSet)
169 return getWindow()->SetCompositor(&mCompositor);
170 return getWindow()->SetCompositor(NULL);
171}
172
173
174void CrFbDisplayWindowRootVr::ueRegions()
175{
176 synchCompositorRegions();
177}
178
179
180int CrFbDisplayWindowRootVr::compositorMarkUpdated()
181{
182 CrVrScrCompositorClear(&mCompositor);
183
184 int rc = CrVrScrCompositorRectSet(&mCompositor, CrVrScrCompositorRectGet(CrFbGetCompositor(getFramebuffer())), NULL);
185 if (!RT_SUCCESS(rc))
186 {
187 WARN(("err"));
188 return rc;
189 }
190
191 rc = setRegionsChanged();
192 if (!RT_SUCCESS(rc))
193 {
194 WARN(("screenChanged failed %d", rc));
195 return rc;
196 }
197
198 return VINF_SUCCESS;
199}
200
201
202int CrFbDisplayWindowRootVr::screenChanged()
203{
204 int rc = compositorMarkUpdated();
205 if (!RT_SUCCESS(rc))
206 {
207 WARN(("err"));
208 return rc;
209 }
210
211 rc = CrFbDisplayWindow::screenChanged();
212 if (!RT_SUCCESS(rc))
213 {
214 WARN(("screenChanged failed %d", rc));
215 return rc;
216 }
217
218 return VINF_SUCCESS;
219}
220
221
222const struct RTRECT* CrFbDisplayWindowRootVr::getRect()
223{
224 return CrVrScrCompositorRectGet(&mCompositor);
225}
226
227int CrFbDisplayWindowRootVr::fbCleanup()
228{
229 int rc = clearCompositor();
230 if (!RT_SUCCESS(rc))
231 {
232 WARN(("err"));
233 return rc;
234 }
235
236 return CrFbDisplayWindow::fbCleanup();
237}
238
239
240int CrFbDisplayWindowRootVr::fbSync()
241{
242 int rc = synchCompositor();
243 if (!RT_SUCCESS(rc))
244 {
245 WARN(("err"));
246 return rc;
247 }
248
249 return CrFbDisplayWindow::fbSync();
250}
251
252
253VBOXVR_SCR_COMPOSITOR_ENTRY* CrFbDisplayWindowRootVr::entryAlloc()
254{
255#ifndef VBOXVDBG_MEMCACHE_DISABLE
256 return (VBOXVR_SCR_COMPOSITOR_ENTRY*)RTMemCacheAlloc(g_CrPresenter.CEntryLookasideList);
257#else
258 return (VBOXVR_SCR_COMPOSITOR_ENTRY*)RTMemAlloc(sizeof (VBOXVR_SCR_COMPOSITOR_ENTRY));
259#endif
260}
261
262
263void CrFbDisplayWindowRootVr::entryFree(VBOXVR_SCR_COMPOSITOR_ENTRY* pEntry)
264{
265 Assert(!CrVrScrCompositorEntryIsUsed(pEntry));
266#ifndef VBOXVDBG_MEMCACHE_DISABLE
267 RTMemCacheFree(g_CrPresenter.CEntryLookasideList, pEntry);
268#else
269 RTMemFree(pEntry);
270#endif
271}
272
273
274int CrFbDisplayWindowRootVr::synchCompositorRegions()
275{
276 int rc;
277
278 rootVrTranslateForPos();
279
280 /* ensure the rootvr compositor does not hold any data,
281 * i.e. cleanup all rootvr entries data */
282 CrVrScrCompositorClear(&mCompositor);
283
284 rc = CrVrScrCompositorIntersectedList(CrFbGetCompositor(getFramebuffer()), &cr_server.RootVr, &mCompositor, rootVrGetCEntry, this, NULL);
285 if (!RT_SUCCESS(rc))
286 {
287 WARN(("CrVrScrCompositorIntersectedList failed, rc %d", rc));
288 return rc;
289 }
290
291 return getWindow()->SetVisibleRegionsChanged();
292}
293
294
295int CrFbDisplayWindowRootVr::synchCompositor()
296{
297 int rc = compositorMarkUpdated();
298 if (!RT_SUCCESS(rc))
299 {
300 WARN(("compositorMarkUpdated failed, rc %d", rc));
301 return rc;
302 }
303
304 rc = fbSynchAddAllEntries();
305 if (!RT_SUCCESS(rc))
306 {
307 WARN(("fbSynchAddAllEntries failed, rc %d", rc));
308 return rc;
309 }
310
311 return rc;
312}
313
314
315int CrFbDisplayWindowRootVr::clearCompositor()
316{
317 return fbCleanupRemoveAllEntries();
318}
319
320
321void CrFbDisplayWindowRootVr::rootVrTranslateForPos()
322{
323 const struct VBVAINFOSCREEN* pScreen = CrFbGetScreenInfo(getFramebuffer());
324 int32_t x = pScreen->i32OriginX;
325 int32_t y = pScreen->i32OriginY;
326 int32_t dx = cr_server.RootVrCurPoint.x - x;
327 int32_t dy = cr_server.RootVrCurPoint.y - y;
328
329 cr_server.RootVrCurPoint.x = x;
330 cr_server.RootVrCurPoint.y = y;
331
332 VBoxVrListTranslate(&cr_server.RootVr, dx, dy);
333}
334
335
336DECLCALLBACK(VBOXVR_SCR_COMPOSITOR_ENTRY*) CrFbDisplayWindowRootVr::rootVrGetCEntry(const VBOXVR_SCR_COMPOSITOR_ENTRY*pEntry, void *pvContext)
337{
338 CrFbDisplayWindowRootVr *pThis = (CrFbDisplayWindowRootVr*)pvContext;
339 HCR_FRAMEBUFFER_ENTRY hEntry = CrFbEntryFromCompositorEntry(pEntry);
340 VBOXVR_SCR_COMPOSITOR_ENTRY *pMyEntry = (VBOXVR_SCR_COMPOSITOR_ENTRY*)CrFbDDataEntryGet(hEntry, pThis->slotGet());
341 Assert(!CrVrScrCompositorEntryIsUsed(pMyEntry));
342 CrVrScrCompositorEntryRectSet(&pThis->mCompositor, pMyEntry, CrVrScrCompositorEntryRectGet(pEntry));
343 return pMyEntry;
344}
345
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette