Diff
Modified: trunk/Source/WebCore/ChangeLog (293210 => 293211)
--- trunk/Source/WebCore/ChangeLog 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebCore/ChangeLog 2022-04-22 06:08:39 UTC (rev 293211)
@@ -1,3 +1,26 @@
+2022-04-21 John Cunningham <[email protected]>
+
+ Use GCGLSpanTuple to pass buffer parameters to multidraw calls.
+ https://bugs.webkit.org/show_bug.cgi?id=239154
+
+ Reviewed by Kimmo Kinnunen.
+
+ * html/canvas/WebGLMultiDraw.cpp:
+ (WebCore::WebGLMultiDraw::multiDrawArraysWEBGL):
+ (WebCore::WebGLMultiDraw::multiDrawArraysInstancedWEBGL):
+ (WebCore::WebGLMultiDraw::multiDrawElementsWEBGL):
+ (WebCore::WebGLMultiDraw::multiDrawElementsInstancedWEBGL):
+ (WebCore::makeSpanWithOffset): Deleted.
+ * platform/graphics/GraphicsContextGL.h:
+ * platform/graphics/GraphicsTypesGL.h:
+ * platform/graphics/angle/GraphicsContextGLANGLE.cpp:
+ (WebCore::GraphicsContextGLANGLE::multiDrawArraysANGLE):
+ (WebCore::GraphicsContextGLANGLE::multiDrawArraysInstancedANGLE):
+ (WebCore::GraphicsContextGLANGLE::multiDrawElementsANGLE):
+ (WebCore::GraphicsContextGLANGLE::multiDrawElementsInstancedANGLE):
+ * platform/graphics/angle/GraphicsContextGLANGLE.h:
+ * platform/graphics/opengl/GraphicsContextGLOpenGL.h:
+
2022-04-21 Rob Buis <[email protected]>
`contain: layout` on the html element should change position:fixed behavior
Modified: trunk/Source/WebCore/html/canvas/WebGLMultiDraw.cpp (293210 => 293211)
--- trunk/Source/WebCore/html/canvas/WebGLMultiDraw.cpp 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebCore/html/canvas/WebGLMultiDraw.cpp 2022-04-22 06:08:39 UTC (rev 293211)
@@ -34,11 +34,6 @@
WTF_MAKE_ISO_ALLOCATED_IMPL(WebGLMultiDraw);
-static GCGLSpan<const int> makeSpanWithOffset(WebGLMultiDraw::Int32List& list, GCGLuint offset)
-{
- return makeGCGLSpan(list.data() + offset, list.length() - offset);
-}
-
WebGLMultiDraw::WebGLMultiDraw(WebGLRenderingContextBase& context)
: WebGLExtension(context)
{
@@ -70,7 +65,7 @@
return;
}
- m_context->graphicsContextGL()->multiDrawArraysANGLE(mode, makeSpanWithOffset(firstsList, firstsOffset), makeSpanWithOffset(countsList, countsOffset), drawcount);
+ m_context->graphicsContextGL()->multiDrawArraysANGLE(mode, GCGLSpanTuple { firstsList.data() + firstsOffset, countsList.data() + countsOffset, static_cast<size_t>(drawcount) });
}
void WebGLMultiDraw::multiDrawArraysInstancedWEBGL(GCGLenum mode, Int32List firstsList, GCGLuint firstsOffset, Int32List countsList, GCGLuint countsOffset, Int32List instanceCountsList, GCGLuint instanceCountsOffset, GCGLsizei drawcount)
@@ -85,7 +80,7 @@
return;
}
- m_context->graphicsContextGL()->multiDrawArraysInstancedANGLE(mode, makeSpanWithOffset(firstsList, firstsOffset), makeSpanWithOffset(countsList, countsOffset), makeSpanWithOffset(instanceCountsList, instanceCountsOffset), drawcount);
+ m_context->graphicsContextGL()->multiDrawArraysInstancedANGLE(mode, GCGLSpanTuple { firstsList.data() + firstsOffset, countsList.data() + countsOffset, instanceCountsList.data() + instanceCountsOffset, static_cast<size_t>(drawcount) });
}
void WebGLMultiDraw::multiDrawElementsWEBGL(GCGLenum mode, Int32List countsList, GCGLuint countsOffset, GCGLenum type, Int32List offsetsList, GCGLuint offsetsOffset, GCGLsizei drawcount)
@@ -99,7 +94,7 @@
return;
}
- m_context->graphicsContextGL()->multiDrawElementsANGLE(mode, makeSpanWithOffset(countsList, countsOffset), type, makeSpanWithOffset(offsetsList, offsetsOffset), drawcount);
+ m_context->graphicsContextGL()->multiDrawElementsANGLE(mode, GCGLSpanTuple { countsList.data() + countsOffset, offsetsList.data() + offsetsOffset, static_cast<size_t>(drawcount) }, type);
}
void WebGLMultiDraw::multiDrawElementsInstancedWEBGL(GCGLenum mode, Int32List countsList, GCGLuint countsOffset, GCGLenum type, Int32List offsetsList, GCGLuint offsetsOffset, Int32List instanceCountsList, GCGLuint instanceCountsOffset, GCGLsizei drawcount)
@@ -114,7 +109,7 @@
return;
}
- m_context->graphicsContextGL()->multiDrawElementsInstancedANGLE(mode, makeSpanWithOffset(countsList, countsOffset), type, makeSpanWithOffset(offsetsList, offsetsOffset), makeSpanWithOffset(instanceCountsList, instanceCountsOffset), drawcount);
+ m_context->graphicsContextGL()->multiDrawElementsInstancedANGLE(mode, GCGLSpanTuple { countsList.data() + countsOffset, offsetsList.data() + offsetsOffset, instanceCountsList.data() + instanceCountsOffset, static_cast<size_t>(drawcount) }, type);
}
bool WebGLMultiDraw::validateDrawcount(const char* functionName, GCGLsizei drawcount)
Modified: trunk/Source/WebCore/platform/graphics/GraphicsContextGL.h (293210 => 293211)
--- trunk/Source/WebCore/platform/graphics/GraphicsContextGL.h 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebCore/platform/graphics/GraphicsContextGL.h 2022-04-22 06:08:39 UTC (rev 293211)
@@ -1360,10 +1360,10 @@
// ========== Extension related entry points.
// GL_ANGLE_multi_draw
- virtual void multiDrawArraysANGLE(GCGLenum mode, GCGLSpan<const GCGLint> firsts, GCGLSpan<const GCGLsizei> counts, GCGLsizei drawcount) = 0;
- virtual void multiDrawArraysInstancedANGLE(GCGLenum mode, GCGLSpan<const GCGLint> firsts, GCGLSpan<const GCGLsizei> counts, GCGLSpan<const GCGLsizei> instanceCounts, GCGLsizei drawcount) = 0;
- virtual void multiDrawElementsANGLE(GCGLenum mode, GCGLSpan<const GCGLsizei> counts, GCGLenum type, GCGLSpan<const GCGLint> offsets, GCGLsizei drawcount) = 0;
- virtual void multiDrawElementsInstancedANGLE(GCGLenum mode, GCGLSpan<const GCGLsizei> counts, GCGLenum type, GCGLSpan<const GCGLint> offsets, GCGLSpan<const GCGLsizei> instanceCounts, GCGLsizei drawcount) = 0;
+ virtual void multiDrawArraysANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLint, const GCGLsizei> firstsAndCounts) = 0;
+ virtual void multiDrawArraysInstancedANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLint, const GCGLsizei, const GCGLsizei> firstsCountsAndInstanceCounts) = 0;
+ virtual void multiDrawElementsANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLsizei, const GCGLint> countsAndOffsets, GCGLenum type) = 0;
+ virtual void multiDrawElementsInstancedANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLsizei, const GCGLint, const GCGLsizei> countsOffsetsAndInstanceCounts, GCGLenum type) = 0;
virtual bool supportsExtension(const String&) = 0;
Modified: trunk/Source/WebCore/platform/graphics/GraphicsTypesGL.h (293210 => 293211)
--- trunk/Source/WebCore/platform/graphics/GraphicsTypesGL.h 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebCore/platform/graphics/GraphicsTypesGL.h 2022-04-22 06:08:39 UTC (rev 293211)
@@ -193,3 +193,56 @@
{
return GCGLSpan<T, Extent> { data };
}
+
+template<typename... Types>
+struct GCGLSpanTuple;
+
+template<typename T0, typename T1>
+struct GCGLSpanTuple<T0, T1> {
+ GCGLSpanTuple(T0* data0_, T1* data1_, size_t bufSize_)
+ : bufSize(bufSize_)
+ , data0(data0_)
+ , data1(data1_)
+ {
+ }
+ template<typename U0, typename U1>
+ GCGLSpanTuple(const Vector<U0>& data0_, const Vector<U1>& data1_)
+ : bufSize(data0_.size())
+ , data0(data0_.data())
+ , data1(data1_.data())
+ {
+ ASSERT(data0_.size() == data1_.size());
+ }
+ const size_t bufSize;
+ T0* const data0;
+ T1* const data1;
+};
+
+template<typename T0, typename T1, typename T2>
+struct GCGLSpanTuple<T0, T1, T2> : public GCGLSpanTuple<T0, T1> {
+ GCGLSpanTuple(T0* data0_, T1* data1_, T2* data2_, size_t bufSize_)
+ : GCGLSpanTuple<T0, T1>(data0_, data1_, bufSize_)
+ , data2(data2_)
+ {
+ }
+ template<typename U0, typename U1, typename U2>
+ GCGLSpanTuple(const Vector<U0>& data0_, const Vector<U1>& data1_, const Vector<U2>& data2_)
+ : GCGLSpanTuple<T0, T1>(data0_, data1_)
+ , data2(data2_.data())
+ {
+ ASSERT(data2_.size() == data0_.size());
+ }
+ T2* const data2;
+};
+
+template<typename T0, typename T1>
+GCGLSpanTuple(T0*, T1*, size_t) -> GCGLSpanTuple<T0, T1>;
+
+template<typename T0, typename T1>
+GCGLSpanTuple(const Vector<T0>&, const Vector<T1>&) -> GCGLSpanTuple<const T0, const T1>;
+
+template<typename T0, typename T1, typename T2>
+GCGLSpanTuple(T0*, T1*, T2*, size_t) -> GCGLSpanTuple<T0, T1, T2>;
+
+template<typename T0, typename T1, typename T2>
+GCGLSpanTuple(const Vector<T0>&, const Vector<T1>&, const Vector<T2>&) -> GCGLSpanTuple<const T0, const T1, const T2>;
Modified: trunk/Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.cpp (293210 => 293211)
--- trunk/Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.cpp 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.cpp 2022-04-22 06:08:39 UTC (rev 293211)
@@ -2831,46 +2831,48 @@
GL_GetActiveUniformBlockivRobustANGLE(program, uniformBlockIndex, pname, params.bufSize, nullptr, params.data);
}
-void GraphicsContextGLANGLE::multiDrawArraysANGLE(GCGLenum mode, GCGLSpan<const GCGLint> firsts, GCGLSpan<const GCGLsizei> counts, GCGLsizei drawcount)
+void GraphicsContextGLANGLE::multiDrawArraysANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLint, const GCGLsizei> firstsAndCounts)
{
if (!makeContextCurrent())
return;
- GL_MultiDrawArraysANGLE(mode, firsts.data, counts.data, drawcount);
+ GL_MultiDrawArraysANGLE(mode, firstsAndCounts.data0, firstsAndCounts.data1, firstsAndCounts.bufSize);
}
-void GraphicsContextGLANGLE::multiDrawArraysInstancedANGLE(GCGLenum mode, GCGLSpan<const GCGLint> firsts, GCGLSpan<const GCGLsizei> counts, GCGLSpan<const GCGLsizei> instanceCounts, GCGLsizei drawcount)
+void GraphicsContextGLANGLE::multiDrawArraysInstancedANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLint, const GCGLsizei, const GCGLsizei> firstsCountsAndInstanceCounts)
{
if (!makeContextCurrent())
return;
- GL_MultiDrawArraysInstancedANGLE(mode, firsts.data, counts.data, instanceCounts.data, drawcount);
+ GL_MultiDrawArraysInstancedANGLE(mode, firstsCountsAndInstanceCounts.data0, firstsCountsAndInstanceCounts.data1, firstsCountsAndInstanceCounts.data2, firstsCountsAndInstanceCounts.bufSize);
}
-void GraphicsContextGLANGLE::multiDrawElementsANGLE(GCGLenum mode, GCGLSpan<const GCGLsizei> counts, GCGLenum type, GCGLSpan<const GCGLint> offsets, GCGLsizei drawcount)
+void GraphicsContextGLANGLE::multiDrawElementsANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLsizei, const GCGLint> countsAndOffsets, GCGLenum type)
{
if (!makeContextCurrent())
return;
// Must perform conversion from integer offsets to void* pointers before passing down to ANGLE.
- Vector<void*> pointers;
- for (size_t i = 0; i < offsets.bufSize; ++i)
- pointers.append(reinterpret_cast<void*>(offsets[i]));
+ Vector<void*> offsetsPointers;
+ offsetsPointers.reserveInitialCapacity(countsAndOffsets.bufSize);
+ for (size_t i = 0; i < countsAndOffsets.bufSize; ++i)
+ offsetsPointers.append(reinterpret_cast<void*>(countsAndOffsets.data1[i]));
- GL_MultiDrawElementsANGLE(mode, counts.data, type, pointers.data(), drawcount);
+ GL_MultiDrawElementsANGLE(mode, countsAndOffsets.data0, type, offsetsPointers.data(), countsAndOffsets.bufSize);
}
-void GraphicsContextGLANGLE::multiDrawElementsInstancedANGLE(GCGLenum mode, GCGLSpan<const GCGLsizei> counts, GCGLenum type, GCGLSpan<const GCGLint> offsets, GCGLSpan<const GCGLsizei> instanceCounts, GCGLsizei drawcount)
+void GraphicsContextGLANGLE::multiDrawElementsInstancedANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLsizei, const GCGLint, const GCGLsizei> countsOffsetsAndInstanceCounts, GCGLenum type)
{
if (!makeContextCurrent())
return;
// Must perform conversion from integer offsets to void* pointers before passing down to ANGLE.
- Vector<void*> pointers;
- for (size_t i = 0; i < offsets.bufSize; ++i)
- pointers.append(reinterpret_cast<void*>(offsets[i]));
+ Vector<void*> offsetsPointers;
+ offsetsPointers.reserveInitialCapacity(countsOffsetsAndInstanceCounts.bufSize);
+ for (size_t i = 0; i < countsOffsetsAndInstanceCounts.bufSize; ++i)
+ offsetsPointers.append(reinterpret_cast<void*>(countsOffsetsAndInstanceCounts.data1[i]));
- GL_MultiDrawElementsInstancedANGLE(mode, counts.data, type, pointers.data(), instanceCounts.data, drawcount);
+ GL_MultiDrawElementsInstancedANGLE(mode, countsOffsetsAndInstanceCounts.data0, type, offsetsPointers.data(), countsOffsetsAndInstanceCounts.data2, countsOffsetsAndInstanceCounts.bufSize);
}
bool GraphicsContextGLANGLE::supportsExtension(const String& name)
Modified: trunk/Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.h (293210 => 293211)
--- trunk/Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.h 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.h 2022-04-22 06:08:39 UTC (rev 293211)
@@ -302,10 +302,10 @@
String getActiveUniformBlockName(PlatformGLObject program, GCGLuint uniformBlockIndex) final;
void uniformBlockBinding(PlatformGLObject program, GCGLuint uniformBlockIndex, GCGLuint uniformBlockBinding) final;
void getActiveUniformBlockiv(GCGLuint program, GCGLuint uniformBlockIndex, GCGLenum pname, GCGLSpan<GCGLint> params) final;
- void multiDrawArraysANGLE(GCGLenum mode, GCGLSpan<const GCGLint> firsts, GCGLSpan<const GCGLsizei> counts, GCGLsizei drawcount) override;
- void multiDrawArraysInstancedANGLE(GCGLenum mode, GCGLSpan<const GCGLint> firsts, GCGLSpan<const GCGLsizei> counts, GCGLSpan<const GCGLsizei> instanceCounts, GCGLsizei drawcount) override;
- void multiDrawElementsANGLE(GCGLenum mode, GCGLSpan<const GCGLsizei> counts, GCGLenum type, GCGLSpan<const GCGLint> offsets, GCGLsizei drawcount) override;
- void multiDrawElementsInstancedANGLE(GCGLenum mode, GCGLSpan<const GCGLsizei> counts, GCGLenum type, GCGLSpan<const GCGLint> offsets, GCGLSpan<const GCGLsizei> instanceCounts, GCGLsizei drawcount) override;
+ void multiDrawArraysANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLint, const GCGLsizei> firstsAndCounts) final;
+ void multiDrawArraysInstancedANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLint, const GCGLsizei, const GCGLsizei> firstsCountsAndInstanceCounts) final;
+ void multiDrawElementsANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLsizei, const GCGLint> countsAndOffsets, GCGLenum type) final;
+ void multiDrawElementsInstancedANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLsizei, const GCGLint, const GCGLsizei> countsOffsetsAndInstanceCounts, GCGLenum type) final;
bool supportsExtension(const String&) override;
void ensureExtensionEnabled(const String&) override;
bool isExtensionEnabled(const String&) override;
Modified: trunk/Source/WebCore/platform/graphics/opengl/GraphicsContextGLOpenGL.cpp (293210 => 293211)
--- trunk/Source/WebCore/platform/graphics/opengl/GraphicsContextGLOpenGL.cpp 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebCore/platform/graphics/opengl/GraphicsContextGLOpenGL.cpp 2022-04-22 06:08:39 UTC (rev 293211)
@@ -3036,22 +3036,22 @@
{
}
-void GraphicsContextGLOpenGL::multiDrawArraysANGLE(GCGLenum, GCGLSpan<const GCGLint>, GCGLSpan<const GCGLsizei>, GCGLsizei)
+void GraphicsContextGLOpenGL::multiDrawArraysANGLE(GCGLenum, GCGLSpanTuple<const GCGLint, const GCGLsizei>)
{
synthesizeGLError(GraphicsContextGL::INVALID_OPERATION);
}
-void GraphicsContextGLOpenGL::multiDrawArraysInstancedANGLE(GCGLenum, GCGLSpan<const GCGLint>, GCGLSpan<const GCGLsizei>, GCGLSpan<const GCGLsizei>, GCGLsizei)
+void GraphicsContextGLOpenGL::multiDrawArraysInstancedANGLE(GCGLenum, GCGLSpanTuple<const GCGLint, const GCGLsizei, const GCGLsizei>)
{
synthesizeGLError(GraphicsContextGL::INVALID_OPERATION);
}
-void GraphicsContextGLOpenGL::multiDrawElementsANGLE(GCGLenum, GCGLSpan<const GCGLsizei>, GCGLenum, GCGLSpan<const GCGLint>, GCGLsizei)
+void GraphicsContextGLOpenGL::multiDrawElementsANGLE(GCGLenum, GCGLSpanTuple<const GCGLsizei, const GCGLint>, GCGLenum)
{
synthesizeGLError(GraphicsContextGL::INVALID_OPERATION);
}
-void GraphicsContextGLOpenGL::multiDrawElementsInstancedANGLE(GCGLenum, GCGLSpan<const GCGLsizei>, GCGLenum, GCGLSpan<const GCGLint>, GCGLSpan<const GCGLsizei>, GCGLsizei)
+void GraphicsContextGLOpenGL::multiDrawElementsInstancedANGLE(GCGLenum, GCGLSpanTuple<const GCGLsizei, const GCGLint, const GCGLsizei>, GCGLenum)
{
synthesizeGLError(GraphicsContextGL::INVALID_OPERATION);
}
Modified: trunk/Source/WebCore/platform/graphics/opengl/GraphicsContextGLOpenGL.h (293210 => 293211)
--- trunk/Source/WebCore/platform/graphics/opengl/GraphicsContextGLOpenGL.h 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebCore/platform/graphics/opengl/GraphicsContextGLOpenGL.h 2022-04-22 06:08:39 UTC (rev 293211)
@@ -364,10 +364,10 @@
void getActiveUniformBlockiv(GCGLuint program, GCGLuint uniformBlockIndex, GCGLenum pname, GCGLSpan<GCGLint> params) final;
// GL_ANGLE_multi_draw
- void multiDrawArraysANGLE(GCGLenum mode, GCGLSpan<const GCGLint> firsts, GCGLSpan<const GCGLsizei> counts, GCGLsizei drawcount) override;
- void multiDrawArraysInstancedANGLE(GCGLenum mode, GCGLSpan<const GCGLint> firsts, GCGLSpan<const GCGLsizei> counts, GCGLSpan<const GCGLsizei> instanceCounts, GCGLsizei drawcount) override;
- void multiDrawElementsANGLE(GCGLenum mode, GCGLSpan<const GCGLsizei> counts, GCGLenum type, GCGLSpan<const GCGLint> offsets, GCGLsizei drawcount) override;
- void multiDrawElementsInstancedANGLE(GCGLenum mode, GCGLSpan<const GCGLsizei> counts, GCGLenum type, GCGLSpan<const GCGLint> offsets, GCGLSpan<const GCGLsizei> instanceCounts, GCGLsizei drawcount) override;
+ void multiDrawArraysANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLint, const GCGLsizei> firstsAndCounts) override;
+ void multiDrawArraysInstancedANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLint, const GCGLsizei, const GCGLsizei> firstsCountsAndInstanceCounts) override;
+ void multiDrawElementsANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLsizei, const GCGLint> countsAndOffsets, GCGLenum type) override;
+ void multiDrawElementsInstancedANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLsizei, const GCGLint, const GCGLsizei> countsOffsetsAndInstanceCounts, GCGLenum type) override;
bool supportsExtension(const String&) final;
void ensureExtensionEnabled(const String&) final;
Modified: trunk/Source/WebKit/ChangeLog (293210 => 293211)
--- trunk/Source/WebKit/ChangeLog 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebKit/ChangeLog 2022-04-22 06:08:39 UTC (rev 293211)
@@ -1,3 +1,41 @@
+2022-04-21 John Cunningham <[email protected]>
+
+ Use GCGLSpanTuple to pass buffer parameters to multidraw calls.
+ https://bugs.webkit.org/show_bug.cgi?id=239154
+
+ Reviewed by Kimmo Kinnunen.
+
+ * GPUProcess/graphics/RemoteGraphicsContextGL.cpp:
+ (WebKit::WebCore::vectorCopyCast):
+ (WebKit::RemoteGraphicsContextGL::multiDrawArraysANGLE):
+ (WebKit::RemoteGraphicsContextGL::multiDrawArraysInstancedANGLE):
+ (WebKit::RemoteGraphicsContextGL::multiDrawElementsANGLE):
+ (WebKit::RemoteGraphicsContextGL::multiDrawElementsInstancedANGLE):
+ * GPUProcess/graphics/RemoteGraphicsContextGL.h:
+ * GPUProcess/graphics/RemoteGraphicsContextGL.messages.in:
+ * GPUProcess/graphics/RemoteGraphicsContextGLFunctionsGenerated.h:
+ (getInternalformativ):
+ (multiDrawArraysANGLE): Deleted.
+ (multiDrawArraysInstancedANGLE): Deleted.
+ (multiDrawElementsANGLE): Deleted.
+ (multiDrawElementsInstancedANGLE): Deleted.
+ * Platform/IPC/ArgumentCoders.h:
+ * Platform/IPC/ArrayReferenceTuple.h: Added.
+ * Scripts/webkit/messages.py:
+ (class_template_headers):
+ * WebKit.xcodeproj/project.pbxproj:
+ * WebProcess/GPU/graphics/RemoteGraphicsContextGLProxy.cpp:
+ (WebKit::RemoteGraphicsContextGLProxy::multiDrawArraysANGLE):
+ (WebKit::RemoteGraphicsContextGLProxy::multiDrawArraysInstancedANGLE):
+ (WebKit::RemoteGraphicsContextGLProxy::multiDrawElementsANGLE):
+ (WebKit::RemoteGraphicsContextGLProxy::multiDrawElementsInstancedANGLE):
+ * WebProcess/GPU/graphics/RemoteGraphicsContextGLProxy.h:
+ * WebProcess/GPU/graphics/RemoteGraphicsContextGLProxyFunctionsGenerated.cpp:
+ (WebKit::RemoteGraphicsContextGLProxy::multiDrawArraysANGLE): Deleted.
+ (WebKit::RemoteGraphicsContextGLProxy::multiDrawArraysInstancedANGLE): Deleted.
+ (WebKit::RemoteGraphicsContextGLProxy::multiDrawElementsANGLE): Deleted.
+ (WebKit::RemoteGraphicsContextGLProxy::multiDrawElementsInstancedANGLE): Deleted.
+
2022-04-20 Yusuke Suzuki <[email protected]>
[WTF] Add string concatenate adapter for UUID
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.cpp (293210 => 293211)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.cpp 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.cpp 2022-04-22 06:08:39 UTC (rev 293211)
@@ -46,6 +46,14 @@
using namespace WebCore;
+namespace {
+template<typename S, int I, typename T>
+Vector<S> vectorCopyCast(const T& arrayReference)
+{
+ return { reinterpret_cast<const S*>(arrayReference.template data<I>()), arrayReference.size() };
+}
+}
+
// Currently we have one global WebGL processing instance.
IPC::StreamConnectionWorkQueue& remoteGraphicsContextGLStreamWorkQueue()
{
@@ -315,6 +323,46 @@
m_context->readnPixels(x, y, width, height, format, type, static_cast<GCGLintptr>(offset));
}
+void RemoteGraphicsContextGL::multiDrawArraysANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t>&& firstsAndCounts)
+{
+ assertIsCurrent(workQueue());
+ // Copy the arrays. The contents are to be verified. The data might be in memory region shared by the caller.
+ Vector<GCGLint> firsts = vectorCopyCast<GCGLint, 0>(firstsAndCounts);
+ Vector<GCGLsizei> counts = vectorCopyCast<GCGLsizei, 1>(firstsAndCounts);
+ m_context->multiDrawArraysANGLE(mode, GCGLSpanTuple { firsts, counts });
+}
+
+void RemoteGraphicsContextGL::multiDrawArraysInstancedANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t, int32_t>&& firstsCountsAndInstanceCounts)
+{
+ assertIsCurrent(workQueue());
+ // Copy the arrays. The contents are to be verified. The data might be in memory region shared by the caller.
+ Vector<GCGLint> firsts = vectorCopyCast<GCGLint, 0>(firstsCountsAndInstanceCounts);
+ Vector<GCGLsizei> counts = vectorCopyCast<GCGLsizei, 1>(firstsCountsAndInstanceCounts);
+ Vector<GCGLsizei> instanceCounts = vectorCopyCast<GCGLsizei, 2>(firstsCountsAndInstanceCounts);
+ m_context->multiDrawArraysInstancedANGLE(mode, GCGLSpanTuple { firsts, counts, instanceCounts });
+}
+
+void RemoteGraphicsContextGL::multiDrawElementsANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t>&& countsAndOffsets, uint32_t type)
+{
+ assertIsCurrent(workQueue());
+ // Copy the arrays. The contents are to be verified. The data might be in memory region shared by the caller.
+ const Vector<GCGLsizei> counts = vectorCopyCast<GCGLsizei, 0>(countsAndOffsets);
+ // Currently offsets are copied in the m_context.
+ const GCGLint* offsets = reinterpret_cast<const GCGLint*>(countsAndOffsets.data<1>());
+ m_context->multiDrawElementsANGLE(mode, GCGLSpanTuple { counts.data(), offsets, counts.size() }, type);
+}
+
+void RemoteGraphicsContextGL::multiDrawElementsInstancedANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t, int32_t>&& countsOffsetsAndInstanceCounts, uint32_t type)
+{
+ assertIsCurrent(workQueue());
+ // Copy the arrays. The contents are to be verified. The data might be in memory region shared by the caller.
+ const Vector<GCGLsizei> counts = vectorCopyCast<GCGLsizei, 0>(countsOffsetsAndInstanceCounts);
+ // Currently offsets are copied in the m_context.
+ const GCGLint* offsets = reinterpret_cast<const GCGLint*>(countsOffsetsAndInstanceCounts.data<1>());
+ const Vector<GCGLsizei> instanceCounts = vectorCopyCast<GCGLsizei, 2>(countsOffsetsAndInstanceCounts);
+ m_context->multiDrawElementsInstancedANGLE(mode, GCGLSpanTuple { counts.data(), offsets, instanceCounts.data(), counts.size() }, type);
+}
+
} // namespace WebKit
#endif
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.h (293210 => 293211)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.h 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.h 2022-04-22 06:08:39 UTC (rev 293211)
@@ -131,6 +131,10 @@
void simulateEventForTesting(WebCore::GraphicsContextGL::SimulatedEventForTesting);
void readnPixels0(int32_t x, int32_t y, int32_t width, int32_t height, uint32_t format, uint32_t type, IPC::ArrayReference<uint8_t>&& data, CompletionHandler<void(IPC::ArrayReference<uint8_t>)>&&);
void readnPixels1(int32_t x, int32_t y, int32_t width, int32_t height, uint32_t format, uint32_t type, uint64_t offset);
+ void multiDrawArraysANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t>&& firstsAndCounts);
+ void multiDrawArraysInstancedANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t, int32_t>&& firstsCountsAndInstanceCounts);
+ void multiDrawElementsANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t>&& countsAndOffsets, uint32_t type);
+ void multiDrawElementsInstancedANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t, int32_t>&& countsOffsetsAndInstanceCounts, uint32_t type);
#include "RemoteGraphicsContextGLFunctionsGenerated.h" // NOLINT
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.messages.in (293210 => 293211)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.messages.in 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.messages.in 2022-04-22 06:08:39 UTC (rev 293211)
@@ -53,6 +53,10 @@
void SimulateEventForTesting(WebCore::GraphicsContextGL::SimulatedEventForTesting event)
void ReadnPixels0(int32_t x, int32_t y, int32_t width, int32_t height, uint32_t format, uint32_t type, IPC::ArrayReference<uint8_t> data) -> (IPC::ArrayReference<uint8_t> data) Synchronous
void ReadnPixels1(int32_t x, int32_t y, int32_t width, int32_t height, uint32_t format, uint32_t type, uint64_t offset)
+ void MultiDrawArraysANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t> firstsAndCounts)
+ void MultiDrawArraysInstancedANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t, int32_t> firstsCountsAandInstanceCounts)
+ void MultiDrawElementsANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t> countsAndOffsets, uint32_t type)
+ void MultiDrawElementsInstancedANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t, int32_t> countsOffsetsAndInstanceCounts, uint32_t type)
void MoveErrorsToSyntheticErrorList() -> (bool returnValue) Synchronous
void ActiveTexture(uint32_t texture)
@@ -290,10 +294,6 @@
void GetTranslatedShaderSourceANGLE(uint32_t arg0) -> (String returnValue) Synchronous
void DrawBuffersEXT(IPC::ArrayReference<uint32_t> bufs)
void GetInternalformativ(uint32_t target, uint32_t internalformat, uint32_t pname, uint64_t paramsSize) -> (IPC::ArrayReference<int32_t> params) Synchronous
- void MultiDrawArraysANGLE(uint32_t mode, IPC::ArrayReference<int32_t> firsts, IPC::ArrayReference<int32_t> counts, int32_t drawcount)
- void MultiDrawArraysInstancedANGLE(uint32_t mode, IPC::ArrayReference<int32_t> firsts, IPC::ArrayReference<int32_t> counts, IPC::ArrayReference<int32_t> instanceCounts, int32_t drawcount)
- void MultiDrawElementsANGLE(uint32_t mode, IPC::ArrayReference<int32_t> counts, uint32_t type, IPC::ArrayReference<int32_t> offsets, int32_t drawcount)
- void MultiDrawElementsInstancedANGLE(uint32_t mode, IPC::ArrayReference<int32_t> counts, uint32_t type, IPC::ArrayReference<int32_t> offsets, IPC::ArrayReference<int32_t> instanceCounts, int32_t drawcount)
void PaintRenderingResultsToPixelBuffer() -> (std::optional<WebCore::PixelBuffer> returnValue) Synchronous
}
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGLFunctionsGenerated.h (293210 => 293211)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGLFunctionsGenerated.h 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGLFunctionsGenerated.h 2022-04-22 06:08:39 UTC (rev 293211)
@@ -1340,26 +1340,6 @@
m_context->getInternalformativ(target, internalformat, pname, params);
completionHandler(IPC::ArrayReference<int32_t>(reinterpret_cast<int32_t*>(params.data()), params.size()));
}
- void multiDrawArraysANGLE(uint32_t mode, IPC::ArrayReference<int32_t>&& firsts, IPC::ArrayReference<int32_t>&& counts, int32_t drawcount)
- {
- assertIsCurrent(workQueue());
- m_context->multiDrawArraysANGLE(mode, makeGCGLSpan(reinterpret_cast<const GCGLint*>(firsts.data()), firsts.size()), makeGCGLSpan(reinterpret_cast<const GCGLsizei*>(counts.data()), counts.size()), drawcount);
- }
- void multiDrawArraysInstancedANGLE(uint32_t mode, IPC::ArrayReference<int32_t>&& firsts, IPC::ArrayReference<int32_t>&& counts, IPC::ArrayReference<int32_t>&& instanceCounts, int32_t drawcount)
- {
- assertIsCurrent(workQueue());
- m_context->multiDrawArraysInstancedANGLE(mode, makeGCGLSpan(reinterpret_cast<const GCGLint*>(firsts.data()), firsts.size()), makeGCGLSpan(reinterpret_cast<const GCGLsizei*>(counts.data()), counts.size()), makeGCGLSpan(reinterpret_cast<const GCGLsizei*>(instanceCounts.data()), instanceCounts.size()), drawcount);
- }
- void multiDrawElementsANGLE(uint32_t mode, IPC::ArrayReference<int32_t>&& counts, uint32_t type, IPC::ArrayReference<int32_t>&& offsets, int32_t drawcount)
- {
- assertIsCurrent(workQueue());
- m_context->multiDrawElementsANGLE(mode, makeGCGLSpan(reinterpret_cast<const GCGLsizei*>(counts.data()), counts.size()), type, makeGCGLSpan(reinterpret_cast<const GCGLint*>(offsets.data()), offsets.size()), drawcount);
- }
- void multiDrawElementsInstancedANGLE(uint32_t mode, IPC::ArrayReference<int32_t>&& counts, uint32_t type, IPC::ArrayReference<int32_t>&& offsets, IPC::ArrayReference<int32_t>&& instanceCounts, int32_t drawcount)
- {
- assertIsCurrent(workQueue());
- m_context->multiDrawElementsInstancedANGLE(mode, makeGCGLSpan(reinterpret_cast<const GCGLsizei*>(counts.data()), counts.size()), type, makeGCGLSpan(reinterpret_cast<const GCGLint*>(offsets.data()), offsets.size()), makeGCGLSpan(reinterpret_cast<const GCGLsizei*>(instanceCounts.data()), instanceCounts.size()), drawcount);
- }
void paintRenderingResultsToPixelBuffer(CompletionHandler<void(std::optional<WebCore::PixelBuffer>&&)>&& completionHandler)
{
std::optional<WebCore::PixelBuffer> returnValue = { };
Modified: trunk/Source/WebKit/Platform/IPC/ArgumentCoders.h (293210 => 293211)
--- trunk/Source/WebKit/Platform/IPC/ArgumentCoders.h 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebKit/Platform/IPC/ArgumentCoders.h 2022-04-22 06:08:39 UTC (rev 293211)
@@ -27,6 +27,7 @@
#include "ArgumentCoder.h"
#include "ArrayReference.h"
+#include "ArrayReferenceTuple.h"
#include <utility>
#include <variant>
#include <wtf/Box.h>
@@ -91,6 +92,85 @@
}
};
+template<typename T0, typename T1> struct ArgumentCoder<ArrayReferenceTuple<T0, T1>> {
+ using ArrayReferenceTupleType = ArrayReferenceTuple<T0, T1>;
+ template<typename Encoder>
+ static void encode(Encoder& encoder, const ArrayReferenceTupleType& arrayReference)
+ {
+ encoder << static_cast<uint64_t>(arrayReference.size());
+ auto size = arrayReference.size();
+ if (UNLIKELY(!size))
+ return;
+ encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(arrayReference.template data<0>()), size * sizeof(T0), alignof(T0));
+ encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(arrayReference.template data<1>()), size * sizeof(T1), alignof(T1));
+ }
+ static std::optional<ArrayReferenceTupleType> decode(Decoder& decoder)
+ {
+ uint64_t size;
+ if (UNLIKELY(!decoder.decode(size)))
+ return std::nullopt;
+ if (UNLIKELY(!size))
+ return ArrayReferenceTupleType { };
+
+ auto dataSize = CheckedSize { size } * sizeof(T0);
+ if (UNLIKELY(dataSize.hasOverflowed()))
+ return std::nullopt;
+ const uint8_t* data0 = decoder.decodeFixedLengthReference(dataSize, alignof(T0));
+ if (UNLIKELY(!data0))
+ return std::nullopt;
+ dataSize = CheckedSize { size } * sizeof(T1);
+ if (UNLIKELY(dataSize.hasOverflowed()))
+ return std::nullopt;
+ const uint8_t* data1 = decoder.decodeFixedLengthReference(dataSize, alignof(T1));
+ if (UNLIKELY(!data1))
+ return std::nullopt;
+ return ArrayReferenceTupleType { reinterpret_cast<const T0*>(data0), reinterpret_cast<const T1*>(data1), static_cast<size_t>(size) };
+ }
+};
+
+template<typename T0, typename T1, typename T2> struct ArgumentCoder<ArrayReferenceTuple<T0, T1, T2>> {
+ using ArrayReferenceTupleType = ArrayReferenceTuple<T0, T1, T2>;
+ template<typename Encoder>
+ static void encode(Encoder& encoder, const ArrayReferenceTupleType& arrayReference)
+ {
+ encoder << static_cast<uint64_t>(arrayReference.size());
+ auto size = arrayReference.size();
+ if (UNLIKELY(!size))
+ return;
+ encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(arrayReference.template data<0>()), size * sizeof(T0), alignof(T0));
+ encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(arrayReference.template data<1>()), size * sizeof(T1), alignof(T1));
+ encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(arrayReference.template data<2>()), size * sizeof(T2), alignof(T2));
+ }
+ static std::optional<ArrayReferenceTupleType> decode(Decoder& decoder)
+ {
+ uint64_t size;
+ if (UNLIKELY(!decoder.decode(size)))
+ return std::nullopt;
+ if (UNLIKELY(!size))
+ return ArrayReferenceTupleType { };
+
+ auto dataSize = CheckedSize { size } * sizeof(T0);
+ if (UNLIKELY(dataSize.hasOverflowed()))
+ return std::nullopt;
+ const uint8_t* data0 = decoder.decodeFixedLengthReference(dataSize, alignof(T0));
+ if (UNLIKELY(!data0))
+ return std::nullopt;
+ dataSize = CheckedSize { size } * sizeof(T1);
+ if (UNLIKELY(dataSize.hasOverflowed()))
+ return std::nullopt;
+ const uint8_t* data1 = decoder.decodeFixedLengthReference(dataSize, alignof(T1));
+ if (UNLIKELY(!data1))
+ return std::nullopt;
+ dataSize = CheckedSize { size } * sizeof(T2);
+ if (UNLIKELY(dataSize.hasOverflowed()))
+ return std::nullopt;
+ const uint8_t* data2 = decoder.decodeFixedLengthReference(dataSize, alignof(T2));
+ if (UNLIKELY(!data2))
+ return std::nullopt;
+ return ArrayReferenceTupleType { reinterpret_cast<const T0*>(data0), reinterpret_cast<const T1*>(data1), reinterpret_cast<const T2*>(data2), static_cast<size_t>(size) };
+ }
+};
+
template<typename T> struct ArgumentCoder<OptionSet<T>> {
template<typename Encoder>
static void encode(Encoder& encoder, const OptionSet<T>& optionSet)
Added: trunk/Source/WebKit/Platform/IPC/ArrayReferenceTuple.h (0 => 293211)
--- trunk/Source/WebKit/Platform/IPC/ArrayReferenceTuple.h (rev 0)
+++ trunk/Source/WebKit/Platform/IPC/ArrayReferenceTuple.h 2022-04-22 06:08:39 UTC (rev 293211)
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2022 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <wtf/Vector.h>
+
+namespace IPC {
+
+template <typename... Types> class ArrayReferenceTuple;
+
+template<typename T0, typename T1>
+class ArrayReferenceTuple<T0, T1> {
+public:
+ ArrayReferenceTuple() = default;
+ ArrayReferenceTuple(const T0* data0, const T1* data1, size_t size)
+ : m_size(size)
+ , m_data0(size ? data0 : nullptr)
+ , m_data1(size ? data1 : nullptr)
+ {
+ }
+ bool isEmpty() const { return !m_size; }
+ size_t size() const { return m_size; }
+ template<int I>
+ auto data() const
+ {
+ if constexpr(I)
+ return m_data1;
+ else if constexpr(!I)
+ return m_data0;
+ }
+private:
+ size_t m_size { 0 };
+ const T0* m_data0 { nullptr };
+ const T1* m_data1 { nullptr };
+};
+
+template<typename T0, typename T1, typename T2>
+class ArrayReferenceTuple<T0, T1, T2> : public ArrayReferenceTuple<T0, T1> {
+public:
+ ArrayReferenceTuple() = default;
+ ArrayReferenceTuple(const T0* data0, const T1* data1, const T2* data2, size_t size)
+ : ArrayReferenceTuple<T0, T1>(data0, data1, size)
+ , m_data2(size ? data2 : nullptr)
+ {
+ }
+ template<int I>
+ auto data() const
+ {
+ if constexpr(I == 2)
+ return m_data2;
+ else
+ return ArrayReferenceTuple<T0, T1>::template data<I>();
+ }
+private:
+ const T2* m_data2 { nullptr };
+};
+
+template<typename T0, typename T1>
+ArrayReferenceTuple(const T0*, const T1*, size_t) -> ArrayReferenceTuple<T0, T1>;
+
+template<typename T0, typename T1, typename T2>
+ArrayReferenceTuple(const T0*, const T1*, const T2*, size_t) -> ArrayReferenceTuple<T0, T1, T2>;
+
+}
Modified: trunk/Source/WebKit/Scripts/webkit/messages.py (293210 => 293211)
--- trunk/Source/WebKit/Scripts/webkit/messages.py 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebKit/Scripts/webkit/messages.py 2022-04-22 06:08:39 UTC (rev 293211)
@@ -634,6 +634,7 @@
'std::optional': {'headers': ['<optional>'], 'argument_coder_headers': ['"ArgumentCoders.h"']},
'std::pair': {'headers': ['<utility>'], 'argument_coder_headers': ['"ArgumentCoders.h"']},
'IPC::ArrayReference': {'headers': ['"ArrayReference.h"'], 'argument_coder_headers': ['"ArgumentCoders.h"']},
+ 'IPC::ArrayReferenceTuple': {'headers': ['"ArrayReferenceTuple.h"'], 'argument_coder_headers': ['"ArgumentCoders.h"']},
'Ref': {'headers': ['<wtf/Ref.h>'], 'argument_coder_headers': ['"ArgumentCoders.h"']},
'RefPtr': {'headers': ['<wtf/RefCounted.h>'], 'argument_coder_headers': ['"ArgumentCoders.h"']},
'RetainPtr': {'headers': ['<wtf/RetainPtr.h>'], 'argument_coder_headers': ['"ArgumentCodersCF.h"']},
Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (293210 => 293211)
--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2022-04-22 06:08:39 UTC (rev 293211)
@@ -913,6 +913,7 @@
46F38E8C2416E6730059375A /* RunningBoardServicesSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 46F38E8B2416E66D0059375A /* RunningBoardServicesSPI.h */; };
46F9B26323526EF3006FE5FA /* WebBackForwardCacheEntry.h in Headers */ = {isa = PBXBuildFile; fileRef = 46F9B26223526ED0006FE5FA /* WebBackForwardCacheEntry.h */; };
493102BD2683F3D0002BB885 /* AppPrivacyReport.h in Headers */ = {isa = PBXBuildFile; fileRef = 493102BC2683F3A5002BB885 /* AppPrivacyReport.h */; };
+ 4955A6E628076D4D00BB91C4 /* ArrayReferenceTuple.h in Headers */ = {isa = PBXBuildFile; fileRef = 4955A6E528076D4C00BB91C4 /* ArrayReferenceTuple.h */; };
4973DF482422941F00E4C26A /* NavigatingToAppBoundDomain.h in Headers */ = {isa = PBXBuildFile; fileRef = 4973DF472422941F00E4C26A /* NavigatingToAppBoundDomain.h */; };
4990002124D2429C00049CB4 /* WKRenderLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4990001F24D2429C00049CB4 /* WKRenderLayer.h */; settings = {ATTRIBUTES = (Private, ); }; };
4990002424D24C2900049CB4 /* WKRenderObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 4990002324D24C1C00049CB4 /* WKRenderObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -4620,6 +4621,7 @@
46F38E8B2416E66D0059375A /* RunningBoardServicesSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RunningBoardServicesSPI.h; sourceTree = "<group>"; };
46F9B26223526ED0006FE5FA /* WebBackForwardCacheEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebBackForwardCacheEntry.h; sourceTree = "<group>"; };
493102BC2683F3A5002BB885 /* AppPrivacyReport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppPrivacyReport.h; sourceTree = "<group>"; };
+ 4955A6E528076D4C00BB91C4 /* ArrayReferenceTuple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArrayReferenceTuple.h; sourceTree = "<group>"; };
4973DF472422941F00E4C26A /* NavigatingToAppBoundDomain.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NavigatingToAppBoundDomain.h; sourceTree = "<group>"; };
4990001E24D2429C00049CB4 /* WKRenderLayer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WKRenderLayer.cpp; sourceTree = "<group>"; };
4990001F24D2429C00049CB4 /* WKRenderLayer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKRenderLayer.h; sourceTree = "<group>"; };
@@ -8255,6 +8257,7 @@
1A3D610413A7F03A00F95D4E /* ArgumentCoders.cpp */,
1AEFD2F611D1807B008219D3 /* ArgumentCoders.h */,
7B1DB26525668CE0000E26BC /* ArrayReference.h */,
+ 4955A6E528076D4C00BB91C4 /* ArrayReferenceTuple.h */,
BCEE966A112FAF57006BCC24 /* Attachment.cpp */,
BCEE966B112FAF57006BCC24 /* Attachment.h */,
BC032DA210F437D10058C15A /* Connection.cpp */,
@@ -13882,6 +13885,7 @@
1AAF0C4A12B16334008E49E2 /* ArgumentCodersCF.h in Headers */,
A175C44A21AA3171000037D0 /* ArgumentCodersCocoa.h in Headers */,
7B1DB26625668CE1000E26BC /* ArrayReference.h in Headers */,
+ 4955A6E628076D4D00BB91C4 /* ArrayReferenceTuple.h in Headers */,
AAFA634F234F7C6400FFA864 /* AsyncRevalidation.h in Headers */,
BCEE966D112FAF57006BCC24 /* Attachment.h in Headers */,
512F589712A8838800629530 /* AuthenticationChallengeProxy.h in Headers */,
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextGLProxy.cpp (293210 => 293211)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextGLProxy.cpp 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextGLProxy.cpp 2022-04-22 06:08:39 UTC (rev 293211)
@@ -47,6 +47,26 @@
static constexpr size_t defaultStreamSize = 1 << 21;
+namespace {
+template<typename T0, typename T1, typename S0, typename S1>
+IPC::ArrayReferenceTuple<T0, T1> toArrayReferenceTuple(GCGLSpanTuple<const S0, const S1> spanTuple)
+{
+ return IPC::ArrayReferenceTuple {
+ reinterpret_cast<const T0*>(spanTuple.data0),
+ reinterpret_cast<const T1*>(spanTuple.data1),
+ spanTuple.bufSize };
+}
+template<typename T0, typename T1, typename T2, typename S0, typename S1, typename S2>
+IPC::ArrayReferenceTuple<T0, T1, T2> toArrayReferenceTuple(GCGLSpanTuple<const S0, const S1, const S2> spanTuple)
+{
+ return IPC::ArrayReferenceTuple {
+ reinterpret_cast<const T0*>(spanTuple.data0),
+ reinterpret_cast<const T1*>(spanTuple.data1),
+ reinterpret_cast<const T2*>(spanTuple.data2),
+ spanTuple.bufSize };
+}
+}
+
RemoteGraphicsContextGLProxy::RemoteGraphicsContextGLProxy(GPUProcessConnection& gpuProcessConnection, const GraphicsContextGLAttributes& attributes, RenderingBackendIdentifier renderingBackend)
: GraphicsContextGL(attributes)
, m_gpuProcessConnection(&gpuProcessConnection)
@@ -260,6 +280,43 @@
}
}
+
+void RemoteGraphicsContextGLProxy::multiDrawArraysANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLint, const GCGLsizei> firstsAndCounts)
+{
+ if (!isContextLost()) {
+ auto sendResult = send(Messages::RemoteGraphicsContextGL::MultiDrawArraysANGLE(mode, toArrayReferenceTuple<int32_t, int32_t>(firstsAndCounts)));
+ if (!sendResult)
+ markContextLost();
+ }
+}
+
+void RemoteGraphicsContextGLProxy::multiDrawArraysInstancedANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLint, const GCGLsizei, const GCGLsizei> firstsCountsAndInstanceCounts)
+{
+ if (!isContextLost()) {
+ auto sendResult = send(Messages::RemoteGraphicsContextGL::MultiDrawArraysInstancedANGLE(mode, toArrayReferenceTuple<int32_t, int32_t, int32_t>(firstsCountsAndInstanceCounts)));
+ if (!sendResult)
+ markContextLost();
+ }
+}
+
+void RemoteGraphicsContextGLProxy::multiDrawElementsANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLsizei, const GCGLint> countsAndOffsets, GCGLenum type)
+{
+ if (!isContextLost()) {
+ auto sendResult = send(Messages::RemoteGraphicsContextGL::MultiDrawElementsANGLE(mode, toArrayReferenceTuple<int32_t, int32_t>(countsAndOffsets), type));
+ if (!sendResult)
+ markContextLost();
+ }
+}
+
+void RemoteGraphicsContextGLProxy::multiDrawElementsInstancedANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLsizei, const GCGLint, const GCGLsizei> countsOffsetsAndInstanceCounts, GCGLenum type)
+{
+ if (!isContextLost()) {
+ auto sendResult = send(Messages::RemoteGraphicsContextGL::MultiDrawElementsInstancedANGLE(mode, toArrayReferenceTuple<int32_t, int32_t, int32_t>(countsOffsetsAndInstanceCounts), type));
+ if (!sendResult)
+ markContextLost();
+ }
+}
+
void RemoteGraphicsContextGLProxy::wasCreated(bool didSucceed, IPC::Semaphore&& semaphore, String&& availableExtensions, String&& requestedExtensions)
{
if (isContextLost())
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextGLProxy.h (293210 => 293211)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextGLProxy.h 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextGLProxy.h 2022-04-22 06:08:39 UTC (rev 293211)
@@ -79,6 +79,10 @@
void simulateEventForTesting(SimulatedEventForTesting) final;
void readnPixels(GCGLint x, GCGLint y, GCGLsizei width, GCGLsizei height, GCGLenum format, GCGLenum type, GCGLSpan<GCGLvoid> data) final;
void readnPixels(GCGLint x, GCGLint y, GCGLsizei width, GCGLsizei height, GCGLenum format, GCGLenum type, GCGLintptr offset) final;
+ void multiDrawArraysANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLint, const GCGLsizei> firstsAndCounts) final;
+ void multiDrawArraysInstancedANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLint, const GCGLsizei, const GCGLsizei> firstsCountsAndInstanceCounts) final;
+ void multiDrawElementsANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLsizei, const GCGLint> countsAndOffsets, GCGLenum type) final;
+ void multiDrawElementsInstancedANGLE(GCGLenum mode, GCGLSpanTuple<const GCGLsizei, const GCGLint, const GCGLsizei> countsOffsetsAndInstanceCounts, GCGLenum type) final;
// Functions with a generated implementation. This list is used by generate-gpup-webgl script.
bool moveErrorsToSyntheticErrorList() final;
@@ -317,10 +321,6 @@
String getTranslatedShaderSourceANGLE(PlatformGLObject arg0) final;
void drawBuffersEXT(GCGLSpan<const GCGLenum> bufs) final;
void getInternalformativ(GCGLenum target, GCGLenum internalformat, GCGLenum pname, GCGLSpan<GCGLint> params) final;
- void multiDrawArraysANGLE(GCGLenum mode, GCGLSpan<const GCGLint> firsts, GCGLSpan<const GCGLsizei> counts, GCGLsizei drawcount) final;
- void multiDrawArraysInstancedANGLE(GCGLenum mode, GCGLSpan<const GCGLint> firsts, GCGLSpan<const GCGLsizei> counts, GCGLSpan<const GCGLsizei> instanceCounts, GCGLsizei drawcount) final;
- void multiDrawElementsANGLE(GCGLenum mode, GCGLSpan<const GCGLsizei> counts, GCGLenum type, GCGLSpan<const GCGLint> offsets, GCGLsizei drawcount) final;
- void multiDrawElementsInstancedANGLE(GCGLenum mode, GCGLSpan<const GCGLsizei> counts, GCGLenum type, GCGLSpan<const GCGLint> offsets, GCGLSpan<const GCGLsizei> instanceCounts, GCGLsizei drawcount) final;
std::optional<WebCore::PixelBuffer> paintRenderingResultsToPixelBuffer() final;
// End of list used by generate-gpup-webgl script.
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextGLProxyFunctionsGenerated.cpp (293210 => 293211)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextGLProxyFunctionsGenerated.cpp 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextGLProxyFunctionsGenerated.cpp 2022-04-22 06:08:39 UTC (rev 293211)
@@ -2299,42 +2299,6 @@
}
}
-void RemoteGraphicsContextGLProxy::multiDrawArraysANGLE(GCGLenum mode, GCGLSpan<const GCGLint> firsts, GCGLSpan<const GCGLsizei> counts, GCGLsizei drawcount)
-{
- if (!isContextLost()) {
- auto sendResult = send(Messages::RemoteGraphicsContextGL::MultiDrawArraysANGLE(mode, IPC::ArrayReference<int32_t>(reinterpret_cast<const int32_t*>(firsts.data), firsts.bufSize), IPC::ArrayReference<int32_t>(reinterpret_cast<const int32_t*>(counts.data), counts.bufSize), drawcount));
- if (!sendResult)
- markContextLost();
- }
-}
-
-void RemoteGraphicsContextGLProxy::multiDrawArraysInstancedANGLE(GCGLenum mode, GCGLSpan<const GCGLint> firsts, GCGLSpan<const GCGLsizei> counts, GCGLSpan<const GCGLsizei> instanceCounts, GCGLsizei drawcount)
-{
- if (!isContextLost()) {
- auto sendResult = send(Messages::RemoteGraphicsContextGL::MultiDrawArraysInstancedANGLE(mode, IPC::ArrayReference<int32_t>(reinterpret_cast<const int32_t*>(firsts.data), firsts.bufSize), IPC::ArrayReference<int32_t>(reinterpret_cast<const int32_t*>(counts.data), counts.bufSize), IPC::ArrayReference<int32_t>(reinterpret_cast<const int32_t*>(instanceCounts.data), instanceCounts.bufSize), drawcount));
- if (!sendResult)
- markContextLost();
- }
-}
-
-void RemoteGraphicsContextGLProxy::multiDrawElementsANGLE(GCGLenum mode, GCGLSpan<const GCGLsizei> counts, GCGLenum type, GCGLSpan<const GCGLint> offsets, GCGLsizei drawcount)
-{
- if (!isContextLost()) {
- auto sendResult = send(Messages::RemoteGraphicsContextGL::MultiDrawElementsANGLE(mode, IPC::ArrayReference<int32_t>(reinterpret_cast<const int32_t*>(counts.data), counts.bufSize), type, IPC::ArrayReference<int32_t>(reinterpret_cast<const int32_t*>(offsets.data), offsets.bufSize), drawcount));
- if (!sendResult)
- markContextLost();
- }
-}
-
-void RemoteGraphicsContextGLProxy::multiDrawElementsInstancedANGLE(GCGLenum mode, GCGLSpan<const GCGLsizei> counts, GCGLenum type, GCGLSpan<const GCGLint> offsets, GCGLSpan<const GCGLsizei> instanceCounts, GCGLsizei drawcount)
-{
- if (!isContextLost()) {
- auto sendResult = send(Messages::RemoteGraphicsContextGL::MultiDrawElementsInstancedANGLE(mode, IPC::ArrayReference<int32_t>(reinterpret_cast<const int32_t*>(counts.data), counts.bufSize), type, IPC::ArrayReference<int32_t>(reinterpret_cast<const int32_t*>(offsets.data), offsets.bufSize), IPC::ArrayReference<int32_t>(reinterpret_cast<const int32_t*>(instanceCounts.data), instanceCounts.bufSize), drawcount));
- if (!sendResult)
- markContextLost();
- }
-}
-
std::optional<WebCore::PixelBuffer> RemoteGraphicsContextGLProxy::paintRenderingResultsToPixelBuffer()
{
std::optional<WebCore::PixelBuffer> returnValue = { };
Modified: trunk/Tools/ChangeLog (293210 => 293211)
--- trunk/Tools/ChangeLog 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Tools/ChangeLog 2022-04-22 06:08:39 UTC (rev 293211)
@@ -1,3 +1,12 @@
+2022-04-21 John Cunningham <[email protected]>
+
+ Use GCGLSpanTuple to pass buffer parameters to multidraw calls.
+ https://bugs.webkit.org/show_bug.cgi?id=239154
+
+ Reviewed by Kimmo Kinnunen.
+
+ * Scripts/generate-gpup-webgl:
+
2022-04-21 Justin Michaud <[email protected]>
[PGO] Fix perl warnings cause by PGO for real this time
Modified: trunk/Tools/Scripts/generate-gpup-webgl (293210 => 293211)
--- trunk/Tools/Scripts/generate-gpup-webgl 2022-04-22 05:41:35 UTC (rev 293210)
+++ trunk/Tools/Scripts/generate-gpup-webgl 2022-04-22 06:08:39 UTC (rev 293211)
@@ -114,6 +114,10 @@
void SimulateEventForTesting(WebCore::GraphicsContextGL::SimulatedEventForTesting event)
void ReadnPixels0(int32_t x, int32_t y, int32_t width, int32_t height, uint32_t format, uint32_t type, IPC::ArrayReference<uint8_t> data) -> (IPC::ArrayReference<uint8_t> data) Synchronous
void ReadnPixels1(int32_t x, int32_t y, int32_t width, int32_t height, uint32_t format, uint32_t type, uint64_t offset)
+ void MultiDrawArraysANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t> firstsAndCounts)
+ void MultiDrawArraysInstancedANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t, int32_t> firstsCountsAandInstanceCounts)
+ void MultiDrawElementsANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t> countsAndOffsets, uint32_t type)
+ void MultiDrawElementsInstancedANGLE(uint32_t mode, IPC::ArrayReferenceTuple<int32_t, int32_t, int32_t> countsOffsetsAndInstanceCounts, uint32_t type)
{}
}}
@@ -224,7 +228,7 @@
def is_span(self) -> bool:
return self.container_name == "GCGLSpan"
def is_dynamic_span(self) -> bool:
- return self.container_name == "GCGLSpan" and self.arity is None
+ return (self.container_name == "GCGLSpan" and self.arity is None) or self.container_name == "GCGLSpanTuple"
def get_container_name(self):
return self.container_name
def get_arity(self) -> Optional[int]: