mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-27 12:50:09 +00:00
Bug 1096634 - Treat ANGLE default FB as RGB(A). - r=kamidphish
This commit is contained in:
parent
246c5ad5e0
commit
d024308a8d
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user