Calling eglCreateStreamProducerSurfaceKHR with cuEGLStreamConsumerConnect gives EGL_BAD_ALLOC.
If I connect to an eglStreamConsumerGLTextureExternalKHR instead, it works fine.
This sure looks like a driver bug to me. Any clues what I’m doing wrong?
Here’s someone else with the same bug back in 2018
Below is the complete and minimal code to repro.
Ubuntu 18.04
CUDA SDK 10.0 installed via Jetpak
Driver Version: 430.34 CUDA Version: 10.1
// g++ errorDemo.cpp -I /usr/local/cuda/include -L/usr/local/cuda/lib64 -lcuda -lEGL && ./a.out
// Bad Alloc
#include "cuda.h"
#include "cudaEGL.h"
#include <stdio.h>
int main() {
cuInit(0);
CUdevice device;
cuDeviceGet(&device, 0);
CUcontext cudaContext;
cuDevicePrimaryCtxRetain(&cudaContext, device);
cuCtxPushCurrent(cudaContext);
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(display, nullptr, nullptr);
PFNEGLCREATESTREAMKHRPROC eglCreateStreamKHR = (PFNEGLCREATESTREAMKHRPROC)eglGetProcAddress("eglCreateStreamKHR");
EGLStreamKHR stream = eglCreateStreamKHR(display, nullptr);
CUeglStreamConnection consumerConnection;
CUresult cudaResult = cuEGLStreamConsumerConnect(&consumerConnection, stream);
const char *cudaErrorName;
cuGetErrorName(cudaResult, &cudaErrorName);
if (cudaResult != cudaError_enum::CUDA_SUCCESS) fprintf(stderr, "cuda error: %s\n", cudaErrorName);
EGLint configAttributes[] = {
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT,
EGL_SURFACE_TYPE, EGL_STREAM_BIT_KHR,
EGL_ALPHA_SIZE, 1,
EGL_NONE
};
EGLConfig config;
EGLint numConfigs;
eglChooseConfig(display, configAttributes, &config, 1, &numConfigs);
EGLint contextAttributes[] = {
EGL_CONTEXT_MAJOR_VERSION, 3,
EGL_CONTEXT_MINOR_VERSION, 2,
EGL_NONE
};
EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttributes);
EGLint surfaceAttributes[] = {
EGL_WIDTH, 256,
EGL_HEIGHT, 256,
EGL_NONE
};
EGLint beforeErrorCode = eglGetError();
if (beforeErrorCode != EGL_SUCCESS) fprintf(stderr, "Previous Error\n");
PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC eglCreateStreamProducerSurfaceKHR = (PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC)eglGetProcAddress("eglCreateStreamProducerSurfaceKHR");
EGLSurface surface = eglCreateStreamProducerSurfaceKHR(display, config, stream, surfaceAttributes);
EGLint afterErrorCode = eglGetError();
if (afterErrorCode == EGL_BAD_ALLOC) fprintf(stderr, "Bad Alloc\n");
else fprintf(stderr, "No Error\n");
return 0;
}