bool Surface::swap() { if (mSwapChain) { mDisplay->endScene(); HRESULT result = mSwapChain->Present(NULL, NULL, NULL, NULL, 0); if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_DRIVERINTERNALERROR) { return error(EGL_BAD_ALLOC, false); } if (result == D3DERR_DEVICELOST) { return error(EGL_CONTEXT_LOST, false); } ASSERT(SUCCEEDED(result)); checkForOutOfDateSwapChain(); } return true; }
egl::Error SurfaceD3D::swapRect(EGLint x, EGLint y, EGLint width, EGLint height) { if (!mSwapChain) { return egl::Error(EGL_SUCCESS); } #if !defined(ANGLE_ENABLE_WINDOWS_STORE) || (defined(ANGLE_ENABLE_WINDOWS_STORE) && WINAPI_FAMILY == WINAPI_FAMILY_PC_APP) // Qt WP: eglPostSubBufferNV comes here if (x + width > mWidth) { width = mWidth - x; } if (y + height > mHeight) { height = mHeight - y; } #endif if (width == 0 || height == 0) { checkForOutOfDateSwapChain(); return egl::Error(EGL_SUCCESS); } EGLint status = mSwapChain->swapRect(x, y, width, height); if (status == EGL_CONTEXT_LOST) { mRenderer->notifyDeviceLost(); return egl::Error(status); } else if (status != EGL_SUCCESS) { return egl::Error(status); } checkForOutOfDateSwapChain(); return egl::Error(EGL_SUCCESS); }
Error Surface::swapRect(EGLint x, EGLint y, EGLint width, EGLint height) { if (!mSwapChain) { return Error(EGL_SUCCESS); } if (x + width > abs(mWidth)) { width = abs(mWidth) - x; } if (y + height > abs(mHeight)) { height = abs(mHeight) - y; } if (width == 0 || height == 0) { return Error(EGL_SUCCESS); } ASSERT(width > 0); ASSERT(height > 0); EGLint status = mSwapChain->swapRect(x, y, width, height); if (status == EGL_CONTEXT_LOST) { mRenderer->notifyDeviceLost(); return Error(status); } else if (status != EGL_SUCCESS) { return Error(status); } checkForOutOfDateSwapChain(); return Error(EGL_SUCCESS); }
egl::Error SurfaceD3D::swapRect(EGLint x, EGLint y, EGLint width, EGLint height) { if (!mSwapChain) { return egl::Error(EGL_SUCCESS); } if (x + width > mWidth) { width = mWidth - x; } if (y + height > mHeight) { height = mHeight - y; } if (width == 0 || height == 0) { return egl::Error(EGL_SUCCESS); } EGLint status = mSwapChain->swapRect(x, y, width, height); if (status == EGL_CONTEXT_LOST) { mRenderer->notifyDeviceLost(); return egl::Error(status); } else if (status != EGL_SUCCESS) { return egl::Error(status); } checkForOutOfDateSwapChain(); return egl::Error(EGL_SUCCESS); }
bool Surface::swapRect(EGLint x, EGLint y, EGLint width, EGLint height) { if (!mSwapChain) { return true; } if (x + width > mWidth) { width = mWidth - x; } if (y + height > mHeight) { height = mHeight - y; } if (width == 0 || height == 0) { return true; } IDirect3DDevice9 *device = mDisplay->getDevice(); // Disable all pipeline operations device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); device->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); device->SetRenderState(D3DRS_STENCILENABLE, FALSE); device->SetRenderState(D3DRS_CLIPPLANEENABLE, 0); device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED); device->SetRenderState(D3DRS_SRGBWRITEENABLE, FALSE); device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); device->SetPixelShader(NULL); device->SetVertexShader(NULL); device->SetRenderTarget(0, mBackBuffer); device->SetDepthStencilSurface(NULL); device->SetTexture(0, mOffscreenTexture); device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); device->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); device->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1); D3DVIEWPORT9 viewport = {0, 0, mWidth, mHeight, 0.0f, 1.0f}; device->SetViewport(&viewport); float x1 = x - 0.5f; float y1 = (mHeight - y - height) - 0.5f; float x2 = (x + width) - 0.5f; float y2 = (mHeight - y) - 0.5f; float u1 = x / float(mWidth); float v1 = y / float(mHeight); float u2 = (x + width) / float(mWidth); float v2 = (y + height) / float(mHeight); float quad[4][6] = {{x1, y1, 0.0f, 1.0f, u1, v2}, {x2, y1, 0.0f, 1.0f, u2, v2}, {x2, y2, 0.0f, 1.0f, u2, v1}, {x1, y2, 0.0f, 1.0f, u1, v1}}; // x, y, z, rhw, u, v mDisplay->startScene(); device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, quad, 6 * sizeof(float)); mDisplay->endScene(); device->SetTexture(0, NULL); RECT rect = { x, mHeight - y - height, x + width, mHeight - y }; HRESULT result = mSwapChain->Present(&rect, &rect, NULL, NULL, 0); gl::Context *context = static_cast<gl::Context*>(glGetCurrentContext()); if (context) { context->markAllStateDirty(); } if (isDeviceLostError(result)) { mDisplay->notifyDeviceLost(); return false; } if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_DRIVERINTERNALERROR) { return error(EGL_BAD_ALLOC, false); } ASSERT(SUCCEEDED(result)); checkForOutOfDateSwapChain(); return true; }
void Surface::onWindowSizeChanged() { checkForOutOfDateSwapChain(); }