@@ -149,5 +149,136 @@ core::smart_refctd_ptr<ICPUPolygonGeometry> CPolygonGeometryManipulator::createS
149149 return CSmoothNormalGenerator::calculateNormals (inPolygon, enableWelding, epsilon, vxcmp);
150150}
151151
152+ #if 0
153+ core::smart_refctd_ptr<ICPUMeshBuffer> CMeshManipulator::createMeshBufferFetchOptimized(const ICPUMeshBuffer* _inbuffer)
154+ {
155+ if (!_inbuffer)
156+ return nullptr;
157+
158+ const auto* pipeline = _inbuffer->getPipeline();
159+ const void* ind = _inbuffer->getIndices();
160+ if (!pipeline || !ind)
161+ return nullptr;
162+
163+ auto outbuffer = core::move_and_static_cast<ICPUMeshBuffer>(_inbuffer->clone(1u));
164+ outbuffer->setAttachedDescriptorSet(core::smart_refctd_ptr<ICPUDescriptorSet>(const_cast<ICPUDescriptorSet*>(_inbuffer->getAttachedDescriptorSet())));
165+ outbuffer->setSkin(
166+ SBufferBinding<ICPUBuffer>(reinterpret_cast<const SBufferBinding<ICPUBuffer>&>(_inbuffer->getInverseBindPoseBufferBinding())),
167+ SBufferBinding<ICPUBuffer>(reinterpret_cast<const SBufferBinding<ICPUBuffer>&>(_inbuffer->getJointAABBBufferBinding())),
168+ _inbuffer->getJointCount(),_inbuffer->getMaxJointsPerVertex()
169+ );
170+
171+ constexpr uint32_t MAX_ATTRIBS = asset::ICPUMeshBuffer::MAX_VERTEX_ATTRIB_COUNT;
172+
173+ // Find vertex count
174+ size_t vertexCount = IMeshManipulator::upperBoundVertexID(_inbuffer);
175+
176+ core::unordered_set<const ICPUBuffer*> buffers;
177+ for (size_t i = 0; i < MAX_ATTRIBS; ++i)
178+ if (auto* buf = _inbuffer->getAttribBoundBuffer(i).buffer.get())
179+ buffers.insert(buf);
180+
181+ size_t offsets[MAX_ATTRIBS];
182+ memset(offsets, -1, sizeof(offsets));
183+ E_FORMAT types[MAX_ATTRIBS];
184+ if (buffers.size() != 1)
185+ {
186+ size_t lastOffset = 0u;
187+ size_t lastSize = 0u;
188+ for (size_t i = 0; i < MAX_ATTRIBS; ++i)
189+ {
190+ if (_inbuffer->isAttributeEnabled(i))
191+ {
192+ types[i] = _inbuffer->getAttribFormat(i);
193+
194+ const uint32_t typeSz = getTexelOrBlockBytesize(types[i]);
195+ const size_t alignment = (typeSz/getFormatChannelCount(types[i]) == 8u) ? 8ull : 4ull; // if format 64bit per channel, then align to 8
196+
197+ offsets[i] = lastOffset + lastSize;
198+ const size_t mod = offsets[i] % alignment;
199+ offsets[i] += mod;
200+
201+ lastOffset = offsets[i];
202+ lastSize = typeSz;
203+ }
204+ }
205+ const size_t vertexSize = lastOffset + lastSize;
206+
207+ constexpr uint32_t NEW_VTX_BUF_BINDING = 0u;
208+ auto& vtxParams = outbuffer->getPipeline()->getCachedCreationParams().vertexInput;
209+ vtxParams = SVertexInputParams();
210+ vtxParams.enabledAttribFlags = _inbuffer->getPipeline()->getCachedCreationParams().vertexInput.enabledAttribFlags;
211+ vtxParams.enabledBindingFlags = 1u << NEW_VTX_BUF_BINDING;
212+ vtxParams.bindings[NEW_VTX_BUF_BINDING].stride = vertexSize;
213+ vtxParams.bindings[NEW_VTX_BUF_BINDING].inputRate = SVertexInputBindingParams::EVIR_PER_VERTEX;
214+
215+ auto newVertBuffer = ICPUBuffer::create({ vertexCount*vertexSize });
216+ outbuffer->setVertexBufferBinding({ 0u, core::smart_refctd_ptr(newVertBuffer) }, NEW_VTX_BUF_BINDING);
217+ for (size_t i = 0; i < MAX_ATTRIBS; ++i)
218+ {
219+ if (offsets[i] < 0xffffffff)
220+ {
221+ vtxParams.attributes[i].binding = NEW_VTX_BUF_BINDING;
222+ vtxParams.attributes[i].format = types[i];
223+ vtxParams.attributes[i].relativeOffset = offsets[i];
224+ }
225+ }
226+ }
227+ outbuffer->setBaseVertex(0);
228+
229+ core::vector<uint32_t> activeAttribs;
230+ for (size_t i = 0; i < MAX_ATTRIBS; ++i)
231+ if (outbuffer->isAttributeEnabled(i))
232+ activeAttribs.push_back(i);
233+
234+ uint32_t* remapBuffer = _NBL_NEW_ARRAY(uint32_t,vertexCount);
235+ memset(remapBuffer, 0xffffffffu, vertexCount*sizeof(uint32_t));
236+
237+ const E_INDEX_TYPE idxType = outbuffer->getIndexType();
238+ void* indices = outbuffer->getIndices();
239+ size_t nextVert = 0u;
240+
241+ for (size_t i = 0; i < outbuffer->getIndexCount(); ++i)
242+ {
243+ const uint32_t index = idxType == EIT_32BIT ? ((uint32_t*)indices)[i] : ((uint16_t*)indices)[i];
244+
245+ uint32_t& remap = remapBuffer[index];
246+
247+ if (remap == 0xffffffffu)
248+ {
249+ for (size_t j = 0; j < activeAttribs.size(); ++j)
250+ {
251+ E_FORMAT type = types[activeAttribs[j]];
252+
253+ if (!isNormalizedFormat(type) && (isIntegerFormat(type) || isScaledFormat(type)))
254+ {
255+ uint32_t dst[4];
256+ _inbuffer->getAttribute(dst, activeAttribs[j], index);
257+ outbuffer->setAttribute(dst, activeAttribs[j], nextVert);
258+ }
259+ else
260+ {
261+ core::vectorSIMDf dst;
262+ _inbuffer->getAttribute(dst, activeAttribs[j], index);
263+ outbuffer->setAttribute(dst, activeAttribs[j], nextVert);
264+ }
265+ }
266+
267+ remap = nextVert++;
268+ }
269+
270+ if (idxType == EIT_32BIT)
271+ ((uint32_t*)indices)[i] = remap;
272+ else
273+ ((uint16_t*)indices)[i] = remap;
274+ }
275+
276+ _NBL_DELETE_ARRAY(remapBuffer,vertexCount);
277+
278+ _NBL_DEBUG_BREAK_IF(nextVert > vertexCount)
279+
280+ return outbuffer;
281+ }
282+ #endif
152283} // end namespace nbl::asset
153284
0 commit comments