Commit 90561c0e by Ben Clayton

Renderer.cpp: Refactor setBatchIndices...

... so we can use it for the non-indexed case. Bug: b/118386749 Tests: dEQP-VK.draw.basic_draw.* Change-Id: I21f1616db0b6613f8db6bff61f6aa1dfcf67c253 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/28356 Presubmit-Ready: Ben Clayton <bclayton@google.com> Tested-by: 's avatarBen Clayton <bclayton@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent e3afd70e
...@@ -84,78 +84,88 @@ namespace sw ...@@ -84,78 +84,88 @@ namespace sw
} }
template<typename T> template<typename T>
inline bool setBatchIndices(unsigned int batch[128][3], VkPrimitiveTopology topology, const T* indices, unsigned int start, unsigned int triangleCount) inline bool setBatchIndices(unsigned int batch[128][3], VkPrimitiveTopology topology, T indices, unsigned int start, unsigned int triangleCount)
{ {
const T *index = indices + start;
switch(topology) switch(topology)
{ {
case VK_PRIMITIVE_TOPOLOGY_POINT_LIST: case VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
{
auto index = start;
for(unsigned int i = 0; i < triangleCount; i++) for(unsigned int i = 0; i < triangleCount; i++)
{ {
batch[i][0] = *index; batch[i][0] = indices[index];
batch[i][1] = *index; batch[i][1] = indices[index];
batch[i][2] = *index; batch[i][2] = indices[index];
index += 1; index += 1;
} }
break; break;
}
case VK_PRIMITIVE_TOPOLOGY_LINE_LIST: case VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
index += start; {
auto index = 2 * start;
for(unsigned int i = 0; i < triangleCount; i++) for(unsigned int i = 0; i < triangleCount; i++)
{ {
batch[i][0] = index[0]; batch[i][0] = indices[index + 0];
batch[i][1] = index[1]; batch[i][1] = indices[index + 1];
batch[i][2] = index[1]; batch[i][2] = indices[index + 1];
index += 2; index += 2;
} }
break; break;
}
case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP: case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
{
auto index = start;
for(unsigned int i = 0; i < triangleCount; i++) for(unsigned int i = 0; i < triangleCount; i++)
{ {
batch[i][0] = index[0]; batch[i][0] = indices[index + 0];
batch[i][1] = index[1]; batch[i][1] = indices[index + 1];
batch[i][2] = index[1]; batch[i][2] = indices[index + 1];
index += 1; index += 1;
} }
break; break;
}
case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST: case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
index += start + start; {
auto index = 3 * start;
for(unsigned int i = 0; i < triangleCount; i++) for(unsigned int i = 0; i < triangleCount; i++)
{ {
batch[i][0] = index[0]; batch[i][0] = indices[index + 0];
batch[i][1] = index[1]; batch[i][1] = indices[index + 1];
batch[i][2] = index[2]; batch[i][2] = indices[index + 2];
index += 3; index += 3;
} }
break; break;
}
case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP: case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
{
auto index = start;
for(unsigned int i = 0; i < triangleCount; i++) for(unsigned int i = 0; i < triangleCount; i++)
{ {
batch[i][0] = index[0]; batch[i][0] = indices[index + 0];
batch[i][1] = index[((start + i) & 1) + 1]; batch[i][1] = indices[index + ((start + i) & 1) + 1];
batch[i][2] = index[(~(start + i) & 1) + 1]; batch[i][2] = indices[index + (~(start + i) & 1) + 1];
index += 1; index += 1;
} }
break; break;
}
case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN: case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
index += 1; {
auto index = start + 1;
for(unsigned int i = 0; i < triangleCount; i++) for(unsigned int i = 0; i < triangleCount; i++)
{ {
batch[i][0] = index[0]; batch[i][0] = indices[index + 0];
batch[i][1] = index[1]; batch[i][1] = indices[index + 1];
batch[i][2] = indices[0]; batch[i][2] = indices[0];
index += 1; index += 1;
} }
break; break;
}
default: default:
ASSERT(false); ASSERT(false);
return false; return false;
...@@ -898,76 +908,13 @@ namespace sw ...@@ -898,76 +908,13 @@ namespace sw
if(!indices) if(!indices)
{ {
unsigned int index = start; struct LinearIndex
switch(topology)
{ {
case VK_PRIMITIVE_TOPOLOGY_POINT_LIST: unsigned int operator[](unsigned int i) { return i; }
for(unsigned int i = 0; i < triangleCount; i++) };
{
batch[i][0] = index;
batch[i][1] = index;
batch[i][2] = index;
index += 1;
}
break;
case VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
index = 2 * start;
for(unsigned int i = 0; i < triangleCount; i++)
{
batch[i][0] = index + 0;
batch[i][1] = index + 1;
batch[i][2] = index + 1;
index += 2; if(!setBatchIndices(batch, topology, LinearIndex(), start, triangleCount))
} {
break;
case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
for(unsigned int i = 0; i < triangleCount; i++)
{
batch[i][0] = index + 0;
batch[i][1] = index + 1;
batch[i][2] = index + 1;
index += 1;
}
break;
case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
index = 3 * start;
for(unsigned int i = 0; i < triangleCount; i++)
{
batch[i][0] = index + 0;
batch[i][1] = index + 1;
batch[i][2] = index + 2;
index += 3;
}
break;
case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
for(unsigned int i = 0; i < triangleCount; i++)
{
batch[i][0] = index + 0;
batch[i][1] = index + (index & 1) + 1;
batch[i][2] = index + (~index & 1) + 1;
index += 1;
}
break;
case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
for(unsigned int i = 0; i < triangleCount; i++)
{
batch[i][0] = index + 1;
batch[i][1] = index + 2;
batch[i][2] = 0;
index += 1;
}
break;
default:
ASSERT(false);
return; return;
} }
} }
......
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