static gl::Error getRenderTargetResource(const gl::FramebufferAttachment *colorbuffer, unsigned int *subresourceIndexOut, ID3D11Texture2D **texture2DOut) { ASSERT(colorbuffer); RenderTarget11 *renderTarget = NULL; gl::Error error = d3d11::GetAttachmentRenderTarget(colorbuffer, &renderTarget); if (error.isError()) { return error; } ID3D11Resource *renderTargetResource = renderTarget->getTexture(); ASSERT(renderTargetResource); *subresourceIndexOut = renderTarget->getSubresourceIndex(); *texture2DOut = d3d11::DynamicCastComObject<ID3D11Texture2D>(renderTargetResource); if (!(*texture2DOut)) { return gl::Error(GL_OUT_OF_MEMORY, "Failed to query the ID3D11Texture2D from a RenderTarget"); } return gl::Error(GL_NO_ERROR); }
gl::Error Image11::copy(const gl::Offset &destOffset, const gl::Rectangle &sourceArea, RenderTargetD3D *source) { RenderTarget11 *sourceRenderTarget = GetAs<RenderTarget11>(source); ASSERT(sourceRenderTarget->getTexture()); ID3D11Resource *resource = sourceRenderTarget->getTexture(); UINT subresourceIndex = sourceRenderTarget->getSubresourceIndex(); gl::Box sourceBox(sourceArea.x, sourceArea.y, 0, sourceArea.width, sourceArea.height, 1); gl::Error error = copy(destOffset, sourceBox, resource, subresourceIndex); SafeRelease(resource); return error; }
gl::Error Image11::copy(GLint xoffset, GLint yoffset, GLint zoffset, const gl::Rectangle &sourceArea, RenderTarget *source) { RenderTarget11 *sourceRenderTarget = RenderTarget11::makeRenderTarget11(source); ASSERT(sourceRenderTarget->getTexture()); UINT subresourceIndex = sourceRenderTarget->getSubresourceIndex(); ID3D11Texture2D *sourceTexture2D = d3d11::DynamicCastComObject<ID3D11Texture2D>(sourceRenderTarget->getTexture()); if (!sourceTexture2D) { return gl::Error(GL_OUT_OF_MEMORY, "Failed to retrieve the ID3D11Texture2D from the source RenderTarget."); } gl::Error error = copy(xoffset, yoffset, zoffset, sourceArea, sourceTexture2D, subresourceIndex); SafeRelease(sourceTexture2D); return error; }