Changeset 44802 in vbox for trunk/src/VBox/GuestHost/OpenGL/state_tracker
- Timestamp:
- Feb 22, 2013 2:34:46 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 83921
- Location:
- trunk/src/VBox/GuestHost/OpenGL/state_tracker
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_diff.c
r44290 r44802 123 123 } 124 124 125 void crStateFreeFBImage (CRContext *to)125 void crStateFreeFBImageLegacy(CRContext *to) 126 126 { 127 127 if (to->buffer.pFrontImg) … … 140 140 } 141 141 142 int crStateAcquireFBImage(CRContext *to )142 int crStateAcquireFBImage(CRContext *to, CRFBData *data) 143 143 { 144 144 CRBufferState *pBuf = &to->buffer; 145 145 CRPixelPackState packing = to->client.pack; 146 GLint cbData; 147 void *pFbData, *pBbData; 148 149 crStateFreeFBImage(to); 150 151 if (!to->buffer.width || !to->buffer.height) 152 return VINF_SUCCESS; 153 154 cbData = crPixelSize(GL_RGBA, GL_UNSIGNED_BYTE) * pBuf->width * pBuf->height; 155 pFbData = crAlloc(cbData); 156 if (!pFbData) 157 return VERR_NO_MEMORY; 158 pBbData = crAlloc(cbData); 159 if (!pBbData) 160 { 161 crFree(pFbData); 162 return VERR_NO_MEMORY; 163 } 146 uint32_t i; 164 147 165 148 diff_api.PixelStorei(GL_PACK_SKIP_ROWS, 0); … … 172 155 diff_api.PixelStorei(GL_PACK_LSB_FIRST, 0); 173 156 157 if (to->bufferobject.packBuffer->hwid>0) 158 { 159 diff_api.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); 160 } 161 162 for (i = 0; i < data->cElements; ++i) 163 { 164 CRFBDataElement *el = &data->aElements[i]; 165 166 diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, el->idFBO); 167 168 if (el->enmBuffer) 169 diff_api.ReadBuffer(el->enmBuffer); 170 171 diff_api.ReadPixels(el->posX, el->posY, el->width, el->height, el->enmFormat, el->enmType, el->pvData); 172 crDebug("Acquired %d;%d;%d;%d;%d;0x%p fb image", el->enmBuffer, el->width, el->height, el->enmFormat, el->enmType, el->pvData); 173 } 174 175 if (to->bufferobject.packBuffer->hwid>0) 176 { 177 diff_api.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, to->bufferobject.packBuffer->hwid); 178 } 174 179 if (to->framebufferobject.readFB) 175 180 { 181 CRASSERT(to->framebufferobject.readFB->hwid); 182 diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, to->framebufferobject.readFB->hwid); 183 diff_api.ReadBuffer(to->framebufferobject.readFB->readbuffer); 184 185 } 186 else if (data->idFBO) 187 { 188 diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, data->idFBO); 189 diff_api.ReadBuffer(GL_COLOR_ATTACHMENT0); 190 } 191 else 192 { 176 193 diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, 0); 177 } 178 if (to->bufferobject.packBuffer->hwid>0) 179 { 180 diff_api.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); 181 } 182 183 pBuf->storedWidth = pBuf->width; 184 pBuf->storedHeight = pBuf->height; 185 diff_api.ReadBuffer(GL_FRONT); 186 diff_api.ReadPixels(0, 0, pBuf->width, pBuf->height, GL_RGBA, GL_UNSIGNED_BYTE, pFbData); 187 to->buffer.pFrontImg = pFbData; 188 189 diff_api.ReadBuffer(GL_BACK); 190 diff_api.ReadPixels(0, 0, pBuf->width, pBuf->height, GL_RGBA, GL_UNSIGNED_BYTE, pBbData); 191 to->buffer.pBackImg = pBbData; 192 193 if (to->bufferobject.packBuffer->hwid>0) 194 { 195 diff_api.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, to->bufferobject.packBuffer->hwid); 196 } 197 if (to->framebufferobject.readFB) 198 { 199 diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, to->framebufferobject.readFB->hwid); 200 } 201 diff_api.ReadBuffer(to->framebufferobject.readFB ? 202 to->framebufferobject.readFB->readbuffer : to->buffer.readBuffer); 194 diff_api.ReadBuffer(to->buffer.readBuffer); 195 } 203 196 204 197 diff_api.PixelStorei(GL_PACK_SKIP_ROWS, packing.skipRows); … … 213 206 } 214 207 215 void crStateApplyFBImage(CRContext *to) 216 { 217 if (to->buffer.pFrontImg || to->buffer.pBackImg) 208 void crStateApplyFBImage(CRContext *to, CRFBData *data) 209 { 218 210 { 219 211 CRBufferState *pBuf = &to->buffer; 220 212 CRPixelPackState unpack = to->client.unpack; 213 uint32_t i; 221 214 222 215 diff_api.PixelStorei(GL_UNPACK_SKIP_ROWS, 0); … … 229 222 diff_api.PixelStorei(GL_UNPACK_LSB_FIRST, 0); 230 223 231 if (to->framebufferobject.drawFB)232 {233 diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, 0);234 }235 236 224 if (to->bufferobject.unpackBuffer->hwid>0) 237 225 { … … 244 232 diff_api.Disable(GL_COLOR_LOGIC_OP); 245 233 246 if (pBuf->pFrontImg) 247 { 248 diff_api.DrawBuffer(GL_FRONT); 249 diff_api.WindowPos2iARB(0, 0); 250 diff_api.DrawPixels(pBuf->storedWidth, pBuf->storedHeight, GL_RGBA, GL_UNSIGNED_BYTE, pBuf->pFrontImg); 251 crDebug("Applied %ix%i fb image", pBuf->storedWidth, pBuf->storedHeight); 252 crFree(pBuf->pFrontImg); 253 pBuf->pFrontImg = NULL; 254 } 255 256 if (pBuf->pBackImg) 257 { 258 diff_api.DrawBuffer(GL_BACK); 259 diff_api.WindowPos2iARB(0, 0); 260 diff_api.DrawPixels(pBuf->storedWidth, pBuf->storedHeight, GL_RGBA, GL_UNSIGNED_BYTE, pBuf->pBackImg); 261 crDebug("Applied %ix%i bb image", pBuf->storedWidth, pBuf->storedHeight); 262 crFree(pBuf->pBackImg); 263 pBuf->pBackImg = NULL; 234 for (i = 0; i < data->cElements; ++i) 235 { 236 CRFBDataElement *el = &data->aElements[i]; 237 238 switch (el->enmFormat) 239 { 240 case GL_DEPTH_COMPONENT: 241 diff_api.Enable(GL_DEPTH_TEST); 242 break; 243 case GL_STENCIL_INDEX: 244 diff_api.Enable(GL_STENCIL_TEST); 245 break; 246 default: 247 break; 248 } 249 250 diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, el->idFBO); 251 252 if (el->enmBuffer) 253 diff_api.DrawBuffer(el->enmBuffer); 254 255 diff_api.WindowPos2iARB(el->posX, el->posY); 256 diff_api.DrawPixels(el->width, el->height, el->enmFormat, el->enmType, el->pvData); 257 crDebug("Applied %d;%d;%d;%d;%d;0x%p fb image", el->enmBuffer, el->width, el->height, el->enmFormat, el->enmType, el->pvData); 258 259 switch (el->enmFormat) 260 { 261 case GL_DEPTH_COMPONENT: 262 if (!to->buffer.depthTest) 263 { 264 diff_api.Disable(GL_DEPTH_TEST); 265 } 266 break; 267 case GL_STENCIL_INDEX: 268 if (!to->stencil.stencilTest) 269 { 270 diff_api.Disable(GL_STENCIL_TEST); 271 } 272 break; 273 default: 274 break; 275 } 276 264 277 } 265 278 … … 271 284 if (to->framebufferobject.drawFB) 272 285 { 286 CRASSERT(to->framebufferobject.drawFB->hwid); 273 287 diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, to->framebufferobject.drawFB->hwid); 274 } 275 diff_api.DrawBuffer(to->framebufferobject.drawFB ? 276 to->framebufferobject.drawFB->drawbuffer[0] : to->buffer.drawBuffer); 288 diff_api.DrawBuffer(to->framebufferobject.drawFB->drawbuffer[0]); 289 } 290 else if (data->idFBO) 291 { 292 diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, data->idFBO); 293 diff_api.DrawBuffer(GL_COLOR_ATTACHMENT0); 294 } 295 else 296 { 297 diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, 0); 298 diff_api.DrawBuffer(to->buffer.drawBuffer); 299 } 277 300 if (to->buffer.alphaTest) 278 301 { … … 433 456 434 457 #ifdef WINDOWS 435 crStateApplyFBImage(to); 458 if (to->buffer.pFrontImg) 459 { 460 CRFBData *pLazyData = (CRFBData *)to->buffer.pFrontImg; 461 crStateApplyFBImage(to, pLazyData); 462 crStateFreeFBImageLegacy(to); 463 } 436 464 #endif 437 465 } -
trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_snapshot.c
r44529 r44802 1398 1398 CRASSERT(pContext && pSSM); 1399 1399 1400 pContext->buffer.storedWidth = pContext->buffer.width; 1401 pContext->buffer.storedHeight = pContext->buffer.height; 1400 /* this stuff is not used anymore, zero it up for sanity */ 1401 pContext->buffer.storedWidth = 0; 1402 pContext->buffer.storedHeight = 0; 1402 1403 1403 1404 CRASSERT(VBoxTlsRefIsFunctional(pContext));
Note:
See TracChangeset
for help on using the changeset viewer.