Reverts "[Impeller] support GLES 3.0 MSAA without extension. (#56705)" (flutter/engine#56741)
Reverts: flutter/engine#56705 Initiated by: jonahwilliams Reason for reverting: goldens occassionally fail to render anything. Original PR Author: jonahwilliams Reviewed By: {gaaclarke} This change reverts the following previous change: Adds multisampling support for GLES devices without GL_EXT_multisampled_render_to_texture provided they are at least GLES 3.0 to support mutlisampled render buffers. Fixes https://github.com/flutter/flutter/issues/158360 Fixes https://github.com/flutter/flutter/issues/157951 TBD: should we prefer renderbuffer 3.0 approach over multisample_render_to_texture?
This commit is contained in:
parent
0e426efd96
commit
8958ff46da
@ -1667,15 +1667,10 @@ bool Canvas::BlitToOnscreen() {
|
|||||||
auto offscreen_target = render_passes_.back()
|
auto offscreen_target = render_passes_.back()
|
||||||
.inline_pass_context->GetPassTarget()
|
.inline_pass_context->GetPassTarget()
|
||||||
.GetRenderTarget();
|
.GetRenderTarget();
|
||||||
// Unlike other backends the blit to restore the onscreen fails for GLES
|
|
||||||
// if the src is a multisample framebuffer, even if we specifically target
|
|
||||||
// the non-multisampled resolve of the dst.
|
|
||||||
bool is_gles_and_must_skip_blit = renderer_.GetContext()->GetBackendType() ==
|
|
||||||
Context::BackendType::kOpenGLES;
|
|
||||||
if (renderer_.GetContext()
|
if (renderer_.GetContext()
|
||||||
->GetCapabilities()
|
->GetCapabilities()
|
||||||
->SupportsTextureToTextureBlits() &&
|
->SupportsTextureToTextureBlits()) {
|
||||||
!is_gles_and_must_skip_blit) {
|
|
||||||
auto blit_pass = command_buffer->CreateBlitPass();
|
auto blit_pass = command_buffer->CreateBlitPass();
|
||||||
blit_pass->AddCopy(offscreen_target.GetRenderTargetTexture(),
|
blit_pass->AddCopy(offscreen_target.GetRenderTargetTexture(),
|
||||||
render_target_.GetRenderTargetTexture());
|
render_target_.GetRenderTargetTexture());
|
||||||
|
@ -125,11 +125,7 @@ CapabilitiesGLES::CapabilitiesGLES(const ProcTableGLES& gl) {
|
|||||||
|
|
||||||
// We hard-code 4x MSAA, so let's make sure it's supported.
|
// We hard-code 4x MSAA, so let's make sure it's supported.
|
||||||
GLint value = 0;
|
GLint value = 0;
|
||||||
gl.GetIntegerv(GL_MAX_SAMPLES, &value);
|
gl.GetIntegerv(GL_MAX_SAMPLES_EXT, &value);
|
||||||
supports_offscreen_msaa_ = value >= 4;
|
|
||||||
} else if (desc->GetGlVersion().major_version >= 3 && desc->IsES()) {
|
|
||||||
GLint value = 0;
|
|
||||||
gl.GetIntegerv(GL_MAX_SAMPLES, &value);
|
|
||||||
supports_offscreen_msaa_ = value >= 4;
|
supports_offscreen_msaa_ = value >= 4;
|
||||||
}
|
}
|
||||||
is_es_ = desc->IsES();
|
is_es_ = desc->IsES();
|
||||||
|
@ -242,7 +242,6 @@ void(glDepthRange)(GLdouble n, GLdouble f);
|
|||||||
PROC(FenceSync); \
|
PROC(FenceSync); \
|
||||||
PROC(DeleteSync); \
|
PROC(DeleteSync); \
|
||||||
PROC(WaitSync); \
|
PROC(WaitSync); \
|
||||||
PROC(RenderbufferStorageMultisample) \
|
|
||||||
PROC(BlitFramebuffer);
|
PROC(BlitFramebuffer);
|
||||||
|
|
||||||
#define FOR_EACH_IMPELLER_EXT_PROC(PROC) \
|
#define FOR_EACH_IMPELLER_EXT_PROC(PROC) \
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include "GLES3/gl3.h"
|
#include "GLES3/gl3.h"
|
||||||
|
#include "flutter/fml/trace_event.h"
|
||||||
#include "fml/closure.h"
|
#include "fml/closure.h"
|
||||||
#include "fml/logging.h"
|
#include "fml/logging.h"
|
||||||
#include "impeller/base/validation.h"
|
#include "impeller/base/validation.h"
|
||||||
@ -126,7 +127,6 @@ struct RenderPassData {
|
|||||||
Scalar clear_depth = 1.0;
|
Scalar clear_depth = 1.0;
|
||||||
|
|
||||||
std::shared_ptr<Texture> color_attachment;
|
std::shared_ptr<Texture> color_attachment;
|
||||||
std::shared_ptr<Texture> resolve_attachment;
|
|
||||||
std::shared_ptr<Texture> depth_attachment;
|
std::shared_ptr<Texture> depth_attachment;
|
||||||
std::shared_ptr<Texture> stencil_attachment;
|
std::shared_ptr<Texture> stencil_attachment;
|
||||||
|
|
||||||
@ -191,6 +191,8 @@ void RenderPassGLES::ResetGLState(const ProcTableGLES& gl) {
|
|||||||
const ReactorGLES& reactor,
|
const ReactorGLES& reactor,
|
||||||
const std::vector<Command>& commands,
|
const std::vector<Command>& commands,
|
||||||
const std::shared_ptr<GPUTracerGLES>& tracer) {
|
const std::shared_ptr<GPUTracerGLES>& tracer) {
|
||||||
|
TRACE_EVENT0("impeller", "RenderPassGLES::EncodeCommandsInReactor");
|
||||||
|
|
||||||
const auto& gl = reactor.GetProcTable();
|
const auto& gl = reactor.GetProcTable();
|
||||||
#ifdef IMPELLER_DEBUG
|
#ifdef IMPELLER_DEBUG
|
||||||
tracer->MarkFrameStart(gl);
|
tracer->MarkFrameStart(gl);
|
||||||
@ -488,55 +490,6 @@ void RenderPassGLES::ResetGLState(const ProcTableGLES& gl) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pass_data.resolve_attachment &&
|
|
||||||
!gl.GetCapabilities()->SupportsImplicitResolvingMSAA() &&
|
|
||||||
!is_default_fbo) {
|
|
||||||
FML_DCHECK(pass_data.resolve_attachment != pass_data.color_attachment);
|
|
||||||
// Perform multisample resolve via blit.
|
|
||||||
// Create and bind a resolve FBO.
|
|
||||||
GLuint resolve_fbo;
|
|
||||||
gl.GenFramebuffers(1u, &resolve_fbo);
|
|
||||||
gl.BindFramebuffer(GL_FRAMEBUFFER, resolve_fbo);
|
|
||||||
|
|
||||||
if (!TextureGLES::Cast(*pass_data.resolve_attachment)
|
|
||||||
.SetAsFramebufferAttachment(
|
|
||||||
GL_FRAMEBUFFER, TextureGLES::AttachmentType::kColor0)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto status = gl.CheckFramebufferStatus(GL_FRAMEBUFFER);
|
|
||||||
if (gl.CheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
|
||||||
VALIDATION_LOG << "Could not create a complete frambuffer: "
|
|
||||||
<< DebugToFramebufferError(status);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bind MSAA renderbuffer to read framebuffer.
|
|
||||||
gl.BindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
|
|
||||||
gl.BindFramebuffer(GL_DRAW_FRAMEBUFFER, resolve_fbo);
|
|
||||||
|
|
||||||
RenderPassGLES::ResetGLState(gl);
|
|
||||||
auto size = pass_data.color_attachment->GetSize();
|
|
||||||
|
|
||||||
gl.BlitFramebuffer(0, // srcX0
|
|
||||||
0, // srcY0
|
|
||||||
size.width, // srcX1
|
|
||||||
size.height, // srcY1
|
|
||||||
0, // dstX0
|
|
||||||
0, // dstY0
|
|
||||||
size.width, // dstX1
|
|
||||||
size.height, // dstY1
|
|
||||||
GL_COLOR_BUFFER_BIT, // mask
|
|
||||||
GL_NEAREST // filter
|
|
||||||
);
|
|
||||||
|
|
||||||
gl.BindFramebuffer(GL_DRAW_FRAMEBUFFER, GL_NONE);
|
|
||||||
gl.BindFramebuffer(GL_READ_FRAMEBUFFER, GL_NONE);
|
|
||||||
gl.DeleteFramebuffers(1u, &resolve_fbo);
|
|
||||||
// Rebind the original FBO so that we can discard it below.
|
|
||||||
gl.BindFramebuffer(GL_FRAMEBUFFER, fbo);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gl.DiscardFramebufferEXT.IsAvailable()) {
|
if (gl.DiscardFramebufferEXT.IsAvailable()) {
|
||||||
std::vector<GLenum> attachments;
|
std::vector<GLenum> attachments;
|
||||||
|
|
||||||
@ -594,7 +547,6 @@ bool RenderPassGLES::OnEncodeCommands(const Context& context) const {
|
|||||||
/// Setup color data.
|
/// Setup color data.
|
||||||
///
|
///
|
||||||
pass_data->color_attachment = color0.texture;
|
pass_data->color_attachment = color0.texture;
|
||||||
pass_data->resolve_attachment = color0.resolve_texture;
|
|
||||||
pass_data->clear_color = color0.clear_color;
|
pass_data->clear_color = color0.clear_color;
|
||||||
pass_data->clear_color_attachment = CanClearAttachment(color0.load_action);
|
pass_data->clear_color_attachment = CanClearAttachment(color0.load_action);
|
||||||
pass_data->discard_color_attachment =
|
pass_data->discard_color_attachment =
|
||||||
@ -604,9 +556,8 @@ bool RenderPassGLES::OnEncodeCommands(const Context& context) const {
|
|||||||
// resolved when we bind the texture to the framebuffer. We don't need to
|
// resolved when we bind the texture to the framebuffer. We don't need to
|
||||||
// discard the attachment when we are done.
|
// discard the attachment when we are done.
|
||||||
if (color0.resolve_texture) {
|
if (color0.resolve_texture) {
|
||||||
pass_data->discard_color_attachment =
|
FML_DCHECK(context.GetCapabilities()->SupportsImplicitResolvingMSAA());
|
||||||
pass_data->discard_color_attachment &&
|
pass_data->discard_color_attachment = false;
|
||||||
!context.GetCapabilities()->SupportsImplicitResolvingMSAA();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
@ -45,8 +45,7 @@ static bool IsDepthStencilFormat(PixelFormat format) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static TextureGLES::Type GetTextureTypeFromDescriptor(
|
static TextureGLES::Type GetTextureTypeFromDescriptor(
|
||||||
const TextureDescriptor& desc,
|
const TextureDescriptor& desc) {
|
||||||
bool supports_implict_msaa) {
|
|
||||||
const auto usage = static_cast<TextureUsageMask>(desc.usage);
|
const auto usage = static_cast<TextureUsageMask>(desc.usage);
|
||||||
const auto render_target = TextureUsage::kRenderTarget;
|
const auto render_target = TextureUsage::kRenderTarget;
|
||||||
const auto is_msaa = desc.sample_count == SampleCount::kCount4;
|
const auto is_msaa = desc.sample_count == SampleCount::kCount4;
|
||||||
@ -54,9 +53,7 @@ static TextureGLES::Type GetTextureTypeFromDescriptor(
|
|||||||
return is_msaa ? TextureGLES::Type::kRenderBufferMultisampled
|
return is_msaa ? TextureGLES::Type::kRenderBufferMultisampled
|
||||||
: TextureGLES::Type::kRenderBuffer;
|
: TextureGLES::Type::kRenderBuffer;
|
||||||
}
|
}
|
||||||
return is_msaa ? (supports_implict_msaa
|
return is_msaa ? TextureGLES::Type::kTextureMultisampled
|
||||||
? TextureGLES::Type::kTextureMultisampled
|
|
||||||
: TextureGLES::Type::kRenderBufferMultisampled)
|
|
||||||
: TextureGLES::Type::kTexture;
|
: TextureGLES::Type::kTexture;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,11 +190,7 @@ TextureGLES::TextureGLES(std::shared_ptr<ReactorGLES> reactor,
|
|||||||
std::optional<HandleGLES> external_handle)
|
std::optional<HandleGLES> external_handle)
|
||||||
: Texture(desc),
|
: Texture(desc),
|
||||||
reactor_(std::move(reactor)),
|
reactor_(std::move(reactor)),
|
||||||
type_(
|
type_(GetTextureTypeFromDescriptor(GetTextureDescriptor())),
|
||||||
GetTextureTypeFromDescriptor(GetTextureDescriptor(),
|
|
||||||
reactor_->GetProcTable()
|
|
||||||
.GetCapabilities()
|
|
||||||
->SupportsImplicitResolvingMSAA())),
|
|
||||||
handle_(external_handle.has_value()
|
handle_(external_handle.has_value()
|
||||||
? external_handle.value()
|
? external_handle.value()
|
||||||
: reactor_->CreateHandle(ToHandleType(type_))),
|
: reactor_->CreateHandle(ToHandleType(type_))),
|
||||||
@ -369,7 +362,7 @@ static std::optional<GLenum> ToRenderBufferFormat(PixelFormat format) {
|
|||||||
switch (format) {
|
switch (format) {
|
||||||
case PixelFormat::kB8G8R8A8UNormInt:
|
case PixelFormat::kB8G8R8A8UNormInt:
|
||||||
case PixelFormat::kR8G8B8A8UNormInt:
|
case PixelFormat::kR8G8B8A8UNormInt:
|
||||||
return GL_RGBA8;
|
return GL_RGBA4;
|
||||||
case PixelFormat::kR32G32B32A32Float:
|
case PixelFormat::kR32G32B32A32Float:
|
||||||
return GL_RGBA32F;
|
return GL_RGBA32F;
|
||||||
case PixelFormat::kR16G16B16A16Float:
|
case PixelFormat::kR16G16B16A16Float:
|
||||||
@ -452,32 +445,19 @@ void TextureGLES::InitializeContentsIfNecessary() const {
|
|||||||
{
|
{
|
||||||
TRACE_EVENT0("impeller", "RenderBufferStorageInitialization");
|
TRACE_EVENT0("impeller", "RenderBufferStorageInitialization");
|
||||||
if (type_ == Type::kRenderBufferMultisampled) {
|
if (type_ == Type::kRenderBufferMultisampled) {
|
||||||
// BEWARE: these functions are not at all equivalent! the extensions
|
gl.RenderbufferStorageMultisampleEXT(
|
||||||
// are from EXT_multisampled_render_to_texture and cannot be used
|
GL_RENDERBUFFER, // target
|
||||||
// with regular GLES 3.0 multisampled renderbuffers/textures.
|
4, // samples
|
||||||
if (gl.GetCapabilities()->SupportsImplicitResolvingMSAA()) {
|
render_buffer_format.value(), // internal format
|
||||||
gl.RenderbufferStorageMultisampleEXT(
|
size.width, // width
|
||||||
/*target=*/GL_RENDERBUFFER, //
|
size.height // height
|
||||||
/*samples=*/4, //
|
);
|
||||||
/*internal_format=*/render_buffer_format.value(), //
|
|
||||||
/*width=*/size.width, //
|
|
||||||
/*height=*/size.height //
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
gl.RenderbufferStorageMultisample(
|
|
||||||
/*target=*/GL_RENDERBUFFER, //
|
|
||||||
/*samples=*/4, //
|
|
||||||
/*internal_format=*/render_buffer_format.value(), //
|
|
||||||
/*width=*/size.width, //
|
|
||||||
/*height=*/size.height //
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
gl.RenderbufferStorage(
|
gl.RenderbufferStorage(
|
||||||
/*target=*/GL_RENDERBUFFER, //
|
GL_RENDERBUFFER, // target
|
||||||
/*internal_format=*/render_buffer_format.value(), //
|
render_buffer_format.value(), // internal format
|
||||||
/*width=*/size.width, //
|
size.width, // width
|
||||||
/*height=*/size.height //
|
size.height // height
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user