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,
GLsizei width,
GLsizei height)
{
// 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));
renderbufferStorageMultisampleImpl(target, samples, internalformat, width, height,
MultisamplingMode::Regular);
}
void Context::renderbufferStorageMultisampleEXT(GLenum target,
......@@ -5600,9 +5596,23 @@ void Context::renderbufferStorageMultisampleEXT(GLenum target,
GLsizei width,
GLsizei height)
{
// TODO(syoussefi): distinguish between renderbufferStorageMultisampleEXT and
// renderbufferStorageMultisample. http://anglebug.com/4881
renderbufferStorageMultisample(target, samples, internalformat, width, height);
renderbufferStorageMultisampleImpl(target, samples, internalformat, width, height,
MultisamplingMode::MultisampledRenderToTexture);
}
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,
......
......@@ -682,6 +682,12 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
UniformLocation location,
GLsizei count,
const GLint *v);
void renderbufferStorageMultisampleImpl(GLenum target,
GLsizei samples,
GLenum internalformat,
GLsizei width,
GLsizei height,
MultisamplingMode mode);
void convertPpoToComputeOrDraw(bool isCompute);
......
......@@ -124,7 +124,8 @@ angle::Result Renderbuffer::setStorageMultisample(const Context *context,
size_t samples,
GLenum internalformat,
size_t width,
size_t height)
size_t height,
MultisamplingMode mode)
{
ANGLE_TRY(orphanImages(context));
......@@ -132,8 +133,8 @@ angle::Result Renderbuffer::setStorageMultisample(const Context *context,
const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
samples = formatCaps.getNearestSamples(static_cast<GLuint>(samples));
ANGLE_TRY(
mImplementation->setStorageMultisample(context, samples, internalformat, width, height));
ANGLE_TRY(mImplementation->setStorageMultisample(context, samples, internalformat, width,
height, mode));
mState.update(static_cast<GLsizei>(width), static_cast<GLsizei>(height), Format(internalformat),
static_cast<GLsizei>(samples), InitState::MayNeedInit);
......
......@@ -83,7 +83,8 @@ class Renderbuffer final : public RefCountObject<RenderbufferID>,
size_t samples,
GLenum internalformat,
size_t width,
size_t height);
size_t height,
MultisamplingMode mode);
angle::Result setStorageEGLImageTarget(const Context *context, egl::Image *imageTarget);
rx::RenderbufferImpl *getImplementation() const;
......
......@@ -872,6 +872,15 @@ class LevelIndexWrapper
// A GL texture level index.
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 rx
......
......@@ -12,6 +12,7 @@
#include "angle_gl.h"
#include "common/angleutils.h"
#include "libANGLE/Error.h"
#include "libANGLE/angletypes.h"
#include "libANGLE/renderer/FramebufferAttachmentObjectImpl.h"
namespace gl
......@@ -38,14 +39,15 @@ class RenderbufferImpl : public FramebufferAttachmentObjectImpl
virtual angle::Result setStorage(const gl::Context *context,
GLenum internalformat,
size_t width,
size_t height) = 0;
size_t height) = 0;
virtual angle::Result setStorageMultisample(const gl::Context *context,
size_t samples,
GLenum internalformat,
size_t width,
size_t height) = 0;
size_t height,
gl::MultisamplingMode mode) = 0;
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 getColorReadType(const gl::Context *context);
......
......@@ -24,8 +24,9 @@ class MockRenderbufferImpl : public RenderbufferImpl
MockRenderbufferImpl() : RenderbufferImpl(mMockState) {}
virtual ~MockRenderbufferImpl() { destructor(); }
MOCK_METHOD4(setStorage, angle::Result(const gl::Context *, GLenum, size_t, size_t));
MOCK_METHOD5(setStorageMultisample,
angle::Result(const gl::Context *, size_t, GLenum, size_t, size_t));
MOCK_METHOD6(
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_METHOD5(getAttachmentRenderTarget,
......
......@@ -37,15 +37,22 @@ angle::Result RenderbufferD3D::setStorage(const gl::Context *context,
size_t width,
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,
size_t samples,
GLenum internalformat,
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
// will expect one of the valid renderbuffer formats for use in
// glRenderbufferStorage, but we should create depth and stencil buffers
......
......@@ -37,7 +37,8 @@ class RenderbufferD3D : public RenderbufferImpl
size_t samples,
GLenum internalformat,
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 getRenderTarget(const gl::Context *context, RenderTargetD3D **outRenderTarget);
......
......@@ -25,8 +25,7 @@ namespace rx
{
RenderbufferGL::RenderbufferGL(const gl::RenderbufferState &state, GLuint id)
: RenderbufferImpl(state), mRenderbufferID(id)
{
}
{}
RenderbufferGL::~RenderbufferGL()
{
......@@ -67,8 +66,13 @@ angle::Result RenderbufferGL::setStorageMultisample(const gl::Context *context,
size_t samples,
GLenum internalformat,
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);
StateManagerGL *stateManager = GetStateManagerGL(context);
const angle::FeaturesGL &features = GetFeaturesGL(context);
......
......@@ -44,7 +44,8 @@ class RenderbufferGL : public RenderbufferImpl
size_t samples,
GLenum internalformat,
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 initializeContents(const gl::Context *context,
......
......@@ -33,7 +33,8 @@ class RenderbufferMtl : public RenderbufferImpl
size_t samples,
GLenum internalformat,
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 getAttachmentRenderTarget(const gl::Context *context,
......
......@@ -93,7 +93,8 @@ angle::Result RenderbufferMtl::setStorageMultisample(const gl::Context *context,
size_t samples,
GLenum internalformat,
size_t width,
size_t height)
size_t height,
gl::MultisamplingMode mode)
{
// NOTE(hqle): Support MSAA
UNIMPLEMENTED();
......
......@@ -30,7 +30,8 @@ angle::Result RenderbufferNULL::setStorageMultisample(const gl::Context *context
size_t samples,
GLenum internalformat,
size_t width,
size_t height)
size_t height,
gl::MultisamplingMode mode)
{
return angle::Result::Continue;
}
......
......@@ -29,7 +29,8 @@ class RenderbufferNULL : public RenderbufferImpl
size_t samples,
GLenum internalformat,
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;
......
......@@ -41,7 +41,8 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context,
size_t samples,
GLenum internalformat,
size_t width,
size_t height)
size_t height,
gl::MultisamplingMode mode)
{
ContextVk *contextVk = vk::GetImpl(context);
RendererVk *renderer = contextVk->getRenderer();
......@@ -105,16 +106,18 @@ angle::Result RenderbufferVk::setStorage(const gl::Context *context,
size_t width,
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,
size_t samples,
GLenum internalformat,
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,
......
......@@ -33,7 +33,8 @@ class RenderbufferVk : public RenderbufferImpl, public angle::ObserverInterface
size_t samples,
GLenum internalformat,
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 getAttachmentRenderTarget(const gl::Context *context,
......@@ -66,7 +67,8 @@ class RenderbufferVk : public RenderbufferImpl, public angle::ObserverInterface
size_t samples,
GLenum internalformat,
size_t width,
size_t height);
size_t height,
gl::MultisamplingMode mode);
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