Skip to content

Commit

Permalink
Use variable template declarations for GCGLSpanTuple, ArrayReferenceT…
Browse files Browse the repository at this point in the history
…uple

https://bugs.webkit.org/show_bug.cgi?id=246923

Reviewed by Kimmo Kinnunen.

Provide a generic variable template for GCGLSpanTuple, dropping specializations for a
specific number of contained elements. The data pointers are now held in a std::tuple<>
object, and the getter data() method template expects an index value to perform access
into the tuple.

ArrayReferenceTuple is similarly adjusted, the variable template now handling any number
of elements instead of relying on specializations.

In RemoteGraphicsContextGLProxy implementation file, the helper toArrayReferenceTuple()
function is generalized into a variable template, constructing an ArrayReferenceTuple
from a given GCGLSpanTuple object according to the span tuple's size.

ArgumentCoder specializations for the ArrayReferenceTuple type are whittled down to a
single generic specialization that can cover any number of ArrayReferenceTuple elements.

* Source/WebCore/platform/graphics/GraphicsTypesGL.h:
(GCGLSpanTuple::GCGLSpanTuple):
(GCGLSpanTuple::data const):
* Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.cpp:
(WebCore::GraphicsContextGLANGLE::multiDrawArraysANGLE):
(WebCore::GraphicsContextGLANGLE::multiDrawArraysInstancedANGLE):
(WebCore::GraphicsContextGLANGLE::multiDrawElementsANGLE):
(WebCore::GraphicsContextGLANGLE::multiDrawElementsInstancedANGLE):
(WebCore::GraphicsContextGLANGLE::multiDrawArraysInstancedBaseInstanceANGLE):
(WebCore::GraphicsContextGLANGLE::multiDrawElementsInstancedBaseVertexBaseInstanceANGLE):
* Source/WebKit/Platform/IPC/ArgumentCoders.h:
* Source/WebKit/Platform/IPC/ArrayReferenceTuple.h:
(IPC::ArrayReferenceTuple::ArrayReferenceTuple):
(IPC::ArrayReferenceTuple::size const):
(IPC::ArrayReferenceTuple::data const):
* Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextGLProxy.cpp:

Canonical link: https://commits.webkit.org/255911@main
  • Loading branch information
zdobersek committed Oct 24, 2022
1 parent c585643 commit 227096e
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 368 deletions.
101 changes: 27 additions & 74 deletions Source/WebCore/platform/graphics/GraphicsTypesGL.h
Expand Up @@ -247,100 +247,53 @@ GCGLSpan<T, Extent> makeGCGLSpan(T* data)
}

template<typename... Types>
struct GCGLSpanTuple;
struct GCGLSpanTuple {
GCGLSpanTuple(Types*... dataPointers, size_t bufSize)
: bufSize { bufSize }
, dataTuple { dataPointers... }
{ }

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())
template<typename... VectorTypes>
GCGLSpanTuple(const Vector<VectorTypes>&... dataVectors)
: bufSize(
[](auto& firstVector, auto&... otherVectors) {
auto size = firstVector.size();
RELEASE_ASSERT(((otherVectors.size() == size) && ...));
return size;
}(dataVectors...))
, dataTuple { dataVectors.data()... }
{ }

template<unsigned I>
auto data() const
{
ASSERT(data0_.size() == data1_.size());
return std::get<I>(dataTuple);
}

const size_t bufSize;
T0* const data0;
T1* const data1;
std::tuple<Types*...> dataTuple;
};

template<typename T0, typename T1>
GCGLSpanTuple(T0*, T1*, size_t) -> GCGLSpanTuple<T0, T1>;

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;
};
GCGLSpanTuple(T0*, T1*, T2*, size_t) -> GCGLSpanTuple<T0, T1, T2>;

template<typename T0, typename T1, typename T2, typename T3>
struct GCGLSpanTuple<T0, T1, T2, T3> : public GCGLSpanTuple<T0, T1, T2> {
GCGLSpanTuple(T0* data0_, T1* data1_, T2* data2_, T3* data3_, size_t bufSize_)
: GCGLSpanTuple<T0, T1, T2>(data0_, data1_, data2_, bufSize_)
, data3(data3_)
{
}
template<typename U0, typename U1, typename U2, typename U3>
GCGLSpanTuple(const Vector<U0>& data0_, const Vector<U1>& data1_, const Vector<U2>& data2_, const Vector<U3>& data3_)
: GCGLSpanTuple<T0, T1, T2>(data0_, data1_, data2_)
, data3(data3_.data())
{
ASSERT(data3_.size() == data0_.size());
}
T3* const data3;
};
GCGLSpanTuple(T0*, T1*, T2*, T3*, size_t) -> GCGLSpanTuple<T0, T1, T2, T3>;

