Commit 9f0b42a6 by Jamie Madill

Add an attachment helper to replace getRenderTarget.

We would like to stop exposing rx::RenderTarget to any GL-layer code, like the Context, or Framebuffer. Then we can pull any necessary information inside the Renderer back-ends. BUG=angle:732 Change-Id: Ifa35218f097c528e616d732bda4bcd8e5f1c3843 Reviewed-on: https://chromium-review.googlesource.com/217029Tested-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org>
parent 231943bf
......@@ -16,9 +16,31 @@
#include "libGLESv2/FramebufferAttachment.h"
#include "libGLESv2/renderer/Renderer.h"
#include "libGLESv2/renderer/RenderTarget.h"
#include "libGLESv2/renderer/d3d/TextureD3D.h"
#include "common/utilities.h"
namespace rx
{
RenderTarget *GetAttachmentRenderTarget(gl::FramebufferAttachment *attachment)
{
if (attachment->isTexture())
{
gl::Texture *texture = attachment->getTexture();
ASSERT(texture);
TextureD3D *textureD3D = TextureD3D::makeTextureD3D(texture->getImplementation());
return textureD3D->getRenderTarget(attachment->mipLevel(), attachment->layer());
}
gl::Renderbuffer *renderbuffer = attachment->getRenderbuffer();
ASSERT(renderbuffer);
// TODO: cast to RenderbufferD3D
return renderbuffer->getStorage()->getRenderTarget();
}
}
namespace gl
{
......@@ -578,7 +600,7 @@ void Framebuffer::invalidateSub(const Caps &caps, GLsizei numAttachments, const
if (attachment)
{
rx::RenderTarget *renderTarget = attachment->getRenderTarget();
rx::RenderTarget *renderTarget = rx::GetAttachmentRenderTarget(attachment);
if (renderTarget)
{
renderTarget->invalidate(x, y, width, height);
......
......@@ -113,4 +113,12 @@ class DefaultFramebuffer : public Framebuffer
}
namespace rx
{
class RenderTarget;
// TODO: place this in FramebufferD3D.h
RenderTarget *GetAttachmentRenderTarget(gl::FramebufferAttachment *attachment);
}
#endif // LIBGLESV2_FRAMEBUFFER_H_
......@@ -135,11 +135,6 @@ GLint TextureAttachment::layer() const
return mIndex.layerIndex;
}
rx::RenderTarget *TextureAttachment::getRenderTarget()
{
return mTexture->getRenderTarget(mIndex);
}
unsigned int TextureAttachment::getSerial() const
{
return mTexture->getRenderTargetSerial(mIndex);
......@@ -170,11 +165,6 @@ RenderbufferAttachment::~RenderbufferAttachment()
mRenderbuffer.set(NULL);
}
rx::RenderTarget *RenderbufferAttachment::getRenderTarget()
{
return mRenderbuffer->getStorage()->getRenderTarget();
}
GLsizei RenderbufferAttachment::getWidth() const
{
return mRenderbuffer->getWidth();
......
......@@ -56,8 +56,6 @@ class FramebufferAttachment
GLenum getBinding() const { return mBinding; }
// Child class interface
virtual rx::RenderTarget *getRenderTarget() = 0;
virtual GLsizei getWidth() const = 0;
virtual GLsizei getHeight() const = 0;
virtual GLenum getInternalFormat() const = 0;
......@@ -98,7 +96,6 @@ class TextureAttachment : public FramebufferAttachment
virtual GLint mipLevel() const;
virtual GLint layer() const;
virtual rx::RenderTarget *getRenderTarget();
virtual unsigned int getSerial() const;
virtual Texture *getTexture();
......@@ -118,8 +115,6 @@ class RenderbufferAttachment : public FramebufferAttachment
virtual ~RenderbufferAttachment();
rx::RenderTarget *getRenderTarget();
virtual GLsizei getWidth() const;
virtual GLsizei getHeight() const;
virtual GLenum getInternalFormat() const;
......
......@@ -211,7 +211,7 @@ gl::Error Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::
gl::FramebufferAttachment *attachment = frameBuffer->getColorbuffer(colorAttachment);
if (attachment)
{
RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(attachment->getRenderTarget());
RenderTarget11 *renderTarget = d3d11::GetAttachmentRenderTarget(attachment);
if (!renderTarget)
{
return gl::Error(GL_OUT_OF_MEMORY, "Internal render target view pointer unexpectedly null.");
......@@ -284,7 +284,7 @@ gl::Error Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::
gl::FramebufferAttachment *attachment = frameBuffer->getDepthOrStencilbuffer();
if (attachment)
{
RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(attachment->getRenderTarget());
RenderTarget11 *renderTarget = d3d11::GetAttachmentRenderTarget(attachment);
if (!renderTarget)
{
return gl::Error(GL_OUT_OF_MEMORY, "Internal depth stencil view pointer unexpectedly null.");
......
......@@ -823,7 +823,7 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer)
renderTargetSerials[colorAttachment] = colorbuffer->getSerial();
// Extract the render target dimensions and view
RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(colorbuffer->getRenderTarget());
RenderTarget11 *renderTarget = d3d11::GetAttachmentRenderTarget(colorbuffer);
if (!renderTarget)
{
ERR("render target pointer unexpectedly null.");
......@@ -867,7 +867,7 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer)
ID3D11DepthStencilView* framebufferDSV = NULL;
if (depthStencil)
{
RenderTarget11 *depthStencilRenderTarget = RenderTarget11::makeRenderTarget11(depthStencil->getRenderTarget());
RenderTarget11 *depthStencilRenderTarget = d3d11::GetAttachmentRenderTarget(depthStencil);
if (!depthStencilRenderTarget)
{
ERR("render target pointer unexpectedly null.");
......@@ -1943,7 +1943,7 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
return gl::error(GL_OUT_OF_MEMORY, false);
}
RenderTarget11 *sourceRenderTarget = RenderTarget11::makeRenderTarget11(colorbuffer->getRenderTarget());
RenderTarget11 *sourceRenderTarget = d3d11::GetAttachmentRenderTarget(colorbuffer);
if (!sourceRenderTarget)
{
ERR("Failed to retrieve the render target from the frame buffer.");
......@@ -2004,7 +2004,7 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
return gl::error(GL_OUT_OF_MEMORY, false);
}
RenderTarget11 *sourceRenderTarget = RenderTarget11::makeRenderTarget11(colorbuffer->getRenderTarget());
RenderTarget11 *sourceRenderTarget = d3d11::GetAttachmentRenderTarget(colorbuffer);
if (!sourceRenderTarget)
{
ERR("Failed to retrieve the render target from the frame buffer.");
......@@ -2065,7 +2065,7 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
return gl::error(GL_OUT_OF_MEMORY, false);
}
RenderTarget11 *sourceRenderTarget = RenderTarget11::makeRenderTarget11(colorbuffer->getRenderTarget());
RenderTarget11 *sourceRenderTarget = d3d11::GetAttachmentRenderTarget(colorbuffer);
if (!sourceRenderTarget)
{
ERR("Failed to retrieve the render target from the frame buffer.");
......@@ -2126,7 +2126,7 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
return gl::error(GL_OUT_OF_MEMORY, false);
}
RenderTarget11 *sourceRenderTarget = RenderTarget11::makeRenderTarget11(colorbuffer->getRenderTarget());
RenderTarget11 *sourceRenderTarget = d3d11::GetAttachmentRenderTarget(colorbuffer);
if (!sourceRenderTarget)
{
ERR("Failed to retrieve the render target from the frame buffer.");
......@@ -2500,7 +2500,7 @@ bool Renderer11::getRenderTargetResource(gl::FramebufferAttachment *colorbuffer,
{
ASSERT(colorbuffer != NULL);
RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(colorbuffer->getRenderTarget());
RenderTarget11 *renderTarget = d3d11::GetAttachmentRenderTarget(colorbuffer);
if (renderTarget)
{
*subresourceIndex = renderTarget->getSubresourceIndex();
......@@ -2545,7 +2545,7 @@ bool Renderer11::blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &read
return gl::error(GL_OUT_OF_MEMORY, false);
}
RenderTarget *readRenderTarget = readBuffer->getRenderTarget();
RenderTarget *readRenderTarget = GetAttachmentRenderTarget(readBuffer);
for (unsigned int colorAttachment = 0; colorAttachment < gl::IMPLEMENTATION_MAX_DRAW_BUFFERS; colorAttachment++)
{
......@@ -2559,7 +2559,7 @@ bool Renderer11::blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &read
return gl::error(GL_OUT_OF_MEMORY, false);
}
RenderTarget *drawRenderTarget = drawBuffer->getRenderTarget();
RenderTarget *drawRenderTarget = GetAttachmentRenderTarget(drawBuffer);
if (!blitRenderbufferRect(readRect, drawRect, readRenderTarget, drawRenderTarget, filter, scissor,
blitRenderTarget, false, false))
......@@ -2587,8 +2587,8 @@ bool Renderer11::blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &read
return gl::error(GL_OUT_OF_MEMORY, false);
}
RenderTarget *readRenderTarget = readBuffer->getRenderTarget();
RenderTarget *drawRenderTarget = drawBuffer->getRenderTarget();
RenderTarget *readRenderTarget = GetAttachmentRenderTarget(readBuffer);
RenderTarget *drawRenderTarget = GetAttachmentRenderTarget(drawBuffer);
ASSERT(readRenderTarget && drawRenderTarget);
if (!blitRenderbufferRect(readRect, drawRect, readRenderTarget, drawRenderTarget, filter, scissor,
......@@ -3102,6 +3102,7 @@ void Renderer11::invalidateFBOAttachmentSwizzles(gl::FramebufferAttachment *atta
{
ASSERT(attachment->isTexture());
gl::Texture *texture = attachment->getTexture();
TextureStorage *texStorage = texture->getNativeTexture()->getStorageInstance();
if (texStorage)
{
......
......@@ -9,7 +9,9 @@
#include "libGLESv2/renderer/d3d/d3d11/renderer11_utils.h"
#include "libGLESv2/renderer/d3d/d3d11/formatutils11.h"
#include "libGLESv2/renderer/d3d/d3d11/RenderTarget11.h"
#include "libGLESv2/ProgramBinary.h"
#include "libGLESv2/Framebuffer.h"
#include "common/debug.h"
......@@ -1063,6 +1065,12 @@ HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name)
#endif
}
RenderTarget11 *GetAttachmentRenderTarget(gl::FramebufferAttachment *attachment)
{
RenderTarget *renderTarget = rx::GetAttachmentRenderTarget(attachment);
return RenderTarget11::makeRenderTarget11(renderTarget);
}
}
}
......@@ -15,8 +15,14 @@
#include <vector>
namespace gl
{
class FramebufferAttachment;
}
namespace rx
{
class RenderTarget11;
namespace gl_d3d11
{
......@@ -170,6 +176,8 @@ inline void SetBufferData(ID3D11DeviceContext *context, ID3D11Buffer *constantBu
context->Unmap(constantBuffer, 0);
}
RenderTarget11 *GetAttachmentRenderTarget(gl::FramebufferAttachment *attachment);
}
}
......
......@@ -216,9 +216,9 @@ bool Blit9::copy(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum de
if (colorbuffer)
{
renderTarget = RenderTarget9::makeRenderTarget9(colorbuffer->getRenderTarget());
renderTarget = d3d9::GetAttachmentRenderTarget(colorbuffer);
}
if (renderTarget)
{
source = renderTarget->getSurface();
......@@ -233,7 +233,7 @@ bool Blit9::copy(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum de
TextureStorage9_2D *storage9 = TextureStorage9_2D::makeTextureStorage9_2D(storage->getStorageInstance());
IDirect3DSurface9 *destSurface = storage9->getSurfaceLevel(level, true);
bool result = false;
if (destSurface)
{
result = copy(source, sourceRect, destFormat, xoffset, yoffset, destSurface);
......@@ -252,9 +252,9 @@ bool Blit9::copy(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum de
if (colorbuffer)
{
renderTarget = RenderTarget9::makeRenderTarget9(colorbuffer->getRenderTarget());
renderTarget = d3d9::GetAttachmentRenderTarget(colorbuffer);
}
if (renderTarget)
{
source = renderTarget->getSurface();
......
......@@ -368,7 +368,7 @@ bool Image9::copyToSurface(IDirect3DSurface9 *destSurface, GLint xoffset, GLint
}
else
{
// UpdateSurface: source must be SYSTEMMEM, dest must be DEFAULT pools
// UpdateSurface: source must be SYSTEMMEM, dest must be DEFAULT pools
HRESULT result = device->UpdateSurface(sourceSurface, &rect, destSurface, &point);
UNUSED_ASSERTION_VARIABLE(result);
ASSERT(SUCCEEDED(result));
......@@ -462,9 +462,9 @@ void Image9::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
if (colorbuffer)
{
renderTarget = RenderTarget9::makeRenderTarget9(colorbuffer->getRenderTarget());
renderTarget = d3d9::GetAttachmentRenderTarget(colorbuffer);
}
if (renderTarget)
{
surface = renderTarget->getSurface();
......@@ -481,7 +481,7 @@ void Image9::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
IDirect3DSurface9 *renderTargetData = NULL;
D3DSURFACE_DESC description;
surface->GetDesc(&description);
HRESULT result = device->CreateOffscreenPlainSurface(description.Width, description.Height, description.Format, D3DPOOL_SYSTEMMEM, &renderTargetData, NULL);
if (FAILED(result))
......@@ -517,7 +517,7 @@ void Image9::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
D3DLOCKED_RECT destLock = {0};
result = lock(&destLock, &destRect);
if (FAILED(result))
{
ERR("Failed to lock the destination surface (rectangle might be invalid).");
......
......@@ -1156,10 +1156,10 @@ bool Renderer9::applyRenderTarget(gl::Framebuffer *framebuffer)
// Apply the render target on the device
IDirect3DSurface9 *renderTargetSurface = NULL;
RenderTarget *renderTarget = attachment->getRenderTarget();
RenderTarget9 *renderTarget = d3d9::GetAttachmentRenderTarget(attachment);
if (renderTarget)
{
renderTargetSurface = RenderTarget9::makeRenderTarget9(renderTarget)->getSurface();
renderTargetSurface = renderTarget->getSurface();
}
if (!renderTargetSurface)
......@@ -1199,11 +1199,11 @@ bool Renderer9::applyRenderTarget(gl::Framebuffer *framebuffer)
if (depthStencil)
{
IDirect3DSurface9 *depthStencilSurface = NULL;
RenderTarget *depthStencilRenderTarget = depthStencil->getRenderTarget();
rx::RenderTarget9 *depthStencilRenderTarget = d3d9::GetAttachmentRenderTarget(depthStencil);
if (depthStencilRenderTarget)
{
depthStencilSurface = RenderTarget9::makeRenderTarget9(depthStencilRenderTarget)->getSurface();
depthStencilSurface = depthStencilRenderTarget->getSurface();
}
if (!depthStencilSurface)
......@@ -2478,11 +2478,11 @@ bool Renderer9::blitRect(gl::Framebuffer *readFramebuffer, const gl::Rectangle &
if (readBuffer)
{
readRenderTarget = RenderTarget9::makeRenderTarget9(readBuffer->getRenderTarget());
readRenderTarget = d3d9::GetAttachmentRenderTarget(readBuffer);
}
if (drawBuffer)
{
drawRenderTarget = RenderTarget9::makeRenderTarget9(drawBuffer->getRenderTarget());
drawRenderTarget = d3d9::GetAttachmentRenderTarget(drawBuffer);
}
if (readRenderTarget)
......@@ -2607,11 +2607,11 @@ bool Renderer9::blitRect(gl::Framebuffer *readFramebuffer, const gl::Rectangle &
if (readBuffer)
{
readDepthStencil = RenderTarget9::makeRenderTarget9(readBuffer->getRenderTarget());
readDepthStencil = d3d9::GetAttachmentRenderTarget(readBuffer);
}
if (drawBuffer)
{
drawDepthStencil = RenderTarget9::makeRenderTarget9(drawBuffer->getRenderTarget());
drawDepthStencil = d3d9::GetAttachmentRenderTarget(drawBuffer);
}
if (readDepthStencil)
......@@ -2655,7 +2655,7 @@ gl::Error Renderer9::readPixels(gl::Framebuffer *framebuffer, GLint x, GLint y,
if (colorbuffer)
{
renderTarget = RenderTarget9::makeRenderTarget9(colorbuffer->getRenderTarget());
renderTarget = d3d9::GetAttachmentRenderTarget(colorbuffer);
}
if (renderTarget)
......
......@@ -10,6 +10,8 @@
#include "libGLESv2/renderer/d3d/d3d9/renderer9_utils.h"
#include "libGLESv2/renderer/d3d/d3d9/formatutils9.h"
#include "libGLESv2/formatutils.h"
#include "libGLESv2/Framebuffer.h"
#include "libGLESv2/renderer/d3d/d3d9/RenderTarget9.h"
#include "common/mathutil.h"
#include "common/debug.h"
......@@ -531,6 +533,12 @@ void MakeValidSize(bool isImage, D3DFORMAT format, GLsizei *requestWidth, GLsize
*levelOffset = upsampleCount;
}
RenderTarget9 *GetAttachmentRenderTarget(gl::FramebufferAttachment *attachment)
{
RenderTarget *renderTarget = rx::GetAttachmentRenderTarget(attachment);
return RenderTarget9::makeRenderTarget9(renderTarget);
}
}
}
......@@ -4,7 +4,7 @@
// found in the LICENSE file.
//
// renderer9_utils.h: Conversion functions and other utility routines
// renderer9_utils.h: Conversion functions and other utility routines
// specific to the D3D9 renderer
#ifndef LIBGLESV2_RENDERER_RENDERER9_UTILS_H
......@@ -13,8 +13,14 @@
#include "libGLESv2/angletypes.h"
#include "libGLESv2/Caps.h"
namespace gl
{
class FramebufferAttachment;
}
namespace rx
{
class RenderTarget9;
namespace gl_d3d9
{
......@@ -68,6 +74,8 @@ inline bool isDeviceLostError(HRESULT errorCode)
}
}
RenderTarget9 *GetAttachmentRenderTarget(gl::FramebufferAttachment *attachment);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment