Bug 1096634 - Treat ANGLE default FB as RGB(A). - r=kamidphish

This commit is contained in:
Jeff Gilbert 2014-11-05 15:04:55 -08:00
parent 246c5ad5e0
commit d024308a8d
14 changed files with 60 additions and 35 deletions

View File

@ -189,11 +189,9 @@ void Context::makeCurrent(egl::Surface *surface)
mHasBeenCurrent = true;
}
// Wrap the existing swapchain resources into GL objects and assign them to the '0' names
rx::SwapChain *swapchain = surface->getSwapChain();
Colorbuffer *colorbufferZero = new Colorbuffer(mRenderer, swapchain);
DepthStencilbuffer *depthStencilbufferZero = new DepthStencilbuffer(mRenderer, swapchain);
// Wrap the existing surface resources into GL objects and assign them to the '0' names
Colorbuffer *colorbufferZero = new Colorbuffer(mRenderer, surface);
DepthStencilbuffer *depthStencilbufferZero = new DepthStencilbuffer(mRenderer, surface);
Framebuffer *framebufferZero = new DefaultFramebuffer(mRenderer, colorbufferZero, depthStencilbufferZero);
setFramebufferZero(framebufferZero);

View File

@ -172,9 +172,9 @@ unsigned int RenderbufferStorage::getTextureSerial() const
return -1;
}
Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
Colorbuffer::Colorbuffer(rx::Renderer *renderer, egl::Surface *surface)
{
mRenderTarget = renderer->createRenderTarget(swapChain, false);
mRenderTarget = renderer->createRenderTarget(surface, false);
if (mRenderTarget)
{
@ -213,9 +213,9 @@ rx::RenderTarget *Colorbuffer::getRenderTarget()
return mRenderTarget;
}
DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, egl::Surface *surface)
{
mDepthStencil = renderer->createRenderTarget(swapChain, true);
mDepthStencil = renderer->createRenderTarget(surface, true);
if (mDepthStencil)
{
mWidth = mDepthStencil->getWidth();

View File

@ -17,6 +17,11 @@
#include "common/angleutils.h"
#include "common/RefCountObject.h"
namespace egl
{
class Surface;
}
namespace rx
{
class Renderer;
@ -103,7 +108,7 @@ class RenderbufferStorage
class Colorbuffer : public RenderbufferStorage
{
public:
Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
Colorbuffer(rx::Renderer *renderer, egl::Surface *surface);
Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples);
virtual ~Colorbuffer();
@ -119,7 +124,7 @@ class Colorbuffer : public RenderbufferStorage
class DepthStencilbuffer : public RenderbufferStorage
{
public:
DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
DepthStencilbuffer(rx::Renderer *renderer, egl::Surface *surface);
DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
~DepthStencilbuffer();

View File

@ -30,6 +30,7 @@
namespace egl
{
class Display;
class Surface;
}
namespace gl
@ -187,7 +188,7 @@ class Renderer
GLenum type, GLuint outputPitch, const gl::PixelPackState &pack, uint8_t *pixels) = 0;
// RenderTarget creation
virtual RenderTarget *createRenderTarget(SwapChain *swapChain, bool depth) = 0;
virtual RenderTarget *createRenderTarget(egl::Surface *eglSurface, bool depth) = 0;
virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples) = 0;
// Shader creation

View File

@ -177,7 +177,8 @@ static unsigned int getDSVSubresourceIndex(ID3D11Resource *resource, ID3D11Depth
}
RenderTarget11::RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *rtv, ID3D11Resource *resource,
ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height, GLsizei depth)
ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height, GLsizei depth,
GLenum internalFormatOverride)
{
mRenderer = Renderer11::makeRenderer11(renderer);
@ -220,6 +221,10 @@ RenderTarget11::RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *rtv,
const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(desc.Format);
mInternalFormat = dxgiFormatInfo.internalFormat;
mActualFormat = dxgiFormatInfo.internalFormat;
if (internalFormatOverride) {
mInternalFormat = internalFormatOverride;
}
}
}

View File

@ -21,7 +21,7 @@ class RenderTarget11 : public RenderTarget
{
public:
// RenderTarget11 takes ownership of any D3D11 resources it is given and will AddRef them
RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height, GLsizei depth);
RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormatOverride = 0);
RenderTarget11(Renderer *renderer, ID3D11DepthStencilView *dsv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height, GLsizei depth);
RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height, GLenum internalFormat, GLsizei samples);
virtual ~RenderTarget11();