template<typename T0, typename T1, typename T2, typename T3, typename T4>
struct GCGLSpanTuple<T0, T1, T2, T3, T4> : public GCGLSpanTuple<T0, T1, T2, T3> {
GCGLSpanTuple(T0* data0_, T1* data1_, T2* data2_, T3* data3_, T4* data4_, size_t bufSize_)
: GCGLSpanTuple<T0, T1, T2, T3>(data0_, data1_, data2_, data3_, bufSize_)
, data4(data4_)
{
}
template<typename U0, typename U1, typename U2, typename U3, typename U4>
GCGLSpanTuple(const Vector<U0>& data0_, const Vector<U1>& data1_, const Vector<U2>& data2_, const Vector<U3>& data3_, const Vector<U4>& data4_)
: GCGLSpanTuple<T0, T1, T2, T3>(data0_, data1_, data2_, data3_)
, data4(data4_.data())
{
ASSERT(data4_.size() == data0_.size());
}
T4* const data4;
};

template<typename T0, typename T1>
GCGLSpanTuple(T0*, T1*, size_t) -> GCGLSpanTuple<T0, T1>;
GCGLSpanTuple(T0*, T1*, T2*, T3*, T4*, size_t) -> GCGLSpanTuple<T0, T1, T2, T3, T4>;

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>;

template<typename T0, typename T1, typename T2, typename T3>
GCGLSpanTuple(T0*, T1*, T2*, T3*, size_t) -> GCGLSpanTuple<T0, T1, T2, T3>;

template<typename T0, typename T1, typename T2, typename T3>
GCGLSpanTuple(const Vector<T0>&, const Vector<T1>&, const Vector<T2>&, const Vector<T3>&) -> GCGLSpanTuple<const T0, const T1, const T2, const T3>;

template<typename T0, typename T1, typename T2, typename T3, typename T4>
GCGLSpanTuple(T0*, T1*, T2*, T3*, T4*, size_t) -> GCGLSpanTuple<T0, T1, T2, T3, T4>;

template<typename T0, typename T1, typename T2, typename T3, typename T4>
GCGLSpanTuple(const Vector<T0>&, const Vector<T1>&, const Vector<T2>&, const Vector<T3>&, const Vector<T4>&) -> GCGLSpanTuple<const T0, const T1, const T2, const T3, const T4>;
Expand Up @@ -2855,7 +2855,7 @@ void GraphicsContextGLANGLE::multiDrawArraysANGLE(GCGLenum mode, GCGLSpanTuple<c
if (!makeContextCurrent())
return;

GL_MultiDrawArraysANGLE(mode, firstsAndCounts.data0, firstsAndCounts.data1, firstsAndCounts.bufSize);
GL_MultiDrawArraysANGLE(mode, firstsAndCounts.data<0>(), firstsAndCounts.data<1>(), firstsAndCounts.bufSize);
checkGPUStatus();
}

Expand All @@ -2864,7 +2864,7 @@ void GraphicsContextGLANGLE::multiDrawArraysInstancedANGLE(GCGLenum mode, GCGLSp
if (!makeContextCurrent())
return;

GL_MultiDrawArraysInstancedANGLE(mode, firstsCountsAndInstanceCounts.data0, firstsCountsAndInstanceCounts.data1, firstsCountsAndInstanceCounts.data2, firstsCountsAndInstanceCounts.bufSize);
GL_MultiDrawArraysInstancedANGLE(mode, firstsCountsAndInstanceCounts.data<0>(), firstsCountsAndInstanceCounts.data<1>(), firstsCountsAndInstanceCounts.data<2>(), firstsCountsAndInstanceCounts.bufSize);
checkGPUStatus();
}

Expand All @@ -2877,9 +2877,9 @@ void GraphicsContextGLANGLE::multiDrawElementsANGLE(GCGLenum mode, GCGLSpanTuple
Vector<void*> offsetsPointers;
offsetsPointers.reserveInitialCapacity(countsAndOffsets.bufSize);
for (size_t i = 0; i < countsAndOffsets.bufSize; ++i)
offsetsPointers.append(reinterpret_cast<void*>(countsAndOffsets.data1[i]));
offsetsPointers.append(reinterpret_cast<void*>(countsAndOffsets.data<1>()[i]));

GL_MultiDrawElementsANGLE(mode, countsAndOffsets.data0, type, offsetsPointers.data(), countsAndOffsets.bufSize);
GL_MultiDrawElementsANGLE(mode, countsAndOffsets.data<0>(), type, offsetsPointers.data(), countsAndOffsets.bufSize);
checkGPUStatus();
}

