Commit b3a8f0bc by Shahbaz Youssefi Committed by Commit Bot

Distinguish MSRTT renderbuffers in the front-end

glRenderbufferStorageMultisampleEXT has different semantics from glRenderbufferStorageMultisample. This change makes this differentiation in the front-end and passes a flag to the backends. This extension is currently only supported on Vulkan and D3D backends. Support for the former will be done in a follow up. Support for the latter is not planned. Bug: angleproject:4836 Change-Id: I75bc3d7990a4b1ce06264280a386d5e467983b7d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2405396 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 06b4fb92
...@@ -5586,12 +5586,8 @@ void Context::renderbufferStorageMultisample(GLenum target, ...@@ -5586,12 +5586,8 @@ void Context::renderbufferStorageMultisample(GLenum target,
GLsizei width, GLsizei width,
GLsizei height) GLsizei height)
{ {
// Hack for the special WebGL 1 "DEPTH_STENCIL" internal format. renderbufferStorageMultisampleImpl(target, samples, internalformat, width, height,
GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat); MultisamplingMode::Regular);
Renderbuffer *renderbuffer = mState.getCurrentRenderbuffer();
ANGLE_CONTEXT_TRY(
renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
} }
void Context::renderbufferStorageMultisampleEXT(GLenum target, void Context::renderbufferStorageMultisampleEXT(GLenum target,
...@@ -5600,9 +5596,23 @@ void Context::renderbufferStorageMultisampleEXT(GLenum target, ...@@ -5600,9 +5596,23 @@ void Context::renderbufferStorageMultisampleEXT(GLenum target,
GLsizei width, GLsizei width,
GLsizei height) GLsizei height)
{ {
// TODO(syoussefi): distinguish between renderbufferStorageMultisampleEXT and renderbufferStorageMultisampleImpl(target, samples, internalformat, width, height,
// renderbufferStorageMultisample. http://anglebug.com/4881 MultisamplingMode::MultisampledRenderToTexture);
renderbufferStorageMultisample(target, samples, internalformat, width, height); }
void Context::renderbufferStorageMultisampleImpl(GLenum target,
GLsizei samples,
GLenum internalformat,
GLsizei width,
GLsizei height,
MultisamplingMode mode)
{
// Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Renderbuffer *renderbuffer = mState.getCurrentRenderbuffer();
ANGLE_CONTEXT_TRY(renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat,
width, height, mode));
} }
void Context::framebufferTexture2DMultisample(GLenum target, void Context::framebufferTexture2DMultisample(GLenum target,
......
...@@ -682,6 +682,12 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl ...@@ -682,6 +682,12 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
UniformLocation location, UniformLocation location,
GLsizei count, GLsizei count,
const GLint *v); const GLint *v);
void renderbufferStorageMultisampleImpl(GLenum target,
GLsizei samples,
GLenum internalformat,
GLsizei width,
GLsizei height,
MultisamplingMode mode);
void convertPpoToComputeOrDraw(bool isCompute); void convertPpoToComputeOrDraw(bool isCompute);
......
...@@ -124,7 +124,8 @@ angle::Result Renderbuffer::setStorageMultisample(const Context *context, ...@@ -124,7 +124,8 @@ angle::Result Renderbuffer::setStorageMultisample(const Context *context,
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height) size_t height,
MultisamplingMode mode)
{ {
ANGLE_TRY(orphanImages(context)); ANGLE_TRY(orphanImages(context));
...@@ -132,8 +133,8 @@ angle::Result Renderbuffer::setStorageMultisample(const Context *context, ...@@ -132,8 +133,8 @@ angle::Result Renderbuffer::setStorageMultisample(const Context *context,
const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat); const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
samples = formatCaps.getNearestSamples(static_cast<GLuint>(samples)); samples = formatCaps.getNearestSamples(static_cast<GLuint>(samples));
ANGLE_TRY( ANGLE_TRY(mImplementation->setStorageMultisample(context, samples, internalformat, width,
mImplementation->setStorageMultisample(context, samples, internalformat, width, height)); height, mode));
mState.update(static_cast<GLsizei>(width), static_cast<GLsizei>(height), Format(internalformat), mState.update(static_cast<GLsizei>(width), static_cast<GLsizei>(height), Format(internalformat),
static_cast<GLsizei>(samples), InitState::MayNeedInit); static_cast<GLsizei>(samples), InitState::MayNeedInit);
......
...@@ -83,7 +83,8 @@ class Renderbuffer final : public RefCountObject<RenderbufferID>, ...@@ -83,7 +83,8 @@ class Renderbuffer final : public RefCountObject<RenderbufferID>,
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height); size_t height,
MultisamplingMode mode);
angle::Result setStorageEGLImageTarget(const Context *context, egl::Image *imageTarget); angle::Result setStorageEGLImageTarget(const Context *context, egl::Image *imageTarget);
rx::RenderbufferImpl *getImplementation() const; rx::RenderbufferImpl *getImplementation() const;
......
...@@ -872,6 +872,15 @@ class LevelIndexWrapper ...@@ -872,6 +872,15 @@ class LevelIndexWrapper
// A GL texture level index. // A GL texture level index.
using LevelIndex = LevelIndexWrapper<GLint>; using LevelIndex = LevelIndexWrapper<GLint>;
enum class MultisamplingMode
{
// Regular multisampling
Regular = 0,
// GL_EXT_multisampled_render_to_texture renderbuffer/texture attachments which perform implicit
// resolve of multisampled data.
MultisampledRenderToTexture,
};
} // namespace gl } // namespace gl
namespace rx namespace rx
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "angle_gl.h" #include "angle_gl.h"
#include "common/angleutils.h" #include "common/angleutils.h"
#include "libANGLE/Error.h" #include "libANGLE/Error.h"
#include "libANGLE/angletypes.h"
#include "libANGLE/renderer/FramebufferAttachmentObjectImpl.h" #include "libANGLE/renderer/FramebufferAttachmentObjectImpl.h"
namespace gl namespace gl
...@@ -38,14 +39,15 @@ class RenderbufferImpl : public FramebufferAttachmentObjectImpl ...@@ -38,14 +39,15 @@ class RenderbufferImpl : public FramebufferAttachmentObjectImpl
virtual angle::Result setStorage(const gl::Context *context, virtual angle::Result setStorage(const gl::Context *context,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height) = 0; size_t height) = 0;
virtual angle::Result setStorageMultisample(const gl::Context *context, virtual angle::Result setStorageMultisample(const gl::Context *context,
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height) = 0; size_t height,
gl::MultisamplingMode mode) = 0;
virtual angle::Result setStorageEGLImageTarget(const gl::Context *context, virtual angle::Result setStorageEGLImageTarget(const gl::Context *context,
egl::Image *image) = 0; egl::Image *image) = 0;
virtual GLenum getColorReadFormat(const gl::Context *context); virtual GLenum getColorReadFormat(const gl::Context *context);
virtual GLenum getColorReadType(const gl::Context *context); virtual GLenum getColorReadType(const gl::Context *context);
......
...@@ -24,8 +24,9 @@ class MockRenderbufferImpl : public RenderbufferImpl ...@@ -24,8 +24,9 @@ class MockRenderbufferImpl : public RenderbufferImpl
MockRenderbufferImpl() : RenderbufferImpl(mMockState) {} MockRenderbufferImpl() : RenderbufferImpl(mMockState) {}
virtual ~MockRenderbufferImpl() { destructor(); } virtual ~MockRenderbufferImpl() { destructor(); }
MOCK_METHOD4(setStorage, angle::Result(const gl::Context *, GLenum, size_t, size_t)); MOCK_METHOD4(setStorage, angle::Result(const gl::Context *, GLenum, size_t, size_t));
MOCK_METHOD5(setStorageMultisample, MOCK_METHOD6(
angle::Result(const gl::Context *, size_t, GLenum, size_t, size_t)); setStorageMultisample,
angle::Result(const gl::Context *, size_t, GLenum, size_t, size_t, gl::MultisamplingMode));
MOCK_METHOD2(setStorageEGLImageTarget, angle::Result(const gl::Context *, egl::Image *)); MOCK_METHOD2(setStorageEGLImageTarget, angle::Result(const gl::Context *, egl::Image *));
MOCK_METHOD5(getAttachmentRenderTarget, MOCK_METHOD5(getAttachmentRenderTarget,
......
...@@ -37,15 +37,22 @@ angle::Result RenderbufferD3D::setStorage(const gl::Context *context, ...@@ -37,15 +37,22 @@ angle::Result RenderbufferD3D::setStorage(const gl::Context *context,
size_t width, size_t width,
size_t height) size_t height)
{ {
return setStorageMultisample(context, 0, internalformat, width, height); return setStorageMultisample(context, 0, internalformat, width, height,
gl::MultisamplingMode::Regular);
} }
angle::Result RenderbufferD3D::setStorageMultisample(const gl::Context *context, angle::Result RenderbufferD3D::setStorageMultisample(const gl::Context *context,
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height) size_t height,
gl::MultisamplingMode mode)
{ {
// TODO: Correctly differentiate between normal multisampling and render to texture. In the
// latter case, the renderbuffer must be automatically resolved when rendering is broken and
// operations performed on it (such as blit, copy etc) should use the resolved image.
// http://anglebug.com/3107.
// If the renderbuffer parameters are queried, the calling function // If the renderbuffer parameters are queried, the calling function
// will expect one of the valid renderbuffer formats for use in // will expect one of the valid renderbuffer formats for use in
// glRenderbufferStorage, but we should create depth and stencil buffers // glRenderbufferStorage, but we should create depth and stencil buffers
......
...@@ -37,7 +37,8 @@ class RenderbufferD3D : public RenderbufferImpl ...@@ -37,7 +37,8 @@ class RenderbufferD3D : public RenderbufferImpl
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height) override; size_t height,
gl::MultisamplingMode mode) override;
angle::Result setStorageEGLImageTarget(const gl::Context *context, egl::Image *image) override; angle::Result setStorageEGLImageTarget(const gl::Context *context, egl::Image *image) override;
angle::Result getRenderTarget(const gl::Context *context, RenderTargetD3D **outRenderTarget); angle::Result getRenderTarget(const gl::Context *context, RenderTargetD3D **outRenderTarget);
......
...@@ -25,8 +25,7 @@ namespace rx ...@@ -25,8 +25,7 @@ namespace rx
{ {
RenderbufferGL::RenderbufferGL(const gl::RenderbufferState &state, GLuint id) RenderbufferGL::RenderbufferGL(const gl::RenderbufferState &state, GLuint id)
: RenderbufferImpl(state), mRenderbufferID(id) : RenderbufferImpl(state), mRenderbufferID(id)
{ {}
}
RenderbufferGL::~RenderbufferGL() RenderbufferGL::~RenderbufferGL()
{ {
...@@ -67,8 +66,13 @@ angle::Result RenderbufferGL::setStorageMultisample(const gl::Context *context, ...@@ -67,8 +66,13 @@ angle::Result RenderbufferGL::setStorageMultisample(const gl::Context *context,
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height) size_t height,
gl::MultisamplingMode mode)
{ {
// Note: GL_EXT_multisampled_render_to_texture is not supported in the GL backend.
// http://anglebug.com/2894
ASSERT(mode == gl::MultisamplingMode::Regular);
const FunctionsGL *functions = GetFunctionsGL(context); const FunctionsGL *functions = GetFunctionsGL(context);
StateManagerGL *stateManager = GetStateManagerGL(context); StateManagerGL *stateManager = GetStateManagerGL(context);
const angle::FeaturesGL &features = GetFeaturesGL(context); const angle::FeaturesGL &features = GetFeaturesGL(context);
......
...@@ -44,7 +44,8 @@ class RenderbufferGL : public RenderbufferImpl ...@@ -44,7 +44,8 @@ class RenderbufferGL : public RenderbufferImpl
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height) override; size_t height,
gl::MultisamplingMode mode) override;
angle::Result setStorageEGLImageTarget(const gl::Context *context, egl::Image *image) override; angle::Result setStorageEGLImageTarget(const gl::Context *context, egl::Image *image) override;
angle::Result initializeContents(const gl::Context *context, angle::Result initializeContents(const gl::Context *context,
......
...@@ -33,7 +33,8 @@ class RenderbufferMtl : public RenderbufferImpl ...@@ -33,7 +33,8 @@ class RenderbufferMtl : public RenderbufferImpl
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height) override; size_t height,
gl::MultisamplingMode mode) override;
angle::Result setStorageEGLImageTarget(const gl::Context *context, egl::Image *image) override; angle::Result setStorageEGLImageTarget(const gl::Context *context, egl::Image *image) override;
angle::Result getAttachmentRenderTarget(const gl::Context *context, angle::Result getAttachmentRenderTarget(const gl::Context *context,
......
...@@ -93,7 +93,8 @@ angle::Result RenderbufferMtl::setStorageMultisample(const gl::Context *context, ...@@ -93,7 +93,8 @@ angle::Result RenderbufferMtl::setStorageMultisample(const gl::Context *context,
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height) size_t height,
gl::MultisamplingMode mode)
{ {
// NOTE(hqle): Support MSAA // NOTE(hqle): Support MSAA
UNIMPLEMENTED(); UNIMPLEMENTED();
......
...@@ -30,7 +30,8 @@ angle::Result RenderbufferNULL::setStorageMultisample(const gl::Context *context ...@@ -30,7 +30,8 @@ angle::Result RenderbufferNULL::setStorageMultisample(const gl::Context *context
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height) size_t height,
gl::MultisamplingMode mode)
{ {
return angle::Result::Continue; return angle::Result::Continue;
} }
......
...@@ -29,7 +29,8 @@ class RenderbufferNULL : public RenderbufferImpl ...@@ -29,7 +29,8 @@ class RenderbufferNULL : public RenderbufferImpl
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height) override; size_t height,
gl::MultisamplingMode mode) override;
angle::Result setStorageEGLImageTarget(const gl::Context *context, egl::Image *image) override; angle::Result setStorageEGLImageTarget(const gl::Context *context, egl::Image *image) override;
......
...@@ -41,7 +41,8 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context, ...@@ -41,7 +41,8 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context,
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height) size_t height,
gl::MultisamplingMode mode)
{ {
ContextVk *contextVk = vk::GetImpl(context); ContextVk *contextVk = vk::GetImpl(context);
RendererVk *renderer = contextVk->getRenderer(); RendererVk *renderer = contextVk->getRenderer();
...@@ -105,16 +106,18 @@ angle::Result RenderbufferVk::setStorage(const gl::Context *context, ...@@ -105,16 +106,18 @@ angle::Result RenderbufferVk::setStorage(const gl::Context *context,
size_t width, size_t width,
size_t height) size_t height)
{ {
return setStorageImpl(context, 1, internalformat, width, height); return setStorageImpl(context, 1, internalformat, width, height,
gl::MultisamplingMode::Regular);
} }
angle::Result RenderbufferVk::setStorageMultisample(const gl::Context *context, angle::Result RenderbufferVk::setStorageMultisample(const gl::Context *context,
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height) size_t height,
gl::MultisamplingMode mode)
{ {
return setStorageImpl(context, samples, internalformat, width, height); return setStorageImpl(context, samples, internalformat, width, height, mode);
} }
angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *context, angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *context,
......
...@@ -33,7 +33,8 @@ class RenderbufferVk : public RenderbufferImpl, public angle::ObserverInterface ...@@ -33,7 +33,8 @@ class RenderbufferVk : public RenderbufferImpl, public angle::ObserverInterface
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height) override; size_t height,
gl::MultisamplingMode mode) override;
angle::Result setStorageEGLImageTarget(const gl::Context *context, egl::Image *image) override; angle::Result setStorageEGLImageTarget(const gl::Context *context, egl::Image *image) override;
angle::Result getAttachmentRenderTarget(const gl::Context *context, angle::Result getAttachmentRenderTarget(const gl::Context *context,
...@@ -66,7 +67,8 @@ class RenderbufferVk : public RenderbufferImpl, public angle::ObserverInterface ...@@ -66,7 +67,8 @@ class RenderbufferVk : public RenderbufferImpl, public angle::ObserverInterface
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height); size_t height,
gl::MultisamplingMode mode);
const gl::InternalFormat &getImplementationSizedFormat() const; const gl::InternalFormat &getImplementationSizedFormat() const;
......
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