Skip to content

Commit caa6ecc

Browse files
Hyunchang KimCommit Bot
authored andcommitted
Vulkan: Implement Transform Feedback support via extension
Implemented transform feedback extension path. Where VK_EXT_transform_feedback is supported, extension path will be taken over an emulation path. Extension path has advantages in terms of performance. BUG=angleproject:3206 Test: dEQP-GLES3.functional.transform_feedback.* angle_end2end_tests --gtest_filter=TransformFeedbackTest* Change-Id: Ia07c23afb289d9c67073469a97b714ec96f5265a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1882767 Commit-Queue: Mohan Maiya <m.maiya@samsung.com> Reviewed-by: Mohan Maiya <m.maiya@samsung.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com>
1 parent ccea6b5 commit caa6ecc

28 files changed

+935
-128
lines changed

include/platform/FeaturesVk.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,13 @@ struct FeaturesVk : FeatureSetBase
134134
"Emulate transform feedback as the VK_EXT_transform_feedback is not present.", &members,
135135
"http://anglebug.com/3205"};
136136

137+
// Where VK_EXT_transform_feedback is supported, it's preferred over an emulation path.
138+
// http://anglebug.com/3206
139+
Feature supportsTransformFeedbackExtension = {
140+
"supports_transform_feedback_extension", FeatureCategory::VulkanFeatures,
141+
"Transform feedback uses the VK_EXT_transform_feedback extension.", &members,
142+
"http://anglebug.com/3206"};
143+
137144
// VK_PRESENT_MODE_FIFO_KHR causes random timeouts on Linux Intel. http://anglebug.com/3153
138145
Feature disableFifoPresentMode = {
139146
"disable_fifo_present_mode", FeatureCategory::VulkanWorkarounds,

src/common/utilities.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,54 @@ size_t VariableExternalSize(GLenum type)
207207
return VariableComponentSize(VariableComponentType(type)) * VariableComponentCount(type);
208208
}
209209

210+
std::string GetGLSLTypeString(GLenum type)
211+
{
212+
switch (type)
213+
{
214+
case GL_BOOL:
215+
return "bool";
216+
case GL_INT:
217+
return "int";
218+
case GL_UNSIGNED_INT:
219+
return "uint";
220+
case GL_FLOAT:
221+
return "float";
222+
case GL_BOOL_VEC2:
223+
return "bvec2";
224+
case GL_BOOL_VEC3:
225+
return "bvec3";
226+
case GL_BOOL_VEC4:
227+
return "bvec4";
228+
case GL_INT_VEC2:
229+
return "ivec2";
230+
case GL_INT_VEC3:
231+
return "ivec3";
232+
case GL_INT_VEC4:
233+
return "ivec4";
234+
case GL_FLOAT_VEC2:
235+
return "vec2";
236+
case GL_FLOAT_VEC3:
237+
return "vec3";
238+
case GL_FLOAT_VEC4:
239+
return "vec4";
240+
case GL_UNSIGNED_INT_VEC2:
241+
return "uvec2";
242+
case GL_UNSIGNED_INT_VEC3:
243+
return "uvec3";
244+
case GL_UNSIGNED_INT_VEC4:
245+
return "uvec4";
246+
case GL_FLOAT_MAT2:
247+
return "mat2";
248+
case GL_FLOAT_MAT3:
249+
return "mat3";
250+
case GL_FLOAT_MAT4:
251+
return "mat4";
252+
default:
253+
UNREACHABLE();
254+
return nullptr;
255+
}
256+
}
257+
210258
GLenum VariableBoolVectorType(GLenum type)
211259
{
212260
switch (type)

src/common/utilities.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ int MatrixRegisterCount(GLenum type, bool isRowMajorMatrix);
5050
int MatrixComponentCount(GLenum type, bool isRowMajorMatrix);
5151
int VariableSortOrder(GLenum type);
5252
GLenum VariableBoolVectorType(GLenum type);
53+
std::string GetGLSLTypeString(GLenum type);
5354

5455
int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize);
5556

src/libANGLE/TransformFeedback.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ void TransformFeedback::onDestroy(const Context *context)
108108
{
109109
mState.mIndexedBuffers[i].set(context, nullptr, 0, 0);
110110
}
111+
112+
if (mImplementation)
113+
{
114+
mImplementation->onDestroy(context);
115+
}
111116
}
112117

113118
TransformFeedback::~TransformFeedback()

src/libANGLE/VaryingPacking.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,11 +284,16 @@ bool VaryingPacking::collectAndPackUserVaryings(gl::InfoLog &infoLog,
284284
{
285285
std::set<std::string> uniqueFullNames;
286286
mPackedVaryings.clear();
287+
mInputVaryings.clear();
287288

288289
for (const auto &ref : mergedVaryings)
289290
{
290291
const sh::ShaderVariable *input = ref.second.frontShader;
291292
const sh::ShaderVariable *output = ref.second.backShader;
293+
if (input)
294+
{
295+
mInputVaryings.emplace_back(*input);
296+
}
292297

293298
// Only pack statically used varyings that have a matched input or output, plus special
294299
// builtins. Note that we pack all statically used user-defined varyings even if they are

src/libANGLE/VaryingPacking.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,8 @@ class VaryingPacking final : angle::NonCopyable
182182
return mInactiveVaryingNames;
183183
}
184184

185+
const std::vector<sh::ShaderVariable> &getInputVaryings() const { return mInputVaryings; }
186+
185187
private:
186188
bool packVarying(const PackedVarying &packedVarying);
187189
bool isFree(unsigned int registerRow,
@@ -194,6 +196,7 @@ class VaryingPacking final : angle::NonCopyable
194196

195197
std::vector<Register> mRegisterMap;
196198
std::vector<PackedVaryingRegister> mRegisterList;
199+
std::vector<sh::ShaderVariable> mInputVaryings;
197200
std::vector<PackedVarying> mPackedVaryings;
198201
std::vector<std::string> mInactiveVaryingNames;
199202

src/libANGLE/renderer/TransformFeedbackImpl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class TransformFeedbackImpl : angle::NonCopyable
2020
public:
2121
TransformFeedbackImpl(const gl::TransformFeedbackState &state) : mState(state) {}
2222
virtual ~TransformFeedbackImpl() {}
23+
virtual void onDestroy(const gl::Context *context) {}
2324

2425
virtual angle::Result begin(const gl::Context *context, gl::PrimitiveMode primitiveMode) = 0;
2526
virtual angle::Result end(const gl::Context *context) = 0;

0 commit comments

Comments
 (0)