| 1916 | } |
| 1917 | |
| 1918 | RTC_API void* rtcSetNewGeometryBuffer(RTCGeometry hgeometry, RTCBufferType type, unsigned int slot, RTCFormat format, size_t byteStride, size_t itemCount) |
| 1919 | { |
| 1920 | Geometry* geometry = (Geometry*) hgeometry; |
| 1921 | RTC_CATCH_BEGIN; |
| 1922 | RTC_TRACE(rtcSetNewGeometryBuffer); |
| 1923 | RTC_VERIFY_HANDLE(hgeometry); |
| 1924 | |
| 1925 | if (itemCount > 0xFFFFFFFFu) |
| 1926 | throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"buffer too large"); |
| 1927 | |
| 1928 | if (byteStride > 0xFFFFFFFFu) |
| 1929 | throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"stride too large"); |
| 1930 | |
| 1931 | /* vertex buffers need to get overallocated slightly as elements are accessed using SSE loads */ |
| 1932 | size_t bytes = itemCount*byteStride; |
| 1933 | if (type == RTC_BUFFER_TYPE_VERTEX || type == RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE) |
| 1934 | bytes += (16 - (byteStride%16))%16; |
| 1935 | |
| 1936 | Ref<Buffer> buffer = new Buffer(geometry->device, bytes, nullptr); |
| 1937 | geometry->setBuffer(type, slot, format, buffer, 0, byteStride, (unsigned int)itemCount); |
| 1938 | return buffer->data(); |
| 1939 | RTC_CATCH_END2(geometry); |
| 1940 | return nullptr; |
| 1941 | } |
| 1942 | |
| 1943 | RTC_API void rtcSetNewGeometryBufferHostDevice(RTCGeometry hgeometry, RTCBufferType bufferType, unsigned int slot, RTCFormat format, size_t byteStride, size_t itemCount, void** ptr, void** dptr) |
| 1944 | { |
no test coverage detected