Changeset 28197 in vbox for trunk/src/VBox/HostServices/SharedOpenGL/crserverlib
- Timestamp:
- Apr 12, 2010 11:50:37 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 59935
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.c
r27892 r28197 258 258 } 259 259 260 #define MIN(a, b) ((a) < (b) ? (a) : (b)) 261 #define MAX(a, b) ((a) > (b) ? (a) : (b)) 262 263 static GLboolean crServerIntersectScreen(CRMuralInfo *mural, int sId, CRrecti *rect) 264 { 265 rect->x1 = MAX(mural->gX, cr_server.screen[sId].x); 266 rect->x2 = MIN(mural->gX+(int)mural->fboWidth, cr_server.screen[sId].x+(int)cr_server.screen[sId].w); 267 rect->y1 = MAX(mural->gY, cr_server.screen[sId].y); 268 rect->y2 = MIN(mural->gY+(int)mural->fboHeight, cr_server.screen[sId].y+(int)cr_server.screen[sId].h); 269 270 return (rect->x2>rect->x1) && (rect->y2>rect->y1); 271 } 272 260 273 void crServerPresentFBO(CRMuralInfo *mural) 261 274 { 262 char *pixels ;275 char *pixels, *tmppixels, *pSrc, *pDst; 263 276 GLuint uid; 277 int i, j, rowsize, rowstride, height; 278 CRrecti rect; 264 279 CRContext *ctx = crStateGetCurrent(); 265 280 … … 274 289 275 290 cr_server.head_spu->dispatch_table.BindTexture(GL_TEXTURE_2D, mural->idColorTex); 276 cr_server.head_spu->dispatch_table.GetTexImage(GL_TEXTURE_2D, 0, GL_ RGBA, GL_UNSIGNED_BYTE, pixels);291 cr_server.head_spu->dispatch_table.GetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_BYTE, pixels); 277 292 uid = ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D->name; 278 293 cr_server.head_spu->dispatch_table.BindTexture(GL_TEXTURE_2D, uid); 279 294 280 /*@todo render parts on the different screens*/ 281 cr_server.pfnPresentFBO(pixels, mural->screenId, 0, 0, mural->fboWidth, mural->fboHeight); 282 295 for (i=0; i<cr_server.screenCount; ++i) 296 { 297 if (crServerIntersectScreen(mural, i, &rect)) 298 { 299 rowsize = 4*RT_ALIGN_Z(rect.x2-rect.x1, 4); 300 tmppixels = crAlloc(rowsize*(rect.y2-rect.y1)); 301 if (!tmppixels) 302 { 303 crWarning("Out of memory in crServerPresentFBO"); 304 crFree(pixels); 305 return; 306 } 307 rowstride = 4*mural->fboWidth; 308 height = rect.y2-rect.y1; 309 310 pSrc = pixels + 4*(rect.x1-mural->gX) + rowstride*(rect.y2-mural->gY-1); 311 pDst = tmppixels; 312 313 for (j=0; j<height; ++j) 314 { 315 crMemcpy(pDst, pSrc, rowsize); 316 317 pSrc -= rowstride; 318 pDst += rowsize; 319 } 320 321 cr_server.pfnPresentFBO(tmppixels, i, rect.x1, rect.y1, rect.x2-rect.x1, height); 322 323 crFree(tmppixels); 324 } 325 } 283 326 crFree(pixels); 284 327 }
Note:
See TracChangeset
for help on using the changeset viewer.