View File

@ -38,6 +38,7 @@
#include "libGLESv2/renderer/d3d/d3d11/Buffer11.h"
#include "libEGL/Display.h"
#include "libEGL/Surface.h"
#include "common/utilities.h"
@ -2169,11 +2170,12 @@ void Renderer11::setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView
}
}
RenderTarget *Renderer11::createRenderTarget(SwapChain *swapChain, bool depth)
RenderTarget *Renderer11::createRenderTarget(egl::Surface *eglSurface, bool depth)
{
SwapChain *swapChain = eglSurface->getSwapChain();
SwapChain11 *swapChain11 = SwapChain11::makeSwapChain11(swapChain);
RenderTarget11 *renderTarget = NULL;
RenderTarget11 *renderTarget = NULL;
if (depth)
{
// Note: depth stencil may be NULL for 0 sized surfaces
@ -2188,7 +2190,8 @@ RenderTarget *Renderer11::createRenderTarget(SwapChain *swapChain, bool depth)
renderTarget = new RenderTarget11(this, swapChain11->getRenderTarget(),
swapChain11->getOffscreenTexture(),
swapChain11->getRenderTargetShaderResource(),
swapChain11->getWidth(), swapChain11->getHeight(), 1);
swapChain11->getWidth(), swapChain11->getHeight(), 1,
eglSurface->getFormat());
}
return renderTarget;
}

View File

@ -132,7 +132,7 @@ class Renderer11 : public Renderer
GLenum type, GLuint outputPitch, const gl::PixelPackState &pack, uint8_t *pixels);
// RenderTarget creation
virtual RenderTarget *createRenderTarget(SwapChain *swapChain, bool depth);
virtual RenderTarget *createRenderTarget(egl::Surface *eglSurface, bool depth);
virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples);
// Shader creation

View File

@ -17,7 +17,7 @@ namespace rx
{
// TODO: AddRef the incoming surface to take ownership instead of expecting that its ref is being given.
RenderTarget9::RenderTarget9(Renderer *renderer, IDirect3DSurface9 *surface)
RenderTarget9::RenderTarget9(Renderer *renderer, IDirect3DSurface9 *surface, GLenum internalFormatOverride)
{
mRenderer = Renderer9::makeRenderer9(renderer);
mRenderTarget = surface;
@ -35,6 +35,10 @@ RenderTarget9::RenderTarget9(Renderer *renderer, IDirect3DSurface9 *surface)
mInternalFormat = d3dFormatInfo.internalFormat;
mActualFormat = d3dFormatInfo.internalFormat;
mSamples = d3d9_gl::GetSamplesCount(description.MultiSampleType);
if (internalFormatOverride) {
mInternalFormat = internalFormatOverride;
}
}
}

View File

