| 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 | { |
| 1945 | Geometry* geometry = (Geometry*) hgeometry; |
| 1946 | RTC_CATCH_BEGIN; |
| 1947 | RTC_TRACE(rtcSetNewGeometryBufferHostDevice); |
| 1948 | RTC_VERIFY_HANDLE(hgeometry); |
| 1949 | |
| 1950 | #if defined(EMBREE_SYCL_SUPPORT) |
| 1951 | if (geometry->device->is_gpu()) |
| 1952 | { |
| 1953 | if (itemCount > 0xFFFFFFFFu) |
| 1954 | throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"buffer too large"); |
| 1955 | |
| 1956 | if (byteStride > 0xFFFFFFFFu) |
| 1957 | throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"stride too large"); |
| 1958 | |
| 1959 | /* vertex buffers need to get overallocated slightly as elements are accessed using SSE loads */ |
| 1960 | size_t bytes = itemCount*byteStride; |
| 1961 | if (bufferType == RTC_BUFFER_TYPE_VERTEX || bufferType == RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE) |
| 1962 | bytes += (16 - (byteStride%16))%16; |
| 1963 | |
| 1964 | Ref<Buffer> buffer = new Buffer(geometry->device, bytes, nullptr, nullptr); |
| 1965 | geometry->setBuffer(bufferType, slot, format, buffer, 0, byteStride, (unsigned int)itemCount); |
| 1966 | |
| 1967 | if(ptr) |
| 1968 | *ptr = buffer->getHostPtr(); |
| 1969 | if (dptr) |
| 1970 | *dptr = buffer->getDevicePtr(); |
| 1971 | } |
| 1972 | else |
| 1973 | #endif |
| 1974 | { |
| 1975 | void* tmp = rtcSetNewGeometryBuffer(hgeometry, bufferType, slot, format, byteStride, itemCount); |
| 1976 | if(ptr) |
| 1977 | *ptr = tmp; |
| 1978 | if (dptr) { |
| 1979 | *dptr = tmp; |
| 1980 | } |
| 1981 | } |
| 1982 | |
| 1983 | RTC_CATCH_END2(geometry); |
| 1984 | } |
| 1985 | |
| 1986 | RTC_API void* rtcGetGeometryBufferData(RTCGeometry hgeometry, RTCBufferType type, unsigned int slot) |
| 1987 | { |
no test coverage detected