OpenCL에서 재귀 적 레이 트레이싱을 구현하는 프로그램을 개발 중입니다. 커널을 실행하려면 시스템과 Nvidia GeForce 그래픽 카드가 통합 된 인텔 옵션 장치가 필요합니다.OpenCL에서 clEnqueueMapBuffer와 관련된 문제
첫 번째 장치로 프로젝트를 실행할 때 문제가 없습니다. 그것은 올바르게 실행되고 알고리즘의 결과를 잘 보여줍니다.
그러나 Nvidia 장치로 실행하려고하면 동기 버퍼 맵이있는 콜백 함수가 충돌합니다. clEnqueueMapBuffer에
clEnqueueNDRangeKernel( queue, kernel, 1, NULL, &global_work_size, NULL, 0, NULL, NULL);
// 7. Look at the results via synchronous buffer map.
cl_float4 *ptr = (cl_float4 *) clEnqueueMapBuffer(queue, buffer, CL_TRUE, CL_MAP_READ, 0, kWidth * kHeight * sizeof(cl_float4), 0, NULL, NULL, NULL);
cl_float *viewTransformPtr = (cl_float *) clEnqueueMapBuffer(queue, viewTransform, CL_TRUE, CL_MAP_WRITE, 0, 16 * sizeof(cl_float), 0, NULL, NULL, NULL);
cl_float *worldTransformsPtr = (cl_float *) clEnqueueMapBuffer(queue, worldTransforms, CL_TRUE, CL_MAP_WRITE, 0, 16 * sizeof(cl_float), 0, NULL, NULL, NULL);
memcpy(viewTransformPtr, viewMatrix, sizeof(float)*16);
memcpy(worldTransformsPtr, sphereTransforms, sizeof(float)*16);
clEnqueueUnmapMemObject(queue, viewTransform, viewTransformPtr, 0, 0, 0);
clEnqueueUnmapMemObject(queue, worldTransforms, worldTransformsPtr, 0, 0, 0);
unsigned char* pixels = new unsigned char[kWidth*kHeight*4];
for(int i=0; i < kWidth * kHeight; i++){
pixels[i*4] = ptr[i].s[0]*255;
pixels[i*4+1] = ptr[i].s[1]*255;
pixels[i*4+2] = ptr[i].s[2]*255;
pixels[i*4+3] = 1;
}
glBindTexture(GL_TEXTURE_2D, 1);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 4, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
delete [] pixels;
두 마지막 호출이 오류 -5 CL_OUT_OF_RESOURCES 일치 반환하지만 버퍼의 크기가 올바른지 생각 :
가 충돌 코드의 일부는 다음과 같습니다.