2016-06-28 4 views
4

렌더링 품질을 향상시키기 위해 OpenCL 1.1에서 다목적 분리형 다운 스케일러에 쓰고 있습니다.OpenCL/OpenGL 텍스처 interop/windows 문제

기본 이미지 (최종 이미지의 작은 부분 만 덮음)는 매우 큰 프레임 버퍼로 렌더링됩니다. 그런 다음 색상으로 연결된 텍스처가 다운 샘플링되어 OpenCL을 통해 다른 텍스처에 배치됩니다. 마지막으로 화면에 정렬 된 쿼드가 렌더링되어 결과를 표시합니다.

지금까지의 아이디어. 우리가 할 일 : downscaler 커널의

  • 2 인스턴스 (좌표 교환과 결과를 저장한다 (예로서 (Y, X))
  • inputTexture RTT를-프레임 버퍼의 (색 첨부)
  • tempTexture 크기 : inputHeight X outputWidth, CL_MEM_READ_WRITE로 작성된 kernel_instance_1(<otherParams>, inputTexture, tempTexture) 실행
  • outputTexture

가 생성 원하는 결과 하지만 만에 VE를 첫 번째 프레임 - 어떻게 든 애니메이션에서 일어나는 변화가 전혀 나타나지 않습니다. 오류가 없으므로 (아래 참조) 커널이 모든 프레임을 실행한다고 가정하지만 원본 텍스처 내용은 동일하게 유지됩니다 (그렇지 않은 경우 해당 텍스처의 라이브 출력도 있음).

Question: 프레임 버퍼의 내용이 변경 될 때마다 clCreateFromGLTexture2D()를 호출해야합니까?

편집이 난 그냥 깨달았다 다음 inputTexture 여전히에 부착 된 프레임 버퍼 오브젝트의 GL_COLOR_ATTACHMENT0 -이 문제가 될 수있다? endedit

kernel_instance_2(<otherParams>, tempTexture, outputTexture)을 실행하면 두 커널 호출간에 대기열이있는 경우에도 눈에 띄는 결과가 없습니다. 나는. outputTexture는 비어 있습니다. OpenCL을 변경 사항을 볼 수 있도록

Question:

, 나는 해제하고 모두 커널 호출 사이에 텍스처 오브젝트 tempTexture을 다시 취득해야합니까?

다만, 다음과 같은 출력이 생성 있었는지 OpenCL을-호출을 만들어 볼 수 있습니다 : 모든 통화에 오류가 발생했다면
clCreateKernel(separable_X) 
clRetainMemObject(separable_X::convolution) 
clCreateKernel(separable_Y) 
clRetainMemObject(separable_Y::convolution) 
clCreateFromGLTexture2D(separable_X::dst + separable_y::src, texID=24, usage=temporary (source and target)) 
clCreateFromGLTexture2D(separable_Y::dst, texID=18, usage=target) 
clCreateFromGLTexture2D(separable_X::src, texID=22, usage=source) 
clRetainMemObject(separable_X::dst) 
clRetainMemObject(separable_Y::src) 
clRetainMemObject(separable_Y::dst) 
clRetainMemObject(clearEmpty::dst) 
clEnqueueAcquireGLObjects(count=3) 
clEnqueueBarrier() 
clSetKernelArg(separable_X::convert) 
clSetKernelArg(separable_X::offset) 
clSetKernelArg(separable_X::convolution) 
clSetKernelArg(separable_X::dst) 
clSetKernelArg(separable_X::src) 
clEnqueueNDRangeKernel(separable_X, (1440, 1080, 0), waiting4 0 events) 
clSetKernelArg(separable_Y::convert) 
clSetKernelArg(separable_Y::offset) 
clEnqueueBarrier() 
clSetKernelArg(separable_Y::convolution) 
clSetKernelArg(separable_Y::dst) 
clSetKernelArg(separable_Y::src) 
clEnqueueNDRangeKernel(separable_Y, (540, 1440, 0), waiting4 0 events) 
clEnqueueBarrier() 
clEnqueueReleaseGLObjects(count=3) 

는, 그 출력의 내부에 있었던 것이다.

많은 시간이 걸리는 또 다른 상황은 clEnqueueReleaseGLObjects()이 누군가 "NVidia : 불법 읽기 또는 버퍼 쓰기"로 제출 한 오류 코드 -9999를 반환한다는 것입니다.

Question:

는 어떤 성분이 1.0F 초과 및 저장 형식 RGBA8 경우 write_imagef()의 색상 값을 고정하지 않는 것이 될 수 있을까? 그래서 그것은 실제로 하나를 써야한다는 것을 의미합니다 ... write_imagef(texture, (int2)coord, clamp(color, 0.f, 1.f)); ...

미리 감사드립니다. 이것은 거의 일주일이 지난 후 저의 머리를 두 드렸습니다.

편집 언급 할 가치가있을 수도 있습니다 좀 더 정보를 정기적으로 :

나는 두 개의 인스턴스를 구별 할 수있는 방법을?
는 모두 separable() α- 함수를 호출 동일한 바디를 프로그램 소스 안에 다른 이름 (separable_Xseparable_Y) 2 개 고유 함수 __kernel있다.

어떻게 GL과 CL을 동기화합니까?
는 - GL을 획득 돌보는 기능이 clEnqueueAcquireGLObjects()
호출하기 전에 발행 glFinish() 객체 - 나는 당신이 clEnqueueAcquireGLObjects 전에 glFinish를 사용하고 (향후 변경 가능성) cl_events

+0

어떻게 OpenGL과 OpenCL을 동기화하고 있습니까? –

+0

@RetoKoradi 제 편집을 참조하십시오. – St0fF

+0

Q : 프레임 버퍼의 내용이 변경 될 때마다 clCreateFromGLTexture2D()를 호출해야합니까? A : 아니요, OpenGL 텍스처에서 OpenCL 이미지를 만들 때 한 번만 수행 할 수 있습니다. 루프가 사용되기 전에 그렇게해야합니다. Q : 두 커널 호출 사이에서 텍스처 개체 tempTexture를 해제하고 다시 가져와야합니까? OpenCL에서 변경 내용을 볼 수 있습니까? A : 아니요. 일단 OpenCL 용으로 구입하면 필요한만큼 사용할 수 있습니다. – Dithermaster

답변

1

를 사용하여 clEnqueueReleaseGLObjects()가 완료 될 때까지 기다립니다 올바른지 만, clFinish AFTER clEnqueueReleaseGLObjects를 호출해야합니다. OpenCL 1.1 사양의 9.8.6.2 절을주의 깊게 읽으십시오. 다른 질문에 또한

: 나는 clCreateFromGLTexture2D를 호출해야합니까() 때마다 프레임 버퍼의 내용

을 변경?

아니요, OpenGL 텍스처로 OpenCL 이미지를 만들 때 한 번만 수행 할 수 있습니다. 루프가 사용되기 전에 그렇게해야합니다.

두 커널 호출 사이에서 텍스처 개체 tempTexture를 해제하고 다시 가져와야합니까? OpenCL에서 변경 내용을 볼 수 있습니까?

아니요. 일단 OpenCL에 대해 취득하면 필요한만큼 사용할 수 있습니다.

구성 요소가 1.0f를 초과하고 저장 형식이 RGBA8 인 경우 write_imagef()가 색상 값을 고정하지 않을 수 있습니까?

아니요, 완벽하게 작동합니다. 우리는 항상 그것을 사용합니다.

+0

대개 "내"다른 질문에 대한 설명을 주셔서 다시 한번 감사드립니다. 사실 그것들은 내가 알아내는 것을 이끌었고, 나의 상용구 인 CL-wrapper는 몇 가지 문제점을 가지고 있었다. 해당 상용구를 간단한 CL 코드로 바꾸면 모든 것이 예상대로 작동합니다. – St0fF

+0

다른 발견 사항 : 같은 텍스쳐를 사용하는 두 개의 커널을 서로 직접적으로 큐잉하는 경우, 다음에 시작하기 전에 하나의 커널을 끝내기 위해 제공되는 clSetKernelArg와 같은 몇 가지 명령 사이에 장벽을 넣어야합니다! (순서가 잘못된 exec를 사용할 수 없음!) – St0fF

+0

이것은 매우 흥미롭고 런타임의 버그처럼 들립니다. – Dithermaster