Expand All @@ -2892,9 +2892,9 @@ void GraphicsContextGLANGLE::multiDrawElementsInstancedANGLE(GCGLenum mode, GCGL
Vector<void*> offsetsPointers;
offsetsPointers.reserveInitialCapacity(countsOffsetsAndInstanceCounts.bufSize);
for (size_t i = 0; i < countsOffsetsAndInstanceCounts.bufSize; ++i)
offsetsPointers.append(reinterpret_cast<void*>(countsOffsetsAndInstanceCounts.data1[i]));
offsetsPointers.append(reinterpret_cast<void*>(countsOffsetsAndInstanceCounts.data<1>()[i]));

GL_MultiDrawElementsInstancedANGLE(mode, countsOffsetsAndInstanceCounts.data0, type, offsetsPointers.data(), countsOffsetsAndInstanceCounts.data2, countsOffsetsAndInstanceCounts.bufSize);
GL_MultiDrawElementsInstancedANGLE(mode, countsOffsetsAndInstanceCounts.data<0>(), type, offsetsPointers.data(), countsOffsetsAndInstanceCounts.data<2>(), countsOffsetsAndInstanceCounts.bufSize);
checkGPUStatus();
}

Expand Down Expand Up @@ -3030,7 +3030,7 @@ void GraphicsContextGLANGLE::multiDrawArraysInstancedBaseInstanceANGLE(GCGLenum
if (!makeContextCurrent())
return;

GL_MultiDrawArraysInstancedBaseInstanceANGLE(mode, firstsCountsInstanceCountsAndBaseInstances.data0, firstsCountsInstanceCountsAndBaseInstances.data1, firstsCountsInstanceCountsAndBaseInstances.data2, firstsCountsInstanceCountsAndBaseInstances.data3, firstsCountsInstanceCountsAndBaseInstances.bufSize);
GL_MultiDrawArraysInstancedBaseInstanceANGLE(mode, firstsCountsInstanceCountsAndBaseInstances.data<0>(), firstsCountsInstanceCountsAndBaseInstances.data<1>(), firstsCountsInstanceCountsAndBaseInstances.data<2>(), firstsCountsInstanceCountsAndBaseInstances.data<3>(), firstsCountsInstanceCountsAndBaseInstances.bufSize);
checkGPUStatus();
}

Expand All @@ -3043,9 +3043,9 @@ void GraphicsContextGLANGLE::multiDrawElementsInstancedBaseVertexBaseInstanceANG
Vector<void*> offsetsPointers;
offsetsPointers.reserveInitialCapacity(countsOffsetsInstanceCountsBaseVerticesAndBaseInstances.bufSize);
for (size_t i = 0; i < countsOffsetsInstanceCountsBaseVerticesAndBaseInstances.bufSize; ++i)
offsetsPointers.append(reinterpret_cast<void*>(countsOffsetsInstanceCountsBaseVerticesAndBaseInstances.data1[i]));
offsetsPointers.append(reinterpret_cast<void*>(countsOffsetsInstanceCountsBaseVerticesAndBaseInstances.data<1>()[i]));

GL_MultiDrawElementsInstancedBaseVertexBaseInstanceANGLE(mode, countsOffsetsInstanceCountsBaseVerticesAndBaseInstances.data0, type, offsetsPointers.data(), countsOffsetsInstanceCountsBaseVerticesAndBaseInstances.data2, countsOffsetsInstanceCountsBaseVerticesAndBaseInstances.data3, countsOffsetsInstanceCountsBaseVerticesAndBaseInstances.data4, countsOffsetsInstanceCountsBaseVerticesAndBaseInstances.bufSize);
GL_MultiDrawElementsInstancedBaseVertexBaseInstanceANGLE(mode, countsOffsetsInstanceCountsBaseVerticesAndBaseInstances.data<0>(), type, offsetsPointers.data(), countsOffsetsInstanceCountsBaseVerticesAndBaseInstances.data<2>(), countsOffsetsInstanceCountsBaseVerticesAndBaseInstances.data<3>(), countsOffsetsInstanceCountsBaseVerticesAndBaseInstances.data<4>(), countsOffsetsInstanceCountsBaseVerticesAndBaseInstances.bufSize);
checkGPUStatus();
}

Expand Down

0 comments on commit 227096e

Please sign in to comment.