diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2024-10-30 09:51:04 -0400 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2024-10-30 09:51:04 -0400 |
| commit | 6fa9ed77f6e124691e588bdb70f21d3aa10f30e8 (patch) | |
| tree | 568a438e11ad005fd6bd0a20f5d28d331844a697 | |
| parent | ef0ba48ead218d37d979b5ca156ea9d557754dd6 (diff) | |
| download | balls-6fa9ed77f6e124691e588bdb70f21d3aa10f30e8.zip | |
create collision buffers
| -rw-r--r-- | balls.c | 46 | ||||
| -rw-r--r-- | balls.h | 1 | ||||
| -rw-r--r-- | partition.c | 14 |
3 files changed, 57 insertions, 4 deletions
@@ -1,3 +1,7 @@ +/* TODO: frame counter */ + + + #define CL_TARGET_OPENCL_VERSION 110 #include <stdlib.h> @@ -37,6 +41,7 @@ void initCL(void); void setPositions(void); void setVelocities(void); void setRadii(void); +void setCollisions(void); void configureSharedData(void); void setKernelArgs(void); void display(void); @@ -52,12 +57,13 @@ char *readFile(const char *filename, size_t *size); void compileShader(GLint shader); float2 *noOverlapPositions(int n); -static cl_context context; +cl_context context; cl_program prog; -static cl_command_queue queue; -static cl_kernel moveKernel, collideWallsKernel, genVerticesKernel; +cl_command_queue queue; +cl_kernel moveKernel, collideWallsKernel, genVerticesKernel; GLuint vao, vbo; -cl_mem positions, velocities, radii, vertexBuf; +cl_mem positions, velocities, radii, *collisions, vertexBuf; +size_t collisionPartSize; /* Number of cells in the collision partition. */ int main(int argc, char *argv[]) { @@ -68,6 +74,7 @@ main(int argc, char *argv[]) { setPositions(); setVelocities(); setRadii(); + setCollisions(); configureSharedData(); setKernelArgs(); @@ -249,6 +256,32 @@ setRadii(void) { } void +setCollisions(void) { + Partition part; + int i, err; + + part = partitionCollisions(NBALLS); + collisionPartSize = part.size; + + /* Allocate array of buffers. */ + if ((collisions = malloc(part.size*sizeof(cl_mem))) == NULL) + sysfatal("Failed to allocate collision buffers.\n"); + for (i = 0; i < part.size; i++) { + /* Create device-side buffer. */ + collisions[i] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, part.cells[i].size*2*sizeof(size_t), part.cells[i].ballIndices, &err); + if (err < 0) + sysfatal("Failed to allocate collision buffer.\n"); + + /* Copy cell of partition to buffer. */ + err = clEnqueueWriteBuffer(queue, collisions[i], CL_TRUE, 0, part.cells[i].size*2*sizeof(size_t), part.cells[i].ballIndices, 0, NULL, NULL); + if (err < 0) + sysfatal("Failed to copy collision partition to device.\n"); + } + + freePartition(part); +} + +void configureSharedData(void) { int err; @@ -370,9 +403,14 @@ genVertices(void) { void freeCL(void) { + size_t i; + clReleaseMemObject(positions); clReleaseMemObject(velocities); clReleaseMemObject(radii); + for (i = 0; i < collisionPartSize; i++) + clReleaseMemObject(collisions[i]); + free(collisions); clReleaseMemObject(vertexBuf); clReleaseKernel(moveKernel); @@ -19,6 +19,7 @@ typedef struct { Partition partitionCollisions(size_t nBalls); void freePartition(Partition part); +void printPartition(Partition part); int isCollision(float2 p1, float r1, float2 p2, float r2); Rectangle insetRect(Rectangle r, float n); diff --git a/partition.c b/partition.c index 354e033..b7229d6 100644 --- a/partition.c +++ b/partition.c @@ -1,4 +1,5 @@ #include <stdlib.h> +#include <stdio.h> #include "sysfatal.h" #include "balls.h" @@ -52,6 +53,19 @@ freePartition(Partition part) { free(part.cells); } +void +printPartition(Partition part) { + size_t i, j; + + for (i = 0; i < part.size; i++) { + printf("{"); + for (j = 0; j < part.cells[i].size; j++) + printf("(%lu, %lu), ", part.cells[i].ballIndices[j][0], + part.cells[i].ballIndices[j][1]); + printf("}\n"); + } +} + /* Allocate an empty partition. Partition should be freed by the caller after use. */ static Partition newPartition(void) { |