Skip to content

Commit 0b5a6a9

Browse files
authored
[impeller] Add missing pieces to the OpenGLES backend. (flutter#33223)
1 parent bd66710 commit 0b5a6a9

12 files changed

+456
-42
lines changed

impeller/playground/imgui/imgui_impl_impeller.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ bool ImGui_ImplImpeller_Init(std::shared_ptr<impeller::Context> context) {
7878
impeller::StorageMode::kHostVisible, texture_descriptor);
7979
IM_ASSERT(bd->font_texture != nullptr &&
8080
"Could not allocate ImGui font texture.");
81+
bd->font_texture->SetLabel("ImGui Font Texture");
8182

8283
[[maybe_unused]] bool uploaded = bd->font_texture->SetContents(
8384
pixels, texture_descriptor.GetByteSizeOfBaseMipLevel());

impeller/playground/playground.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ bool Playground::OpenPlaygroundHere(Renderer::RenderCallback render_callback) {
203203
[]() { ImGui_ImplImpeller_Shutdown(); });
204204

205205
::glfwSetWindowSize(window, GetWindowSize().width, GetWindowSize().height);
206+
::glfwSetWindowPos(window, 200, 100);
206207
::glfwShowWindow(window);
207208

208209
while (true) {

impeller/renderer/backend/gles/buffer_bindings_gles.cc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include "impeller/renderer/backend/gles/buffer_bindings_gles.h"
66

7+
#include <algorithm>
78
#include <sstream>
89

910
#include "impeller/base/config.h"
@@ -21,7 +22,14 @@ BufferBindingsGLES::~BufferBindingsGLES() = default;
2122

2223
bool BufferBindingsGLES::RegisterVertexStageInput(
2324
const ProcTableGLES& gl,
24-
const std::vector<ShaderStageIOSlot>& inputs) {
25+
const std::vector<ShaderStageIOSlot>& p_inputs) {
26+
// Attrib locations have to be iterated over in order of location because we
27+
// will be calculating offsets later.
28+
auto inputs = p_inputs;
29+
std::sort(inputs.begin(), inputs.end(), [](const auto& lhs, const auto& rhs) {
30+
return lhs.location < rhs.location;
31+
});
32+
2533
std::vector<VertexAttribPointer> vertex_attrib_arrays;
2634
size_t offset = 0u;
2735
for (const auto& input : inputs) {

impeller/renderer/backend/gles/device_buffer_gles.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ DeviceBufferGLES::DeviceBufferGLES(ReactorGLES::Ref reactor,
2121

2222
// |DeviceBuffer|
2323
DeviceBufferGLES::~DeviceBufferGLES() {
24-
if (!reactor_) {
24+
if (!handle_.IsDead()) {
2525
reactor_->CollectHandle(handle_);
2626
}
2727
}

impeller/renderer/backend/gles/gles_handle.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ enum class HandleType {
2121
kTexture,
2222
kBuffer,
2323
kProgram,
24+
kRenderBuffer,
25+
kFrameBuffer,
2426
};
2527

2628
class ReactorGLES;

impeller/renderer/backend/gles/proc_table_gles.cc

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include <sstream>
88

9+
#include "impeller/base/comparable.h"
910
#include "impeller/base/validation.h"
1011

1112
namespace impeller {
@@ -43,6 +44,10 @@ ProcTableGLES::Resolver WrappedResolver(ProcTableGLES::Resolver resolver) {
4344
auto truncated = function.substr(0u, function.size() - 3);
4445
return resolver(truncated.c_str());
4546
}
47+
if (function.find("EXT", function.size() - 3) != std::string::npos) {
48+
auto truncated = function.substr(0u, function.size() - 3);
49+
return resolver(truncated.c_str());
50+
}
4651
return nullptr;
4752
};
4853
}
@@ -95,6 +100,12 @@ ProcTableGLES::ProcTableGLES(Resolver resolver) {
95100
PushDebugGroupKHR.Reset();
96101
PopDebugGroupKHR.Reset();
97102
ObjectLabelKHR.Reset();
103+
} else {
104+
GetIntegerv(GL_MAX_LABEL_LENGTH_KHR, &debug_label_max_length_);
105+
}
106+
107+
if (!description_->HasExtension("GL_EXT_discard_framebuffer")) {
108+
DiscardFramebufferEXT.Reset();
98109
}
99110

100111
is_valid_ = true;
@@ -223,27 +234,30 @@ bool ProcTableGLES::IsCurrentFramebufferComplete() const {
223234
static std::optional<GLenum> ToDebugIdentifier(DebugResourceType type) {
224235
switch (type) {
225236
case DebugResourceType::kTexture:
226-
// No entry in GL_KHR_debug headers.
227-
return std::nullopt;
237+
return GL_TEXTURE;
228238
case DebugResourceType::kBuffer:
229239
return GL_BUFFER_KHR;
230240
case DebugResourceType::kProgram:
231241
return GL_PROGRAM_KHR;
232242
case DebugResourceType::kShader:
233243
return GL_SHADER_KHR;
244+
case DebugResourceType::kRenderBuffer:
245+
return GL_RENDERBUFFER;
246+
case DebugResourceType::kFrameBuffer:
247+
return GL_FRAMEBUFFER;
234248
}
235249
FML_UNREACHABLE();
236250
}
237251

238252
void ProcTableGLES::SetDebugLabel(DebugResourceType type,
239253
GLint name,
240254
const std::string& label) const {
241-
if (!ObjectLabelKHR.IsAvailable()) {
255+
if (debug_label_max_length_ <= 0) {
242256
return;
243257
}
244258
const auto identifier = ToDebugIdentifier(type);
245259
const auto label_length =
246-
std::min<GLsizei>(GL_MAX_LABEL_LENGTH_KHR - 1, label.size());
260+
std::min<GLsizei>(debug_label_max_length_ - 1, label.size());
247261
if (!identifier.has_value()) {
248262
return;
249263
}
@@ -254,4 +268,25 @@ void ProcTableGLES::SetDebugLabel(DebugResourceType type,
254268
);
255269
}
256270

271+
void ProcTableGLES::PushDebugGroup(const std::string& label) const {
272+
if (debug_label_max_length_ <= 0) {
273+
return;
274+
}
275+
UniqueID id;
276+
const auto label_length =
277+
std::min<GLsizei>(debug_label_max_length_ - 1, label.size());
278+
PushDebugGroupKHR(GL_DEBUG_SOURCE_APPLICATION_KHR, // source
279+
static_cast<GLuint>(id.id), // id
280+
label_length, // length
281+
label.data() // message
282+
);
283+
}
284+
285+
void ProcTableGLES::PopDebugGroup() const {
286+
if (debug_label_max_length_ <= 0) {
287+
return;
288+
}
289+
PopDebugGroupKHR();
290+
}
291+
257292
} // namespace impeller

impeller/renderer/backend/gles/proc_table_gles.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ struct GLProc {
8080
PROC(AttachShader); \
8181
PROC(BindAttribLocation); \
8282
PROC(BindBuffer); \
83+
PROC(BindFramebuffer); \
84+
PROC(BindRenderbuffer); \
8385
PROC(BindTexture); \
8486
PROC(BlendEquationSeparate); \
8587
PROC(BlendFuncSeparate); \
@@ -95,7 +97,9 @@ struct GLProc {
9597
PROC(CreateShader); \
9698
PROC(CullFace); \
9799
PROC(DeleteBuffers); \
100+
PROC(DeleteFramebuffers); \
98101
PROC(DeleteProgram); \
102+
PROC(DeleteRenderbuffers); \
99103
PROC(DeleteShader); \
100104
PROC(DeleteTextures); \
101105
PROC(DepthFunc); \
@@ -107,8 +111,12 @@ struct GLProc {
107111
PROC(DrawElements); \
108112
PROC(Enable); \
109113
PROC(EnableVertexAttribArray); \
114+
PROC(FramebufferRenderbuffer); \
115+
PROC(FramebufferTexture2D); \
110116
PROC(FrontFace); \
111117
PROC(GenBuffers); \
118+
PROC(GenFramebuffers); \
119+
PROC(GenRenderbuffers); \
112120
PROC(GenTextures); \
113121
PROC(GetActiveUniform); \
114122
PROC(GetBooleanv); \
@@ -123,6 +131,7 @@ struct GLProc {
123131
PROC(IsFramebuffer); \
124132
PROC(IsProgram); \
125133
PROC(LinkProgram); \
134+
PROC(RenderbufferStorage); \
126135
PROC(Scissor); \
127136
PROC(ShaderBinary); \
128137
PROC(ShaderSource); \
@@ -141,6 +150,7 @@ struct GLProc {
141150
PROC(Viewport);
142151

143152
#define FOR_EACH_IMPELLER_EXT_PROC(PROC) \
153+
PROC(DiscardFramebufferEXT); \
144154
PROC(PushDebugGroupKHR); \
145155
PROC(PopDebugGroupKHR); \
146156
PROC(ObjectLabelKHR);
@@ -150,6 +160,8 @@ enum class DebugResourceType {
150160
kBuffer,
151161
kProgram,
152162
kShader,
163+
kRenderBuffer,
164+
kFrameBuffer,
153165
};
154166

155167
class ProcTableGLES {
@@ -181,9 +193,14 @@ class ProcTableGLES {
181193
GLint name,
182194
const std::string& label) const;
183195

196+
void PushDebugGroup(const std::string& string) const;
197+
198+
void PopDebugGroup() const;
199+
184200
private:
185201
bool is_valid_ = false;
186202
std::unique_ptr<GLDescription> description_;
203+
GLint debug_label_max_length_ = 0;
187204

188205
FML_DISALLOW_COPY_AND_ASSIGN(ProcTableGLES);
189206
};

impeller/renderer/backend/gles/reactor_gles.cc

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ static std::optional<GLuint> CreateGLHandle(const ProcTableGLES& gl,
6666
return handle;
6767
case HandleType::kProgram:
6868
return gl.CreateProgram();
69+
case HandleType::kRenderBuffer:
70+
gl.GenRenderbuffers(1u, &handle);
71+
return handle;
72+
case HandleType::kFrameBuffer:
73+
gl.GenFramebuffers(1u, &handle);
74+
return handle;
6975
}
7076
return std::nullopt;
7177
}
@@ -85,6 +91,12 @@ static bool CollectGLHandle(const ProcTableGLES& gl,
8591
case HandleType::kProgram:
8692
gl.DeleteProgram(handle);
8793
return true;
94+
case HandleType::kRenderBuffer:
95+
gl.DeleteRenderbuffers(1u, &handle);
96+
return true;
97+
case HandleType::kFrameBuffer:
98+
gl.DeleteFramebuffers(1u, &handle);
99+
return true;
88100
}
89101
return false;
90102
}
@@ -135,6 +147,10 @@ static DebugResourceType ToDebugResourceType(HandleType type) {
135147
return DebugResourceType::kBuffer;
136148
case HandleType::kProgram:
137149
return DebugResourceType::kProgram;
150+
case HandleType::kRenderBuffer:
151+
return DebugResourceType::kRenderBuffer;
152+
case HandleType::kFrameBuffer:
153+
return DebugResourceType::kFrameBuffer;
138154
}
139155
FML_UNREACHABLE();
140156
}
@@ -213,6 +229,17 @@ void ReactorGLES::SetDebugLabel(const GLESHandle& handle, std::string label) {
213229
if (handle.IsDead()) {
214230
return;
215231
}
232+
if (in_reaction_) {
233+
if (auto found = live_gl_handles_.find(handle);
234+
found != live_gl_handles_.end() && found->second.has_value()) {
235+
GetProcTable().SetDebugLabel(
236+
ToDebugResourceType(found->first.type), // type
237+
found->second.value(), // name
238+
label // label
239+
);
240+
return;
241+
}
242+
}
216243
pending_debug_labels_[handle] = std::move(label);
217244
}
218245

0 commit comments

Comments
 (0)