gl::Error Framebuffer11::clear(const gl::State &state, const ClearParameters &clearParams) { Clear11 *clearer = mRenderer->getClearer(); gl::Error error = clearer->clearFramebuffer(clearParams, mData); if (error.isError()) { return error; } error = invalidateSwizzles(); if (error.isError()) { return error; } return gl::Error(GL_NO_ERROR); }
gl::Error Framebuffer11::clear(const gl::Data &data, const ClearParameters &clearParams) { Clear11 *clearer = mRenderer->getClearer(); gl::Error error(GL_NO_ERROR); const gl::FramebufferAttachment *colorAttachment = mData.getFirstColorAttachment(); if (clearParams.scissorEnabled == true && colorAttachment != nullptr && UsePresentPathFast(mRenderer, colorAttachment)) { // If the current framebuffer is using the default colorbuffer, and present path fast is // active, and the scissor rect is enabled, then we should invert the scissor rect // vertically ClearParameters presentPathFastClearParams = clearParams; gl::Extents framebufferSize = colorAttachment->getSize(); presentPathFastClearParams.scissor.y = framebufferSize.height - presentPathFastClearParams.scissor.y - presentPathFastClearParams.scissor.height; error = clearer->clearFramebuffer(presentPathFastClearParams, mData); } else { error = clearer->clearFramebuffer(clearParams, mData); } if (error.isError()) { return error; } error = invalidateSwizzles(); if (error.isError()) { return error; } return gl::Error(GL_NO_ERROR); }
gl::Error Framebuffer11::blit(const gl::Rectangle &sourceArea, const gl::Rectangle &destArea, const gl::Rectangle *scissor, bool blitRenderTarget, bool blitDepth, bool blitStencil, GLenum filter, const gl::Framebuffer *sourceFramebuffer) { if (blitRenderTarget) { const gl::FramebufferAttachment *readBuffer = sourceFramebuffer->getReadColorbuffer(); ASSERT(readBuffer); RenderTargetD3D *readRenderTarget = NULL; gl::Error error = GetAttachmentRenderTarget(readBuffer, &readRenderTarget); if (error.isError()) { return error; } ASSERT(readRenderTarget); for (size_t colorAttachment = 0; colorAttachment < mDrawBuffers.size(); colorAttachment++) { if (mColorBuffers[colorAttachment] != nullptr && mDrawBuffers[colorAttachment] != GL_NONE) { const gl::FramebufferAttachment *drawBuffer = mColorBuffers[colorAttachment]; RenderTargetD3D *drawRenderTarget = NULL; error = GetAttachmentRenderTarget(drawBuffer, &drawRenderTarget); if (error.isError()) { return error; } ASSERT(drawRenderTarget); error = mRenderer->blitRenderbufferRect(sourceArea, destArea, readRenderTarget, drawRenderTarget, filter, scissor, blitRenderTarget, false, false); if (error.isError()) { return error; } } } } if (blitDepth || blitStencil) { gl::FramebufferAttachment *readBuffer = sourceFramebuffer->getDepthOrStencilbuffer(); ASSERT(readBuffer); RenderTargetD3D *readRenderTarget = NULL; gl::Error error = GetAttachmentRenderTarget(readBuffer, &readRenderTarget); if (error.isError()) { return error; } ASSERT(readRenderTarget); const gl::FramebufferAttachment *drawBuffer = (mDepthbuffer != nullptr) ? mDepthbuffer : mStencilbuffer; ASSERT(drawBuffer); RenderTargetD3D *drawRenderTarget = NULL; error = GetAttachmentRenderTarget(drawBuffer, &drawRenderTarget); if (error.isError()) { return error; } ASSERT(drawRenderTarget); error = mRenderer->blitRenderbufferRect(sourceArea, destArea, readRenderTarget, drawRenderTarget, filter, scissor, false, blitDepth, blitStencil); if (error.isError()) { return error; } } gl::Error error = invalidateSwizzles(); if (error.isError()) { return error; } return gl::Error(GL_NO_ERROR); }
gl::Error Framebuffer11::blit(const gl::Rectangle &sourceArea, const gl::Rectangle &destArea, const gl::Rectangle *scissor, bool blitRenderTarget, bool blitDepth, bool blitStencil, GLenum filter, const gl::Framebuffer *sourceFramebuffer) { if (blitRenderTarget) { const gl::FramebufferAttachment *readBuffer = sourceFramebuffer->getReadColorbuffer(); ASSERT(readBuffer); RenderTargetD3D *readRenderTarget = nullptr; gl::Error error = readBuffer->getRenderTarget(&readRenderTarget); if (error.isError()) { return error; } ASSERT(readRenderTarget); const auto &colorAttachments = mData.getColorAttachments(); const auto &drawBufferStates = mData.getDrawBufferStates(); for (size_t colorAttachment = 0; colorAttachment < colorAttachments.size(); colorAttachment++) { const gl::FramebufferAttachment &drawBuffer = colorAttachments[colorAttachment]; if (drawBuffer.isAttached() && drawBufferStates[colorAttachment] != GL_NONE) { RenderTargetD3D *drawRenderTarget = nullptr; error = drawBuffer.getRenderTarget(&drawRenderTarget); if (error.isError()) { return error; } ASSERT(drawRenderTarget); const bool invertColorSource = UsePresentPathFast(mRenderer, readBuffer); gl::Rectangle actualSourceArea = sourceArea; if (invertColorSource) { RenderTarget11 *readRenderTarget11 = GetAs<RenderTarget11>(readRenderTarget); actualSourceArea.y = readRenderTarget11->getHeight() - sourceArea.y; actualSourceArea.height = -sourceArea.height; } const bool invertColorDest = UsePresentPathFast(mRenderer, &drawBuffer); gl::Rectangle actualDestArea = destArea; if (invertColorDest) { RenderTarget11 *drawRenderTarget11 = GetAs<RenderTarget11>(drawRenderTarget); actualDestArea.y = drawRenderTarget11->getHeight() - destArea.y; actualDestArea.height = -destArea.height; } error = mRenderer->blitRenderbufferRect(actualSourceArea, actualDestArea, readRenderTarget, drawRenderTarget, filter, scissor, blitRenderTarget, false, false); if (error.isError()) { return error; } } } } if (blitDepth || blitStencil) { const gl::FramebufferAttachment *readBuffer = sourceFramebuffer->getDepthOrStencilbuffer(); ASSERT(readBuffer); RenderTargetD3D *readRenderTarget = nullptr; gl::Error error = readBuffer->getRenderTarget(&readRenderTarget); if (error.isError()) { return error; } ASSERT(readRenderTarget); const gl::FramebufferAttachment *drawBuffer = mData.getDepthOrStencilAttachment(); ASSERT(drawBuffer); RenderTargetD3D *drawRenderTarget = nullptr; error = drawBuffer->getRenderTarget(&drawRenderTarget); if (error.isError()) { return error; } ASSERT(drawRenderTarget); error = mRenderer->blitRenderbufferRect(sourceArea, destArea, readRenderTarget, drawRenderTarget, filter, scissor, false, blitDepth, blitStencil); if (error.isError()) { return error; } } gl::Error error = invalidateSwizzles(); if (error.isError()) { return error; } return gl::Error(GL_NO_ERROR); }
gl::Error Framebuffer11::blit(const gl::Rectangle &sourceArea, const gl::Rectangle &destArea, const gl::Rectangle *scissor, bool blitRenderTarget, bool blitDepth, bool blitStencil, GLenum filter, const gl::Framebuffer *sourceFramebuffer) { if (blitRenderTarget) { const gl::FramebufferAttachment *readBuffer = sourceFramebuffer->getReadColorbuffer(); ASSERT(readBuffer); RenderTargetD3D *readRenderTarget = nullptr; gl::Error error = readBuffer->getRenderTarget(&readRenderTarget); if (error.isError()) { return error; } ASSERT(readRenderTarget); const auto &colorAttachments = mData.getColorAttachments(); const auto &drawBufferStates = mData.getDrawBufferStates(); for (size_t colorAttachment = 0; colorAttachment < colorAttachments.size(); colorAttachment++) { const gl::FramebufferAttachment &drawBuffer = colorAttachments[colorAttachment]; if (drawBuffer.isAttached() && drawBufferStates[colorAttachment] != GL_NONE) { RenderTargetD3D *drawRenderTarget = nullptr; error = drawBuffer.getRenderTarget(&drawRenderTarget); if (error.isError()) { return error; } ASSERT(drawRenderTarget); error = mRenderer->blitRenderbufferRect(sourceArea, destArea, readRenderTarget, drawRenderTarget, filter, scissor, blitRenderTarget, false, false); if (error.isError()) { return error; } } } } if (blitDepth || blitStencil) { const gl::FramebufferAttachment *readBuffer = sourceFramebuffer->getDepthOrStencilbuffer(); ASSERT(readBuffer); RenderTargetD3D *readRenderTarget = nullptr; gl::Error error = readBuffer->getRenderTarget(&readRenderTarget); if (error.isError()) { return error; } ASSERT(readRenderTarget); const gl::FramebufferAttachment *drawBuffer = mData.getDepthOrStencilAttachment(); ASSERT(drawBuffer); RenderTargetD3D *drawRenderTarget = nullptr; error = drawBuffer->getRenderTarget(&drawRenderTarget); if (error.isError()) { return error; } ASSERT(drawRenderTarget); error = mRenderer->blitRenderbufferRect(sourceArea, destArea, readRenderTarget, drawRenderTarget, filter, scissor, false, blitDepth, blitStencil); if (error.isError()) { return error; } } gl::Error error = invalidateSwizzles(); if (error.isError()) { return error; } return gl::Error(GL_NO_ERROR); }