| 1934 | } |
| 1935 | |
| 1936 | int CGraphics_Threaded::CreateBufferObject(size_t UploadDataSize, void *pUploadData, int CreateFlags, bool IsMovedPointer) |
| 1937 | { |
| 1938 | int Index = -1; |
| 1939 | if(m_FirstFreeBufferObjectIndex == -1) |
| 1940 | { |
| 1941 | Index = m_vBufferObjectIndices.size(); |
| 1942 | m_vBufferObjectIndices.push_back(Index); |
| 1943 | } |
| 1944 | else |
| 1945 | { |
| 1946 | Index = m_FirstFreeBufferObjectIndex; |
| 1947 | m_FirstFreeBufferObjectIndex = m_vBufferObjectIndices[Index]; |
| 1948 | m_vBufferObjectIndices[Index] = Index; |
| 1949 | } |
| 1950 | |
| 1951 | dbg_assert((CreateFlags & EBufferObjectCreateFlags::BUFFER_OBJECT_CREATE_FLAGS_ONE_TIME_USE_BIT) == 0 || (UploadDataSize <= CCommandBuffer::MAX_VERTICES * maximum(sizeof(CCommandBuffer::SVertexTex3DStream), sizeof(CCommandBuffer::SVertexTex3D))), |
| 1952 | "If BUFFER_OBJECT_CREATE_FLAGS_ONE_TIME_USE_BIT is used, then the buffer size must not exceed max(sizeof(CCommandBuffer::SVertexTex3DStream), sizeof(CCommandBuffer::SVertexTex3D)) * CCommandBuffer::MAX_VERTICES"); |
| 1953 | |
| 1954 | CCommandBuffer::SCommand_CreateBufferObject Cmd; |
| 1955 | Cmd.m_BufferIndex = Index; |
| 1956 | Cmd.m_DataSize = UploadDataSize; |
| 1957 | Cmd.m_DeletePointer = IsMovedPointer; |
| 1958 | Cmd.m_Flags = CreateFlags; |
| 1959 | |
| 1960 | if(IsMovedPointer) |
| 1961 | { |
| 1962 | Cmd.m_pUploadData = pUploadData; |
| 1963 | AddCmd(Cmd); |
| 1964 | } |
| 1965 | else |
| 1966 | { |
| 1967 | if(UploadDataSize <= CMD_BUFFER_DATA_BUFFER_SIZE) |
| 1968 | { |
| 1969 | Cmd.m_pUploadData = AllocCommandBufferData(UploadDataSize); |
| 1970 | |
| 1971 | AddCmd(Cmd, [&] { |
| 1972 | Cmd.m_pUploadData = m_pCommandBuffer->AllocData(UploadDataSize); |
| 1973 | return Cmd.m_pUploadData != nullptr; |
| 1974 | }); |
| 1975 | mem_copy(Cmd.m_pUploadData, pUploadData, UploadDataSize); |
| 1976 | } |
| 1977 | else |
| 1978 | { |
| 1979 | Cmd.m_pUploadData = nullptr; |
| 1980 | AddCmd(Cmd); |
| 1981 | |
| 1982 | // update the buffer instead |
| 1983 | size_t UploadDataOffset = 0; |
| 1984 | while(UploadDataSize > 0) |
| 1985 | { |
| 1986 | size_t UpdateSize = (UploadDataSize > CMD_BUFFER_DATA_BUFFER_SIZE ? CMD_BUFFER_DATA_BUFFER_SIZE : UploadDataSize); |
| 1987 | |
| 1988 | UpdateBufferObjectInternal(Index, UpdateSize, (((char *)pUploadData) + UploadDataOffset), (void *)UploadDataOffset); |
| 1989 | |
| 1990 | UploadDataOffset += UpdateSize; |
| 1991 | UploadDataSize -= UpdateSize; |
| 1992 | } |
| 1993 | } |
no test coverage detected