@ -20,7 +20,7 @@ class Renderer9;
class RenderTarget9 : public RenderTarget
{
public:
RenderTarget9(Renderer *renderer, IDirect3DSurface9 *surface);
RenderTarget9(Renderer *renderer, IDirect3DSurface9 *surface, GLenum internalFormatOverride = 0);
RenderTarget9(Renderer *renderer, GLsizei width, GLsizei height, GLenum internalFormat, GLsizei samples);
virtual ~RenderTarget9();

View File

@ -37,6 +37,7 @@
#include "libGLESv2/angletypes.h"
#include "libEGL/Display.h"
#include "libEGL/Surface.h"
#include "common/utilities.h"
@ -74,6 +75,16 @@ static const D3DFORMAT RenderTargetFormats[] =
D3DFMT_X8R8G8B8
};
static const GLenum RenderTargetExposedFormats[] =
{
GL_RGB5_A1, // D3DFMT_A1R5G5B5
// GL_RGB10_A2, // D3DFMT_A2R10G10B10
GL_RGBA8, // D3DFMT_A8R8G8B8
GL_RGB565, // D3DFMT_R5G6B5
// GL_RGB5, // D3DFMT_X1R5G5B5 (No real matching format)
GL_RGB8 // D3DFMT_X8R8G8B8
};
static const D3DFORMAT DepthStencilFormats[] =
{
D3DFMT_UNKNOWN,
@ -436,6 +447,7 @@ int Renderer9::generateConfigs(ConfigDesc **configDescList)
for (unsigned int formatIndex = 0; formatIndex < numRenderFormats; formatIndex++)
{
const d3d9::D3DFormat &renderTargetFormatInfo = d3d9::GetD3DFormatInfo(RenderTargetFormats[formatIndex]);
const GLenum renderTargetExposedFormat = RenderTargetExposedFormats[formatIndex];
const gl::TextureCaps &renderTargetFormatCaps = getRendererTextureCaps().get(renderTargetFormatInfo.internalFormat);
if (renderTargetFormatCaps.renderable)
{
@ -446,7 +458,7 @@ int Renderer9::generateConfigs(ConfigDesc **configDescList)
if (depthStencilFormatCaps.renderable || DepthStencilFormats[depthStencilIndex] == D3DFMT_UNKNOWN)
{
ConfigDesc newConfig;
newConfig.renderTargetFormat = renderTargetFormatInfo.internalFormat;
newConfig.renderTargetFormat = renderTargetExposedFormat;
newConfig.depthStencilFormat = depthStencilFormatInfo.internalFormat;
newConfig.multiSample = 0; // FIXME: enumerate multi-sampling
newConfig.fastConfig = (currentDisplayMode.Format == RenderTargetFormats[formatIndex]);
@ -2764,10 +2776,13 @@ gl::Error Renderer9::readPixels(gl::Framebuffer *framebuffer, GLint x, GLint y,
return gl::Error(GL_NO_ERROR);
}
RenderTarget *Renderer9::createRenderTarget(SwapChain *swapChain, bool depth)
RenderTarget *Renderer9::createRenderTarget(egl::Surface *eglSurface, bool depth)
{
SwapChain *swapChain = eglSurface->getSwapChain();
SwapChain9 *swapChain9 = SwapChain9::makeSwapChain9(swapChain);
IDirect3DSurface9 *surface = NULL;
GLenum exposedFormatOverride = 0;
if (depth)
{
surface = swapChain9->getDepthStencil();
@ -2775,9 +2790,10 @@ RenderTarget *Renderer9::createRenderTarget(SwapChain *swapChain, bool depth)
else
{
surface = swapChain9->getRenderTarget();
exposedFormatOverride = eglSurface->getFormat();
}
RenderTarget9 *renderTarget = new RenderTarget9(this, surface);
RenderTarget9 *renderTarget = new RenderTarget9(this, surface, exposedFormatOverride);
return renderTarget;
}

View File

@ -134,7 +134,7 @@ class Renderer9 : public Renderer
GLenum type, GLuint outputPitch, const gl::PixelPackState &pack, uint8_t *pixels);
// RenderTarget creation
virtual RenderTarget *createRenderTarget(SwapChain *swapChain, bool depth);
virtual RenderTarget *createRenderTarget(egl::Surface *eglSurface, bool depth);
virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples);
// Shader creation

View File

@ -519,14 +519,16 @@ bool ValidateBlitFramebufferParameters(gl::Context *context, GLint srcX0, GLint
if (readColorBuffer && drawColorBuffer)
{
GLenum readInternalFormat = readColorBuffer->getActualFormat();
GLenum readActualFormat = readColorBuffer->getActualFormat();
GLenum readInternalFormat = readColorBuffer->getInternalFormat();
const InternalFormat &readFormatInfo = GetInternalFormatInfo(readInternalFormat);
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_DRAW_BUFFERS; i++)
{
if (drawFramebuffer->isEnabledColorAttachment(i))
{
GLenum drawInternalFormat = drawFramebuffer->getColorbuffer(i)->getActualFormat();
GLenum drawActualFormat = drawFramebuffer->getColorbuffer(i)->getActualFormat();
GLenum drawInternalFormat = drawFramebuffer->getColorbuffer(i)->getInternalFormat();
const InternalFormat &drawFormatInfo = GetInternalFormatInfo(drawInternalFormat);
// The GL ES 3.0.2 spec (pg 193) states that:

View File

@ -1806,15 +1806,6 @@ GLContext::ChooseGLFormats(const SurfaceCaps& caps) const
}
}
if (WorkAroundDriverBugs() &&
IsANGLE() &&
formats.color_rbFormat == LOCAL_GL_RGBA8)
{
formats.color_texInternalFormat = LOCAL_GL_BGRA;
formats.color_texFormat = LOCAL_GL_BGRA;
formats.color_rbFormat = LOCAL_GL_BGRA8_EXT;
}
uint32_t msaaLevel = gfxPrefs::MSAALevel();
GLsizei samples = msaaLevel * msaaLevel;
samples = std::min(samples, mMaxSamples);