src/video/photon/SDL_ph_gl.c
branchSDL-1.3
changeset 1668 4da1ee79c9af
parent 1662 782fd950bd46
equal deleted inserted replaced
1667:1fddae038bc8 1668:4da1ee79c9af
    32 GLPH_DECLARE_FUNCS;
    32 GLPH_DECLARE_FUNCS;
    33 #endif /* 6.3.0 */
    33 #endif /* 6.3.0 */
    34 
    34 
    35 #if (_NTO_VERSION < 630)
    35 #if (_NTO_VERSION < 630)
    36 void
    36 void
    37 ph_GL_SwapBuffers (_THIS)
    37 ph_GL_SwapBuffers(_THIS)
    38 {
    38 {
    39     PgSetRegion (PtWidgetRid (window));
    39     PgSetRegion(PtWidgetRid(window));
    40     PdOpenGLContextSwapBuffers (oglctx);
    40     PdOpenGLContextSwapBuffers(oglctx);
    41 }
    41 }
    42 #else
    42 #else
    43 void
    43 void
    44 ph_GL_SwapBuffers (_THIS)
    44 ph_GL_SwapBuffers(_THIS)
    45 {
    45 {
    46     qnxgl_swap_buffers (oglbuffers);
    46     qnxgl_swap_buffers(oglbuffers);
    47 }
    47 }
    48 #endif /* 6.3.0 */
    48 #endif /* 6.3.0 */
    49 
    49 
    50 int
    50 int
    51 ph_GL_GetAttribute (_THIS, SDL_GLattr attrib, int *value)
    51 ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int *value)
    52 {
    52 {
    53     switch (attrib) {
    53     switch (attrib) {
    54     case SDL_GL_DOUBLEBUFFER:
    54     case SDL_GL_DOUBLEBUFFER:
    55         *value = this->gl_config.double_buffer;
    55         *value = this->gl_config.double_buffer;
    56         break;
    56         break;
    96     return 0;
    96     return 0;
    97 }
    97 }
    98 
    98 
    99 #if (_NTO_VERSION < 630)
    99 #if (_NTO_VERSION < 630)
   100 int
   100 int
   101 ph_GL_LoadLibrary (_THIS, const char *path)
   101 ph_GL_LoadLibrary(_THIS, const char *path)
   102 {
   102 {
   103     /* if code compiled with SDL_VIDEO_OPENGL, that mean that library already linked */
   103     /* if code compiled with SDL_VIDEO_OPENGL, that mean that library already linked */
   104     this->gl_config.driver_loaded = 1;
   104     this->gl_config.driver_loaded = 1;
   105 
   105 
   106     return 0;
   106     return 0;
   107 }
   107 }
   108 #else
   108 #else
   109 int
   109 int
   110 ph_GL_LoadLibrary (_THIS, const char *path)
   110 ph_GL_LoadLibrary(_THIS, const char *path)
   111 {
   111 {
   112     void *handle;
   112     void *handle;
   113     int dlopen_flags = RTLD_WORLD | RTLD_GROUP;
   113     int dlopen_flags = RTLD_WORLD | RTLD_GROUP;
   114 
   114 
   115     if (this->gl_config.dll_handle != NULL) {
   115     if (this->gl_config.dll_handle != NULL) {
   116         return 0;
   116         return 0;
   117     }
   117     }
   118 
   118 
   119     handle = dlopen (path, dlopen_flags);
   119     handle = dlopen(path, dlopen_flags);
   120 
   120 
   121     if (handle == NULL) {
   121     if (handle == NULL) {
   122         SDL_SetError ("ph_GL_LoadLibrary(): Could not load OpenGL library");
   122         SDL_SetError("ph_GL_LoadLibrary(): Could not load OpenGL library");
   123         return -1;
   123         return -1;
   124     }
   124     }
   125 
   125 
   126     this->gl_config.dll_handle = handle;
   126     this->gl_config.dll_handle = handle;
   127     this->gl_config.driver_loaded = 1;
   127     this->gl_config.driver_loaded = 1;
   128 
   128 
   129     SDL_strlcpy (this->gl_config.driver_path, path,
   129     SDL_strlcpy(this->gl_config.driver_path, path,
   130                  SDL_arraysize (this->gl_config.driver_path));
   130                 SDL_arraysize(this->gl_config.driver_path));
   131 
   131 
   132     return 0;
   132     return 0;
   133 }
   133 }
   134 #endif /* 6.3.0 */
   134 #endif /* 6.3.0 */
   135 
   135 
   136 #if (_NTO_VERSION < 630)
   136 #if (_NTO_VERSION < 630)
   137 void *
   137 void *
   138 ph_GL_GetProcAddress (_THIS, const char *proc)
   138 ph_GL_GetProcAddress(_THIS, const char *proc)
   139 {
   139 {
   140     return NULL;
   140     return NULL;
   141 }
   141 }
   142 #else
   142 #else
   143 void *
   143 void *
   144 ph_GL_GetProcAddress (_THIS, const char *proc)
   144 ph_GL_GetProcAddress(_THIS, const char *proc)
   145 {
   145 {
   146     void *function;
   146     void *function;
   147 
   147 
   148     if (this->gl_config.dll_handle == NULL) {
   148     if (this->gl_config.dll_handle == NULL) {
   149         ph_GL_LoadLibrary (this, DEFAULT_OPENGL);
   149         ph_GL_LoadLibrary(this, DEFAULT_OPENGL);
   150         if (this->gl_config.dll_handle == NULL) {
   150         if (this->gl_config.dll_handle == NULL) {
   151             return NULL;
   151             return NULL;
   152         }
   152         }
   153     }
   153     }
   154 
   154 
   155     function = qnxgl_get_func (proc, oglctx, 0);
   155     function = qnxgl_get_func(proc, oglctx, 0);
   156     if (function == NULL) {
   156     if (function == NULL) {
   157         function = dlsym (this->gl_config.dll_handle, proc);
   157         function = dlsym(this->gl_config.dll_handle, proc);
   158     }
   158     }
   159 
   159 
   160     return function;
   160     return function;
   161 }
   161 }
   162 #endif /* 6.3.0 */
   162 #endif /* 6.3.0 */
   163 
   163 
   164 #if (_NTO_VERSION < 630)
   164 #if (_NTO_VERSION < 630)
   165 int
   165 int
   166 ph_GL_MakeCurrent (_THIS)
   166 ph_GL_MakeCurrent(_THIS)
   167 {
   167 {
   168     PgSetRegion (PtWidgetRid (window));
   168     PgSetRegion(PtWidgetRid(window));
   169 
   169 
   170     if (oglctx != NULL) {
   170     if (oglctx != NULL) {
   171         PhDCSetCurrent (oglctx);
   171         PhDCSetCurrent(oglctx);
   172     }
   172     }
   173 
   173 
   174     return 0;
   174     return 0;
   175 }
   175 }
   176 #else
   176 #else
   177 int
   177 int
   178 ph_GL_MakeCurrent (_THIS)
   178 ph_GL_MakeCurrent(_THIS)
   179 {
   179 {
   180     PgSetRegion (PtWidgetRid (window));
   180     PgSetRegion(PtWidgetRid(window));
   181 
   181 
   182     if (oglctx != NULL) {
   182     if (oglctx != NULL) {
   183         if (qnxgl_set_current (oglctx) == -1) {
   183         if (qnxgl_set_current(oglctx) == -1) {
   184             return -1;
   184             return -1;
   185         }
   185         }
   186     }
   186     }
   187 
   187 
   188     return 0;
   188     return 0;
   192 #if (_NTO_VERSION < 630)
   192 #if (_NTO_VERSION < 630)
   193 
   193 
   194 /* This code is actual for the Photon3D Runtime which was available prior to 6.3 only */
   194 /* This code is actual for the Photon3D Runtime which was available prior to 6.3 only */
   195 
   195 
   196 int
   196 int
   197 ph_SetupOpenGLContext (_THIS, int width, int height, int bpp, Uint32 flags)
   197 ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags)
   198 {
   198 {
   199     PhDim_t dim;
   199     PhDim_t dim;
   200     uint64_t OGLAttrib[PH_OGL_MAX_ATTRIBS];
   200     uint64_t OGLAttrib[PH_OGL_MAX_ATTRIBS];
   201     int exposepost = 0;
   201     int exposepost = 0;
   202     int OGLargc;
   202     int OGLargc;
   203 
   203 
   204     dim.w = width;
   204     dim.w = width;
   205     dim.h = height;
   205     dim.h = height;
   206 
   206 
   207     if ((oglctx != NULL) && (oglflags == flags) && (oglbpp == bpp)) {
   207     if ((oglctx != NULL) && (oglflags == flags) && (oglbpp == bpp)) {
   208         PdOpenGLContextResize (oglctx, &dim);
   208         PdOpenGLContextResize(oglctx, &dim);
   209         PhDCSetCurrent (oglctx);
   209         PhDCSetCurrent(oglctx);
   210         return 0;
   210         return 0;
   211     } else {
   211     } else {
   212         if (oglctx != NULL) {
   212         if (oglctx != NULL) {
   213             PhDCSetCurrent (NULL);
   213             PhDCSetCurrent(NULL);
   214             PhDCRelease (oglctx);
   214             PhDCRelease(oglctx);
   215             oglctx = NULL;
   215             oglctx = NULL;
   216             exposepost = 1;
   216             exposepost = 1;
   217         }
   217         }
   218     }
   218     }
   219 
   219 
   234         OGLAttrib[OGLargc++] = PHOGL_ATTRIB_FULLSCREEN_CENTER;
   234         OGLAttrib[OGLargc++] = PHOGL_ATTRIB_FULLSCREEN_CENTER;
   235     }
   235     }
   236     OGLAttrib[OGLargc++] = PHOGL_ATTRIB_NONE;
   236     OGLAttrib[OGLargc++] = PHOGL_ATTRIB_NONE;
   237 
   237 
   238     if (this->gl_config.double_buffer) {
   238     if (this->gl_config.double_buffer) {
   239         oglctx = PdCreateOpenGLContext (2, &dim, 0, OGLAttrib);
   239         oglctx = PdCreateOpenGLContext(2, &dim, 0, OGLAttrib);
   240     } else {
   240     } else {
   241         oglctx = PdCreateOpenGLContext (1, &dim, 0, OGLAttrib);
   241         oglctx = PdCreateOpenGLContext(1, &dim, 0, OGLAttrib);
   242     }
   242     }
   243 
   243 
   244     if (oglctx == NULL) {
   244     if (oglctx == NULL) {
   245         SDL_SetError
   245         SDL_SetError
   246             ("ph_SetupOpenGLContext(): cannot create OpenGL context !\n");
   246             ("ph_SetupOpenGLContext(): cannot create OpenGL context !\n");
   247         return -1;
   247         return -1;
   248     }
   248     }
   249 
   249 
   250     PhDCSetCurrent (oglctx);
   250     PhDCSetCurrent(oglctx);
   251 
   251 
   252     PtFlush ();
   252     PtFlush();
   253 
   253 
   254     oglflags = flags;
   254     oglflags = flags;
   255     oglbpp = bpp;
   255     oglbpp = bpp;
   256 
   256 
   257     if (exposepost != 0) {
   257     if (exposepost != 0) {
   258         /* OpenGL context has been recreated, so report about this fact */
   258         /* OpenGL context has been recreated, so report about this fact */
   259         SDL_PrivateExpose ();
   259         SDL_PrivateExpose();
   260     }
   260     }
   261 
   261 
   262     return 0;
   262     return 0;
   263 }
   263 }
   264 
   264 
   265 #else /* _NTO_VERSION */
   265 #else /* _NTO_VERSION */
   266 
   266 
   267 /* This code is actual for the built-in PhGL support, which became available since 6.3 */
   267 /* This code is actual for the built-in PhGL support, which became available since 6.3 */
   268 
   268 
   269 int
   269 int
   270 ph_SetupOpenGLContext (_THIS, int width, int height, int bpp, Uint32 flags)
   270 ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags)
   271 {
   271 {
   272     qnxgl_buf_attrib_t qnxgl_attribs[PH_OGL_MAX_ATTRIBS];
   272     qnxgl_buf_attrib_t qnxgl_attribs[PH_OGL_MAX_ATTRIBS];
   273     qnxgl_buf_attrib_t *qnxgl_attribs_slide;
   273     qnxgl_buf_attrib_t *qnxgl_attribs_slide;
   274     int num_interfaces = 0;
   274     int num_interfaces = 0;
   275     int num_buffers = 0;
   275     int num_buffers = 0;
   276 
   276 
   277     /* Initialize the OpenGL subsystem */
   277     /* Initialize the OpenGL subsystem */
   278 
   278 
   279     num_interfaces = qnxgl_init (NULL, NULL, 0);
   279     num_interfaces = qnxgl_init(NULL, NULL, 0);
   280 
   280 
   281     if (num_interfaces < 0) {
   281     if (num_interfaces < 0) {
   282         SDL_SetError
   282         SDL_SetError
   283             ("ph_SetupOpenGLContext(): cannot initialize OpenGL subsystem !\n");
   283             ("ph_SetupOpenGLContext(): cannot initialize OpenGL subsystem !\n");
   284         return -1;
   284         return -1;
   295     /* Initialize the OpenGL context attributes */
   295     /* Initialize the OpenGL context attributes */
   296     qnxgl_attribs_slide = qnxgl_attribs;
   296     qnxgl_attribs_slide = qnxgl_attribs;
   297 
   297 
   298     /* Depth size */
   298     /* Depth size */
   299     if (this->gl_config.depth_size) {
   299     if (this->gl_config.depth_size) {
   300         fprintf (stderr, "setted depth size %d\n",
   300         fprintf(stderr, "setted depth size %d\n", this->gl_config.depth_size);
   301                  this->gl_config.depth_size);
       
   302         qnxgl_attribs_slide =
   301         qnxgl_attribs_slide =
   303             qnxgl_attrib_set_depth (qnxgl_attribs_slide,
   302             qnxgl_attrib_set_depth(qnxgl_attribs_slide,
   304                                     this->gl_config.depth_size);
   303                                    this->gl_config.depth_size);
   305     }
   304     }
   306 
   305 
   307     /* Stencil size */
   306     /* Stencil size */
   308     if (this->gl_config.stencil_size) {
   307     if (this->gl_config.stencil_size) {
   309         qnxgl_attribs_slide =
   308         qnxgl_attribs_slide =
   310             qnxgl_attrib_set_stencil (qnxgl_attribs_slide,
   309             qnxgl_attrib_set_stencil(qnxgl_attribs_slide,
   311                                       this->gl_config.stencil_size);
   310                                      this->gl_config.stencil_size);
   312     }
   311     }
   313 
   312 
   314     /* The sum of the accum bits of each channel */
   313     /* The sum of the accum bits of each channel */
   315     if ((this->gl_config.accum_red_size != 0)
   314     if ((this->gl_config.accum_red_size != 0)
   316         && (this->gl_config.accum_blue_size != 0)
   315         && (this->gl_config.accum_blue_size != 0)
   317         && (this->gl_config.accum_green_size != 0)) {
   316         && (this->gl_config.accum_green_size != 0)) {
   318         qnxgl_attribs_slide = qnxgl_attrib_set_accum (qnxgl_attribs_slide,
   317         qnxgl_attribs_slide = qnxgl_attrib_set_accum(qnxgl_attribs_slide,
   319                                                       this->gl_config.
   318                                                      this->gl_config.
   320                                                       accum_red_size +
   319                                                      accum_red_size +
   321                                                       this->gl_config.
   320                                                      this->gl_config.
   322                                                       accum_blue_size +
   321                                                      accum_blue_size +
   323                                                       this->gl_config.
   322                                                      this->gl_config.
   324                                                       accum_green_size +
   323                                                      accum_green_size +
   325                                                       this->gl_config.
   324                                                      this->gl_config.
   326                                                       accum_alpha_size);
   325                                                      accum_alpha_size);
   327     }
   326     }
   328 
   327 
   329     /* Stereo mode */
   328     /* Stereo mode */
   330     if (this->gl_config.stereo) {
   329     if (this->gl_config.stereo) {
   331         qnxgl_attribs_slide = qnxgl_attrib_set_stereo (qnxgl_attribs_slide);
   330         qnxgl_attribs_slide = qnxgl_attrib_set_stereo(qnxgl_attribs_slide);
   332     }
   331     }
   333 
   332 
   334     /* Fullscreen mode */
   333     /* Fullscreen mode */
   335     if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) {
   334     if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) {
   336         qnxgl_attribs_slide =
   335         qnxgl_attribs_slide =
   337             qnxgl_attrib_set_hint_fullscreen (qnxgl_attribs_slide);
   336             qnxgl_attrib_set_hint_fullscreen(qnxgl_attribs_slide);
   338     }
   337     }
   339 
   338 
   340     /* Double buffering mode */
   339     /* Double buffering mode */
   341     if (this->gl_config.double_buffer) {
   340     if (this->gl_config.double_buffer) {
   342         num_buffers = 2;
   341         num_buffers = 2;
   343     } else {
   342     } else {
   344         num_buffers = 1;
   343         num_buffers = 1;
   345     }
   344     }
   346 
   345 
   347     /* Loading the function pointers so we can use the extensions */
   346     /* Loading the function pointers so we can use the extensions */
   348     GLPH_LOAD_FUNCS_GC (oglctx);
   347     GLPH_LOAD_FUNCS_GC(oglctx);
   349 
   348 
   350     /* Set the buffers region to be that of our window's region */
   349     /* Set the buffers region to be that of our window's region */
   351     qnxgl_attribs_slide =
   350     qnxgl_attribs_slide =
   352         glph_attrib_set_region (qnxgl_attribs_slide, PtWidgetRid (window));
   351         glph_attrib_set_region(qnxgl_attribs_slide, PtWidgetRid(window));
   353 
   352 
   354     /* End of the attributes array */
   353     /* End of the attributes array */
   355     qnxgl_attribs_slide = qnxgl_attrib_set_end (qnxgl_attribs_slide);
   354     qnxgl_attribs_slide = qnxgl_attrib_set_end(qnxgl_attribs_slide);
   356 
   355 
   357     /* Create the buffers with the specified color model */
   356     /* Create the buffers with the specified color model */
   358     fprintf (stderr, "ARGB: %d, %d, %d, %d\n", this->gl_config.alpha_size,
   357     fprintf(stderr, "ARGB: %d, %d, %d, %d\n", this->gl_config.alpha_size,
   359              this->gl_config.red_size, this->gl_config.green_size,
   358             this->gl_config.red_size, this->gl_config.green_size,
   360              this->gl_config.blue_size);
   359             this->gl_config.blue_size);
   361     oglbuffers = qnxgl_buffers_create (QNXGL_FORMAT_BEST_RGB,
   360     oglbuffers = qnxgl_buffers_create(QNXGL_FORMAT_BEST_RGB,
   362 /*                 __QNXGL_BUILD_FORMAT(0, __QNXGL_COLOR_MODEL_RGB, this->gl_config.alpha_size,
   361 /*                 __QNXGL_BUILD_FORMAT(0, __QNXGL_COLOR_MODEL_RGB, this->gl_config.alpha_size,
   363                      this->gl_config.red_size, this->gl_config.green_size, this->gl_config.blue_size), */
   362                      this->gl_config.red_size, this->gl_config.green_size, this->gl_config.blue_size), */
   364                                        num_buffers, width, height,
   363                                       num_buffers, width, height,
   365                                        qnxgl_attribs, -1);
   364                                       qnxgl_attribs, -1);
   366 
   365 
   367 
   366 
   368     if (oglbuffers == NULL) {
   367     if (oglbuffers == NULL) {
   369         SDL_SetError
   368         SDL_SetError
   370             ("ph_SetupOpenGLContext(): failed to create OpenGL buffers !\n");
   369             ("ph_SetupOpenGLContext(): failed to create OpenGL buffers !\n");
   371         qnxgl_finish ();
   370         qnxgl_finish();
   372         return -1;
   371         return -1;
   373     }
   372     }
   374 
   373 
   375     /* Create a QNXGL context for the previously created buffer */
   374     /* Create a QNXGL context for the previously created buffer */
   376     oglctx = qnxgl_context_create (oglbuffers, NULL);
   375     oglctx = qnxgl_context_create(oglbuffers, NULL);
   377 
   376 
   378     if (oglctx == NULL) {
   377     if (oglctx == NULL) {
   379         SDL_SetError
   378         SDL_SetError
   380             ("ph_SetupOpenGLContext(): failed to create OpenGL context !\n");
   379             ("ph_SetupOpenGLContext(): failed to create OpenGL context !\n");
   381         qnxgl_buffers_destroy (oglbuffers);
   380         qnxgl_buffers_destroy(oglbuffers);
   382         qnxgl_finish ();
   381         qnxgl_finish();
   383         return -1;
   382         return -1;
   384     }
   383     }
   385 
   384 
   386     /* Attempt to make the context current so we can use OpenGL commands */
   385     /* Attempt to make the context current so we can use OpenGL commands */
   387     if (qnxgl_set_current (oglctx) == -1) {
   386     if (qnxgl_set_current(oglctx) == -1) {
   388         SDL_SetError
   387         SDL_SetError
   389             ("ph_SetupOpenGLContext(): failed to make the OpenGL context current !\n");
   388             ("ph_SetupOpenGLContext(): failed to make the OpenGL context current !\n");
   390         qnxgl_context_destroy (oglctx);
   389         qnxgl_context_destroy(oglctx);
   391         qnxgl_buffers_destroy (oglbuffers);
   390         qnxgl_buffers_destroy(oglbuffers);
   392         qnxgl_finish ();
   391         qnxgl_finish();
   393         return -1;
   392         return -1;
   394     }
   393     }
   395 
   394 
   396     PtFlush ();
   395     PtFlush();
   397 
   396 
   398     oglflags = flags;
   397     oglflags = flags;
   399     oglbpp = bpp;
   398     oglbpp = bpp;
   400 
   399 
   401     return 0;
   400     return 0;