From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/opengl.c | 146 +++++++++- dlls/winemac.drv/opengl.c | 524 ++++------------------------------ dlls/winewayland.drv/opengl.c | 20 +- dlls/winex11.drv/opengl.c | 20 +- include/wine/opengl_driver.h | 4 +- 5 files changed, 227 insertions(+), 487 deletions(-)
diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index 4db3957530a..f4c70c1158a 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -50,6 +50,8 @@ struct wgl_pbuffer GLsizei height; GLenum texture_format; GLenum texture_target; + GLint mipmap_level; + GLenum cube_face;
struct wgl_context *tmp_context; struct wgl_context *prev_context; @@ -521,9 +523,9 @@ static void win32u_get_pixel_formats( struct wgl_pixel_format *formats, UINT max static struct wgl_pbuffer *win32u_wglCreatePbufferARB( HDC hdc, int format, int width, int height, const int *attribs ) { + UINT total, onscreen, size, max_level = 0; struct wgl_pbuffer *pbuffer; struct opengl_funcs *funcs; - UINT total, onscreen; BOOL largest = FALSE;
TRACE( "(%p, %d, %d, %d, %p)\n", hdc, format, width, height, attribs ); @@ -552,6 +554,7 @@ static struct wgl_pbuffer *win32u_wglCreatePbufferARB( HDC hdc, int format, int pbuffer->funcs = funcs; pbuffer->width = width; pbuffer->height = height; + pbuffer->mipmap_level = -1;
for (; attribs && attribs[0]; attribs += 2) { @@ -623,6 +626,11 @@ static struct wgl_pbuffer *win32u_wglCreatePbufferARB( HDC hdc, int format, int
case WGL_MIPMAP_TEXTURE_ARB: TRACE( "WGL_MIPMAP_TEXTURE_ARB %#x\n", attribs[1] ); + if (attribs[1]) + { + pbuffer->mipmap_level = max_level = 0; + for (size = min( width, height ) / 2; size; size /= 2) max_level++; + } break;
default: @@ -631,7 +639,8 @@ static struct wgl_pbuffer *win32u_wglCreatePbufferARB( HDC hdc, int format, int } }
- if (pbuffer->driver_funcs->p_pbuffer_create( pbuffer->hdc, format, largest, &pbuffer->width, + if (pbuffer->driver_funcs->p_pbuffer_create( pbuffer->hdc, format, largest, pbuffer->texture_format, + pbuffer->texture_target, max_level, &pbuffer->width, &pbuffer->height, &pbuffer->driver_private )) return pbuffer;
@@ -709,8 +718,34 @@ static BOOL win32u_wglQueryPbufferARB( struct wgl_pbuffer *pbuffer, int attrib, break;
case WGL_MIPMAP_TEXTURE_ARB: - *value = GL_FALSE; - FIXME( "WGL_MIPMAP_TEXTURE_ARB not supported\n" ); + *value = pbuffer->mipmap_level >= 0; + break; + case WGL_MIPMAP_LEVEL_ARB: + *value = max( pbuffer->mipmap_level, 0 ); + break; + case WGL_CUBE_MAP_FACE_ARB: + switch (pbuffer->cube_face) + { + case GL_TEXTURE_CUBE_MAP_POSITIVE_X: + default: + *value = WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB; + break; + case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: + *value = WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB; + break; + case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: + *value = WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB; + break; + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: + *value = WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB; + break; + case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: + *value = WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB; + break; + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: + *value = WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB; + break; + } break;
default: @@ -737,8 +772,11 @@ static GLenum binding_from_target( GLenum target ) static BOOL win32u_wglBindTexImageARB( struct wgl_pbuffer *pbuffer, int buffer ) { HDC prev_draw = NtCurrentTeb()->glReserved1[0], prev_read = NtCurrentTeb()->glReserved1[1]; + int prev_texture = 0, format = win32u_wglGetPixelFormat( pbuffer->hdc ); struct wgl_context *prev_context = NtCurrentTeb()->glContext; - int prev_texture = 0; + struct wgl_pixel_format desc; + GLenum source; + UINT ret;
TRACE( "pbuffer %p, buffer %d\n", pbuffer, buffer );
@@ -748,6 +786,52 @@ static BOOL win32u_wglBindTexImageARB( struct wgl_pbuffer *pbuffer, int buffer ) return GL_FALSE; }
+ if (!pbuffer->driver_funcs->p_describe_pixel_format( format, &desc )) + { + RtlSetLastWin32Error( ERROR_INVALID_PIXEL_FORMAT ); + return FALSE; + } + + switch (buffer) + { + case WGL_FRONT_LEFT_ARB: + if (desc.pfd.dwFlags & PFD_STEREO) source = GL_FRONT_LEFT; + else source = GL_FRONT; + break; + case WGL_FRONT_RIGHT_ARB: + source = GL_FRONT_RIGHT; + break; + case WGL_BACK_LEFT_ARB: + if (desc.pfd.dwFlags & PFD_STEREO) source = GL_BACK_LEFT; + else source = GL_BACK; + break; + case WGL_BACK_RIGHT_ARB: + source = GL_BACK_RIGHT; + break; + case WGL_AUX0_ARB: source = GL_AUX0; break; + case WGL_AUX1_ARB: source = GL_AUX1; break; + case WGL_AUX2_ARB: source = GL_AUX2; break; + case WGL_AUX3_ARB: source = GL_AUX3; break; + + case WGL_AUX4_ARB: + case WGL_AUX5_ARB: + case WGL_AUX6_ARB: + case WGL_AUX7_ARB: + case WGL_AUX8_ARB: + case WGL_AUX9_ARB: + FIXME( "Unsupported source buffer %#x\n", buffer ); + RtlSetLastWin32Error( ERROR_INVALID_DATA ); + return GL_FALSE; + + default: + WARN( "Unknown source buffer %#x\n", buffer ); + RtlSetLastWin32Error( ERROR_INVALID_DATA ); + return GL_FALSE; + } + + if ((ret = pbuffer->driver_funcs->p_pbuffer_bind( pbuffer->hdc, pbuffer->driver_private, source )) != -1) + return ret; + if (!pbuffer->tmp_context || pbuffer->prev_context != prev_context) { if (pbuffer->tmp_context) pbuffer->funcs->p_wglDeleteContext( pbuffer->tmp_context ); @@ -780,7 +864,8 @@ static BOOL win32u_wglReleaseTexImageARB( struct wgl_pbuffer *pbuffer, int buffe RtlSetLastWin32Error( ERROR_INVALID_HANDLE ); return GL_FALSE; } - return GL_TRUE; + + return !!pbuffer->driver_funcs->p_pbuffer_bind( pbuffer->hdc, pbuffer->driver_private, GL_NONE ); }
static BOOL win32u_wglSetPbufferAttribARB( struct wgl_pbuffer *pbuffer, const int *attribs ) @@ -792,7 +877,54 @@ static BOOL win32u_wglSetPbufferAttribARB( struct wgl_pbuffer *pbuffer, const in RtlSetLastWin32Error( ERROR_INVALID_HANDLE ); return GL_FALSE; } - return GL_TRUE; + + for (; attribs && attribs[0]; attribs += 2) + { + switch (attribs[0]) + { + case WGL_MIPMAP_LEVEL_ARB: + TRACE( "WGL_MIPMAP_LEVEL_ARB %#x\n", attribs[1] ); + pbuffer->mipmap_level = attribs[1]; + break; + + case WGL_CUBE_MAP_FACE_ARB: + TRACE( "WGL_CUBE_MAP_FACE_ARB %#x\n", attribs[1] ); + switch (attribs[1]) + { + case WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: + pbuffer->cube_face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; + break; + case WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: + pbuffer->cube_face = GL_TEXTURE_CUBE_MAP_NEGATIVE_X; + break; + case WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: + pbuffer->cube_face = GL_TEXTURE_CUBE_MAP_POSITIVE_Y; + break; + case WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: + pbuffer->cube_face = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y; + break; + case WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: + pbuffer->cube_face = GL_TEXTURE_CUBE_MAP_POSITIVE_Z; + break; + case WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: + pbuffer->cube_face = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; + break; + default: + FIXME( "Unknown texture face: %x\n", attribs[1] ); + RtlSetLastWin32Error( ERROR_INVALID_DATA ); + return GL_FALSE; + } + break; + + default: + FIXME( "Invalid attribute 0x%x\n", attribs[0] ); + RtlSetLastWin32Error( ERROR_INVALID_DATA ); + return GL_FALSE; + } + } + + return pbuffer->driver_funcs->p_pbuffer_updated( pbuffer->hdc, pbuffer->driver_private, + pbuffer->cube_face, max( pbuffer->mipmap_level, 0 ) ); }
static void memory_funcs_init(void) diff --git a/dlls/winemac.drv/opengl.c b/dlls/winemac.drv/opengl.c index f6b0ff90d7f..3d9607d2dbf 100644 --- a/dlls/winemac.drv/opengl.c +++ b/dlls/winemac.drv/opengl.c @@ -67,10 +67,12 @@ struct wgl_context HWND draw_hwnd; macdrv_view draw_view; RECT draw_rect; - struct wgl_pbuffer *draw_pbuffer; + CGLPBufferObj draw_pbuffer; + GLenum draw_pbuffer_face; + GLint draw_pbuffer_level; macdrv_view read_view; RECT read_rect; - struct wgl_pbuffer *read_pbuffer; + CGLPBufferObj read_pbuffer; BOOL has_been_current; BOOL sharing; LONG update_swap_interval; @@ -82,17 +84,6 @@ struct wgl_context static struct list context_list = LIST_INIT(context_list); static pthread_mutex_t context_mutex = PTHREAD_MUTEX_INITIALIZER;
- -struct wgl_pbuffer -{ - CGLPBufferObj pbuffer; - int format; - BOOL no_texture; - int max_level; - GLint level; - GLenum face; -}; - static CFMutableDictionaryRef dc_pbuffers; static pthread_mutex_t dc_pbuffers_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -1544,7 +1535,7 @@ static void make_context_current(struct wgl_context *context, BOOL read) { macdrv_view view; RECT view_rect; - struct wgl_pbuffer *pbuffer; + CGLPBufferObj pbuffer;
if (read) { @@ -1569,8 +1560,7 @@ static void make_context_current(struct wgl_context *context, BOOL read)
if (CGLIsEnabled(context->cglcontext, kCGLCESurfaceBackingSize, &enabled) == kCGLNoError && enabled) CGLDisable(context->cglcontext, kCGLCESurfaceBackingSize); - CGLSetPBuffer(context->cglcontext, pbuffer->pbuffer, pbuffer->face, - pbuffer->level, 0); + CGLSetPBuffer(context->cglcontext, pbuffer, context->draw_pbuffer_face, context->draw_pbuffer_level, 0); CGLSetCurrentContext(context->cglcontext); } } @@ -2210,65 +2200,18 @@ static void macdrv_glViewport(GLint x, GLint y, GLsizei width, GLsizei height) * * WGL_ARB_render_texture: wglBindTexImageARB */ -static BOOL macdrv_wglBindTexImageARB(struct wgl_pbuffer *pbuffer, int iBuffer) +static UINT macdrv_pbuffer_bind(HDC hdc, void *private, GLenum source) { struct wgl_context *context = NtCurrentTeb()->glContext; - GLenum source; + CGLPBufferObj pbuffer = private; CGLError err;
- TRACE("pbuffer %p iBuffer 0x%x\n", pbuffer, iBuffer); + TRACE("hdc %p pbuffer %p source 0x%x\n", hdc, pbuffer, source);
- if (pbuffer->no_texture) - { - RtlSetLastWin32Error(ERROR_INVALID_OPERATION); - return GL_FALSE; - } - - if (!context->draw_view && context->draw_pbuffer == pbuffer) + if (!context->draw_view && context->draw_pbuffer == pbuffer && source != GL_NONE) opengl_funcs.p_glFlush();
- switch (iBuffer) - { - case WGL_FRONT_LEFT_ARB: - if (pixel_formats[pbuffer->format - 1].stereo) - source = GL_FRONT_LEFT; - else - source = GL_FRONT; - break; - case WGL_FRONT_RIGHT_ARB: - source = GL_FRONT_RIGHT; - break; - case WGL_BACK_LEFT_ARB: - if (pixel_formats[pbuffer->format - 1].stereo) - source = GL_BACK_LEFT; - else - source = GL_BACK; - break; - case WGL_BACK_RIGHT_ARB: - source = GL_BACK_RIGHT; - break; - case WGL_AUX0_ARB: source = GL_AUX0; break; - case WGL_AUX1_ARB: source = GL_AUX1; break; - case WGL_AUX2_ARB: source = GL_AUX2; break; - case WGL_AUX3_ARB: source = GL_AUX3; break; - - case WGL_AUX4_ARB: - case WGL_AUX5_ARB: - case WGL_AUX6_ARB: - case WGL_AUX7_ARB: - case WGL_AUX8_ARB: - case WGL_AUX9_ARB: - FIXME("unsupported source buffer 0x%x\n", iBuffer); - RtlSetLastWin32Error(ERROR_INVALID_DATA); - return GL_FALSE; - - default: - WARN("unknown source buffer 0x%x\n", iBuffer); - RtlSetLastWin32Error(ERROR_INVALID_DATA); - return GL_FALSE; - } - - err = CGLTexImagePBuffer(context->cglcontext, pbuffer->pbuffer, source); + err = CGLTexImagePBuffer(context->cglcontext, pbuffer, source); if (err != kCGLNoError) { WARN("CGLTexImagePBuffer failed with err %d %s\n", err, CGLErrorString(err)); @@ -2459,191 +2402,46 @@ static struct wgl_context *macdrv_wglCreateContextAttribsARB(HDC hdc, return context; }
- -/********************************************************************** - * macdrv_wglCreatePbufferARB - * - * WGL_ARB_pbuffer: wglCreatePbufferARB - */ -static struct wgl_pbuffer *macdrv_wglCreatePbufferARB(HDC hdc, int iPixelFormat, int iWidth, int iHeight, - const int *piAttribList) +static BOOL macdrv_pbuffer_create(HDC hdc, int format, BOOL largest, GLenum texture_format, GLenum texture_target, + GLint max_level, GLsizei *width, GLsizei *height, void **private) { - struct wgl_pbuffer* pbuffer; - GLenum target = 0; - GLenum internalFormat = 0; CGLError err;
- TRACE("hdc %p iPixelFormat %d iWidth %d iHeight %d piAttribList %p\n", - hdc, iPixelFormat, iWidth, iHeight, piAttribList); - - if (!is_valid_pixel_format(iPixelFormat) || !pixel_formats[iPixelFormat - 1].pbuffer) - { - WARN("invalid pixel format %d\n", iPixelFormat); - RtlSetLastWin32Error(ERROR_INVALID_PIXEL_FORMAT); - return NULL; - } - - pbuffer = calloc(1, sizeof(*pbuffer)); - pbuffer->format = iPixelFormat; - - for ( ; piAttribList && *piAttribList; piAttribList += 2) - { - int attr = piAttribList[0]; - int value = piAttribList[1]; - - switch (attr) - { - case WGL_PBUFFER_LARGEST_ARB: - FIXME("WGL_PBUFFER_LARGEST_ARB: %d; ignoring\n", value); - break; - - case WGL_TEXTURE_FORMAT_ARB: - switch (value) - { - case WGL_TEXTURE_RGBA_ARB: - TRACE("WGL_TEXTURE_FORMAT_ARB: WGL_TEXTURE_RGBA_ARB\n"); - internalFormat = GL_RGBA; - break; - case WGL_TEXTURE_RGB_ARB: - TRACE("WGL_TEXTURE_FORMAT_ARB: WGL_TEXTURE_RGB_ARB\n"); - internalFormat = GL_RGB; - break; - case WGL_NO_TEXTURE_ARB: - TRACE("WGL_TEXTURE_FORMAT_ARB: WGL_NO_TEXTURE_ARB\n"); - internalFormat = 0; - break; - default: - WARN("unknown WGL_TEXTURE_FORMAT_ARB value 0x%x\n", value); - RtlSetLastWin32Error(ERROR_INVALID_DATA); - goto done; - } - break; - - case WGL_TEXTURE_TARGET_ARB: - pbuffer->face = 0; - switch (value) - { - case WGL_NO_TEXTURE_ARB: - TRACE("WGL_TEXTURE_TARGET_ARB: WGL_NO_TEXTURE_ARB\n"); - target = 0; - break; - case WGL_TEXTURE_CUBE_MAP_ARB: - TRACE("WGL_TEXTURE_TARGET_ARB: WGL_TEXTURE_CUBE_MAP_ARB\n"); - target = GL_TEXTURE_CUBE_MAP; - pbuffer->face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; - break; - case WGL_TEXTURE_1D_ARB: - FIXME("WGL_TEXTURE_TARGET_ARB: WGL_TEXTURE_1D_ARB; not supported\n"); - RtlSetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); - goto done; - case WGL_TEXTURE_2D_ARB: - TRACE("WGL_TEXTURE_TARGET_ARB: WGL_TEXTURE_2D_ARB\n"); - target = GL_TEXTURE_2D; - break; - case WGL_TEXTURE_RECTANGLE_NV: - TRACE("WGL_TEXTURE_TARGET_ARB: WGL_TEXTURE_RECTANGLE_NV\n"); - target = GL_TEXTURE_RECTANGLE; - break; - default: - WARN("unknown WGL_TEXTURE_TARGET_ARB value 0x%x\n", value); - RtlSetLastWin32Error(ERROR_INVALID_DATA); - goto done; - } - break; - - case WGL_MIPMAP_TEXTURE_ARB: - TRACE("WGL_MIPMAP_TEXTURE_ARB: %d\n", value); - pbuffer->max_level = 0; - if (value) - { - int size = min(iWidth, iHeight) / 2; - while (size) - { - pbuffer->max_level++; - size /= 2; - } - } - break; - - default: - WARN("unknown attribute 0x%x\n", attr); - RtlSetLastWin32Error(ERROR_INVALID_DATA); - goto done; - } - } + TRACE("hdc %p, format %d, largest %u, texture_format %#x, texture_target %#x, max_level %#x, width %d, height %d, private %p\n", + hdc, format, largest, texture_format, texture_target, max_level, *width, *height, private);
- if (!target || !internalFormat) + if (!texture_target || !texture_format) { - pbuffer->no_texture = TRUE; /* no actual way to turn off ability to texture; use most permissive target */ - target = GL_TEXTURE_RECTANGLE; - internalFormat = GL_RGB; + texture_target = GL_TEXTURE_RECTANGLE; + texture_format = GL_RGB; }
- err = CGLCreatePBuffer(iWidth, iHeight, target, internalFormat, pbuffer->max_level, &pbuffer->pbuffer); + err = CGLCreatePBuffer(*width, *height, texture_target, texture_format, max_level, (CGLPBufferObj *)private); if (err != kCGLNoError) { WARN("CGLCreatePBuffer failed; err %d %s\n", err, CGLErrorString(err)); - pbuffer->pbuffer = NULL; - if (err == kCGLBadAlloc) - RtlSetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); - else - RtlSetLastWin32Error(ERROR_INVALID_DATA); - } - -done: - if (!pbuffer->pbuffer) - { - free(pbuffer); - return NULL; + return FALSE; }
- TRACE(" -> %p\n", pbuffer); - return pbuffer; -} - + pthread_mutex_lock(&dc_pbuffers_mutex); + CFDictionarySetValue(dc_pbuffers, hdc, private); + pthread_mutex_unlock(&dc_pbuffers_mutex);
-/********************************************************************** - * macdrv_wglDestroyPbufferARB - * - * WGL_ARB_pbuffer: wglDestroyPbufferARB - */ -static BOOL macdrv_wglDestroyPbufferARB(struct wgl_pbuffer *pbuffer) -{ - TRACE("pbuffer %p\n", pbuffer); - if (pbuffer && pbuffer->pbuffer) - CGLReleasePBuffer(pbuffer->pbuffer); - free(pbuffer); - return GL_TRUE; + TRACE(" -> %p\n", *private); + return TRUE; }
- -/********************************************************************** - * macdrv_wglGetPbufferDCARB - * - * WGL_ARB_pbuffer: wglGetPbufferDCARB - */ -static HDC macdrv_wglGetPbufferDCARB(struct wgl_pbuffer *pbuffer) +static BOOL macdrv_pbuffer_destroy(HDC hdc, void *private) { - HDC hdc; - struct wgl_pbuffer *prev; - - hdc = NtGdiOpenDCW(NULL, NULL, NULL, 0, TRUE, NULL, NULL, NULL); - if (!hdc) return 0; + TRACE("private %p\n", private);
pthread_mutex_lock(&dc_pbuffers_mutex); - prev = (struct wgl_pbuffer*)CFDictionaryGetValue(dc_pbuffers, hdc); - if (prev) - { - CGLReleasePBuffer(prev->pbuffer); - free(prev); - } - CFDictionarySetValue(dc_pbuffers, hdc, pbuffer); + CFDictionaryRemoveValue(dc_pbuffers, hdc); pthread_mutex_unlock(&dc_pbuffers_mutex);
- NtGdiSetPixelFormat(hdc, pbuffer->format); - TRACE("pbuffer %p -> hdc %p\n", pbuffer, hdc); - return hdc; + CGLReleasePBuffer(private); + return GL_TRUE; }
@@ -2744,15 +2542,16 @@ static BOOL macdrv_wglMakeContextCurrentARB(HDC draw_hdc, HDC read_hdc, struct w } else { - struct wgl_pbuffer *pbuffer; + CGLPBufferObj pbuffer;
pthread_mutex_lock(&dc_pbuffers_mutex); - pbuffer = (struct wgl_pbuffer*)CFDictionaryGetValue(dc_pbuffers, draw_hdc); + pbuffer = (CGLPBufferObj)CFDictionaryGetValue(dc_pbuffers, draw_hdc); if (pbuffer) { - if (context->format != pbuffer->format) + int format = opengl_funcs.p_wglGetPixelFormat(draw_hdc); + if (context->format != format) { - WARN("mismatched pixel format draw_hdc %p %u context %p %u\n", draw_hdc, pbuffer->format, context, context->format); + WARN("mismatched pixel format draw_hdc %p %u context %p %u\n", draw_hdc, format, context, context->format); pthread_mutex_unlock(&dc_pbuffers_mutex); RtlSetLastWin32Error(ERROR_INVALID_PIXEL_FORMAT); return FALSE; @@ -2795,7 +2594,7 @@ static BOOL macdrv_wglMakeContextCurrentARB(HDC draw_hdc, HDC read_hdc, struct w else { pthread_mutex_lock(&dc_pbuffers_mutex); - context->read_pbuffer = (struct wgl_pbuffer*)CFDictionaryGetValue(dc_pbuffers, read_hdc); + context->read_pbuffer = (CGLPBufferObj)CFDictionaryGetValue(dc_pbuffers, read_hdc); pthread_mutex_unlock(&dc_pbuffers_mutex); } } @@ -2930,113 +2729,6 @@ static const char *macdrv_wglQueryCurrentRendererStringWINE(GLenum attribute) }
-/********************************************************************** - * macdrv_wglQueryPbufferARB - * - * WGL_ARB_pbuffer: wglQueryPbufferARB - */ -static BOOL macdrv_wglQueryPbufferARB(struct wgl_pbuffer *pbuffer, int iAttribute, int *piValue) -{ - CGLError err; - GLsizei width; - GLsizei height; - GLenum target; - GLenum internalFormat; - GLint mipmap; - - TRACE("pbuffer %p iAttribute 0x%x piValue %p\n", pbuffer, iAttribute, piValue); - - err = CGLDescribePBuffer(pbuffer->pbuffer, &width, &height, &target, &internalFormat, &mipmap); - if (err != kCGLNoError) - { - WARN("CGLDescribePBuffer failed; error %d %s\n", err, CGLErrorString(err)); - RtlSetLastWin32Error(ERROR_INVALID_HANDLE); - return GL_FALSE; - } - - switch (iAttribute) - { - case WGL_PBUFFER_WIDTH_ARB: - *piValue = width; - break; - case WGL_PBUFFER_HEIGHT_ARB: - *piValue = height; - break; - case WGL_PBUFFER_LOST_ARB: - /* Mac PBuffers can't be lost */ - *piValue = GL_FALSE; - break; - case WGL_TEXTURE_FORMAT_ARB: - if (pbuffer->no_texture) - *piValue = WGL_NO_TEXTURE_ARB; - else switch (internalFormat) - { - case GL_RGBA: - *piValue = WGL_TEXTURE_RGBA_ARB; - break; - case GL_RGB: - default: - *piValue = WGL_TEXTURE_RGB_ARB; - break; - } - break; - case WGL_TEXTURE_TARGET_ARB: - if (pbuffer->no_texture) - *piValue = WGL_NO_TEXTURE_ARB; - else switch (target) - { - case GL_TEXTURE_CUBE_MAP: - *piValue = WGL_TEXTURE_CUBE_MAP_ARB; - break; - case GL_TEXTURE_2D: - *piValue = WGL_TEXTURE_2D_ARB; - break; - case GL_TEXTURE_RECTANGLE: - default: - *piValue = WGL_TEXTURE_RECTANGLE_NV; - break; - } - break; - case WGL_MIPMAP_TEXTURE_ARB: - *piValue = (pbuffer->max_level > 0); - break; - case WGL_MIPMAP_LEVEL_ARB: - *piValue = pbuffer->level; - break; - case WGL_CUBE_MAP_FACE_ARB: - switch (pbuffer->face) - { - case GL_TEXTURE_CUBE_MAP_POSITIVE_X: - default: - *piValue = WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB; - break; - case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: - *piValue = WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB; - break; - case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: - *piValue = WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB; - break; - case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: - *piValue = WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB; - break; - case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: - *piValue = WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB; - break; - case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: - *piValue = WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB; - break; - } - break; - default: - WARN("invalid attribute 0x%x\n", iAttribute); - RtlSetLastWin32Error(ERROR_INVALID_DATA); - return GL_FALSE; - } - - return GL_TRUE; -} - - /********************************************************************** * macdrv_wglQueryRendererIntegerWINE * @@ -3130,129 +2822,19 @@ done: }
-/********************************************************************** - * macdrv_wglReleasePbufferDCARB - * - * WGL_ARB_pbuffer: wglReleasePbufferDCARB - */ -static int macdrv_wglReleasePbufferDCARB(struct wgl_pbuffer *pbuffer, HDC hdc) -{ - struct wgl_pbuffer *prev; - - TRACE("pbuffer %p hdc %p\n", pbuffer, hdc); - - pthread_mutex_lock(&dc_pbuffers_mutex); - - prev = (struct wgl_pbuffer*)CFDictionaryGetValue(dc_pbuffers, hdc); - if (prev) - { - if (prev != pbuffer) - FIXME("hdc %p isn't associated with pbuffer %p\n", hdc, pbuffer); - CGLReleasePBuffer(prev->pbuffer); - free(prev); - CFDictionaryRemoveValue(dc_pbuffers, hdc); - } - else hdc = 0; - - pthread_mutex_unlock(&dc_pbuffers_mutex); - - return hdc && NtGdiDeleteObjectApp(hdc); -} - - -/********************************************************************** - * macdrv_wglReleaseTexImageARB - * - * WGL_ARB_render_texture: wglReleaseTexImageARB - */ -static BOOL macdrv_wglReleaseTexImageARB(struct wgl_pbuffer *pbuffer, int iBuffer) -{ - struct wgl_context *context = NtCurrentTeb()->glContext; - CGLError err; - - TRACE("pbuffer %p iBuffer 0x%x; stub!\n", pbuffer, iBuffer); - - if (pbuffer->no_texture) - { - RtlSetLastWin32Error(ERROR_INVALID_OPERATION); - return GL_FALSE; - } - - err = CGLTexImagePBuffer(context->cglcontext, pbuffer->pbuffer, GL_NONE); - if (err != kCGLNoError) - { - WARN("CGLTexImagePBuffer failed with err %d %s\n", err, CGLErrorString(err)); - RtlSetLastWin32Error(ERROR_INVALID_OPERATION); - return GL_FALSE; - } - - return GL_TRUE; -} - - -/********************************************************************** - * macdrv_wglSetPbufferAttribARB - * - * WGL_ARB_render_texture: wglSetPbufferAttribARB - */ -static BOOL macdrv_wglSetPbufferAttribARB(struct wgl_pbuffer *pbuffer, const int *piAttribList) +static BOOL macdrv_pbuffer_updated(HDC hdc, void *private, GLenum cube_face, GLint mipmap_level) { struct wgl_context *context = NtCurrentTeb()->glContext; + CGLPBufferObj pbuffer = private;
- TRACE("pbuffer %p piAttribList %p\n", pbuffer, piAttribList); - - for ( ; piAttribList && *piAttribList; piAttribList += 2) - { - int attr = piAttribList[0]; - int value = piAttribList[1]; - switch (attr) - { - case WGL_MIPMAP_LEVEL_ARB: - TRACE("WGL_MIPMAP_LEVEL_ARB: %d\n", value); - pbuffer->level = value; - break; - case WGL_CUBE_MAP_FACE_ARB: - switch (value) - { - case WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: - TRACE("WGL_CUBE_MAP_FACE_ARB: WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB\n"); - pbuffer->face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; - break; - case WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: - TRACE("WGL_CUBE_MAP_FACE_ARB: WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB\n"); - pbuffer->face = GL_TEXTURE_CUBE_MAP_NEGATIVE_X; - break; - case WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: - TRACE("WGL_CUBE_MAP_FACE_ARB: WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB\n"); - pbuffer->face = GL_TEXTURE_CUBE_MAP_POSITIVE_Y; - break; - case WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: - TRACE("WGL_CUBE_MAP_FACE_ARB: WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB\n"); - pbuffer->face = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y; - break; - case WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: - TRACE("WGL_CUBE_MAP_FACE_ARB: WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB\n"); - pbuffer->face = GL_TEXTURE_CUBE_MAP_POSITIVE_Z; - break; - case WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: - TRACE("WGL_CUBE_MAP_FACE_ARB: WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB\n"); - pbuffer->face = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; - break; - default: - WARN("unknown WGL_CUBE_MAP_FACE_ARB value 0x%x\n", value); - RtlSetLastWin32Error(ERROR_INVALID_DATA); - return GL_FALSE; - } - break; - default: - WARN("invalid attribute 0x%x\n", attr); - RtlSetLastWin32Error(ERROR_INVALID_DATA); - return GL_FALSE; - } - } + TRACE("hdc %p pbuffer %p cube_face %#x mipmap_level %d\n", hdc, pbuffer, cube_face, mipmap_level);
if (context && context->draw_pbuffer == pbuffer) + { + context->draw_pbuffer_face = cube_face; + context->draw_pbuffer_level = mipmap_level; make_context_current(context, FALSE); + }
return GL_TRUE; } @@ -3351,18 +2933,6 @@ static const char *macdrv_init_wgl_extensions(void)
if (gluCheckExtension((GLubyte*)"GL_APPLE_pixel_buffer", (GLubyte*)gl_info.glExtensions)) { - register_extension("WGL_ARB_pbuffer"); - opengl_funcs.p_wglCreatePbufferARB = macdrv_wglCreatePbufferARB; - opengl_funcs.p_wglDestroyPbufferARB = macdrv_wglDestroyPbufferARB; - opengl_funcs.p_wglGetPbufferDCARB = macdrv_wglGetPbufferDCARB; - opengl_funcs.p_wglQueryPbufferARB = macdrv_wglQueryPbufferARB; - opengl_funcs.p_wglReleasePbufferDCARB = macdrv_wglReleasePbufferDCARB; - - register_extension("WGL_ARB_render_texture"); - opengl_funcs.p_wglBindTexImageARB = macdrv_wglBindTexImageARB; - opengl_funcs.p_wglReleaseTexImageARB = macdrv_wglReleaseTexImageARB; - opengl_funcs.p_wglSetPbufferAttribARB = macdrv_wglSetPbufferAttribARB; - if (gluCheckExtension((GLubyte*)"GL_ARB_texture_rectangle", (GLubyte*)gl_info.glExtensions) || gluCheckExtension((GLubyte*)"GL_EXT_texture_rectangle", (GLubyte*)gl_info.glExtensions)) register_extension("WGL_NV_render_texture_rectangle"); @@ -3758,10 +3328,10 @@ static BOOL macdrv_wglSwapBuffers(HDC hdc) } else { - struct wgl_pbuffer *pbuffer; + CGLPBufferObj pbuffer;
pthread_mutex_lock(&dc_pbuffers_mutex); - pbuffer = (struct wgl_pbuffer*)CFDictionaryGetValue(dc_pbuffers, hdc); + pbuffer = (CGLPBufferObj)CFDictionaryGetValue(dc_pbuffers, hdc); pthread_mutex_unlock(&dc_pbuffers_mutex);
if (!pbuffer) @@ -3796,6 +3366,10 @@ static const struct opengl_driver_funcs macdrv_driver_funcs = .p_describe_pixel_format = macdrv_describe_pixel_format, .p_init_wgl_extensions = macdrv_init_wgl_extensions, .p_set_pixel_format = macdrv_set_pixel_format, + .p_pbuffer_create = macdrv_pbuffer_create, + .p_pbuffer_destroy = macdrv_pbuffer_destroy, + .p_pbuffer_updated = macdrv_pbuffer_updated, + .p_pbuffer_bind = macdrv_pbuffer_bind, };
static struct opengl_funcs opengl_funcs = diff --git a/dlls/winewayland.drv/opengl.c b/dlls/winewayland.drv/opengl.c index cb15846ae53..cc595f87252 100644 --- a/dlls/winewayland.drv/opengl.c +++ b/dlls/winewayland.drv/opengl.c @@ -663,11 +663,13 @@ static BOOL wayland_wglSwapIntervalEXT(int interval) return ret; }
-static BOOL wayland_pbuffer_create(HDC hdc, int format, BOOL largest, int *width, int *height, void **private) +static BOOL wayland_pbuffer_create(HDC hdc, int format, BOOL largest, GLenum texture_format, GLenum texture_target, + GLint max_level, GLsizei *width, GLsizei *height, void **private) { struct wayland_gl_drawable *drawable;
- TRACE("hdc %p, format %d, largest %u, width %d, height %d, private %p\n", hdc, format, largest, *width, *height, private); + TRACE("hdc %p, format %d, largest %u, texture_format %#x, texture_target %#x, max_level %#x, width %d, height %d, private %p\n", + hdc, format, largest, texture_format, texture_target, max_level, *width, *height, private);
/* Use an unmapped wayland surface as our offscreen "pbuffer" surface. */ if (!(drawable = wayland_gl_drawable_create(0, hdc, format, *width, *height))) return FALSE; @@ -695,6 +697,18 @@ static BOOL wayland_pbuffer_destroy(HDC hdc, void *private) return GL_TRUE; }
+static BOOL wayland_pbuffer_updated(HDC hdc, void *private, GLenum cube_face, GLint mipmap_level) +{ + TRACE("hdc %p, private %p, cube_face %#x, mipmap_level %d\n", hdc, private, cube_face, mipmap_level); + return GL_TRUE; +} + +static UINT wayland_pbuffer_bind(HDC hdc, void *private, GLenum buffer) +{ + TRACE("hdc %p, private %p, buffer %#x\n", hdc, private, buffer); + return -1; /* use default implementation */ +} + static BOOL describe_pixel_format(EGLConfig config, struct wgl_pixel_format *fmt, BOOL pbuffer_single) { EGLint value, surface_type; @@ -960,6 +974,8 @@ static const struct opengl_driver_funcs wayland_driver_funcs = .p_set_pixel_format = wayland_set_pixel_format, .p_pbuffer_create = wayland_pbuffer_create, .p_pbuffer_destroy = wayland_pbuffer_destroy, + .p_pbuffer_updated = wayland_pbuffer_updated, + .p_pbuffer_bind = wayland_pbuffer_bind, };
/********************************************************************** diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 5b100659630..05ae284761c 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -1940,14 +1940,16 @@ static struct wgl_context *X11DRV_wglCreateContextAttribsARB( HDC hdc, struct wg return ret; }
-static BOOL x11drv_pbuffer_create( HDC hdc, int format, BOOL largest, int *width, int *height, void **private ) +static BOOL x11drv_pbuffer_create( HDC hdc, int format, BOOL largest, GLenum texture_format, GLenum texture_target, + GLint max_level, GLsizei *width, GLsizei *height, void **private ) { const struct glx_pixel_format *fmt; int glx_attribs[7], count = 0; struct gl_drawable *surface; RECT rect;
- TRACE( "hdc %p, format %d, largest %u, width %d, height %d, private %p\n", hdc, format, largest, *width, *height, private ); + TRACE( "hdc %p, format %d, largest %u, texture_format %#x, texture_target %#x, max_level %#x, width %d, height %d, private %p\n", + hdc, format, largest, texture_format, texture_target, max_level, *width, *height, private );
/* Convert the WGL pixelformat to a GLX format, if it fails then the format is invalid */ if (!(fmt = get_pixel_format( gdi_display, format, TRUE /* Offscreen */ ))) @@ -2006,6 +2008,18 @@ static BOOL x11drv_pbuffer_destroy( HDC hdc, void *private ) return GL_TRUE; }
+static BOOL x11drv_pbuffer_updated( HDC hdc, void *private, GLenum cube_face, GLint mipmap_level ) +{ + TRACE( "hdc %p, private %p, cube_face %#x, mipmap_level %d\n", hdc, private, cube_face, mipmap_level ); + return GL_TRUE; +} + +static UINT x11drv_pbuffer_bind( HDC hdc, void *private, GLenum buffer ) +{ + TRACE( "hdc %p, private %p, buffer %#x\n", hdc, private, buffer ); + return -1; /* use default implementation */ +} + /** * X11DRV_wglGetSwapIntervalEXT * @@ -2301,6 +2315,8 @@ static const struct opengl_driver_funcs x11drv_driver_funcs = .p_set_pixel_format = x11drv_set_pixel_format, .p_pbuffer_create = x11drv_pbuffer_create, .p_pbuffer_destroy = x11drv_pbuffer_destroy, + .p_pbuffer_updated = x11drv_pbuffer_updated, + .p_pbuffer_bind = x11drv_pbuffer_bind, };
static struct opengl_funcs opengl_funcs = diff --git a/include/wine/opengl_driver.h b/include/wine/opengl_driver.h index 11bcbe6758a..1d78ac09b1c 100644 --- a/include/wine/opengl_driver.h +++ b/include/wine/opengl_driver.h @@ -118,8 +118,10 @@ struct opengl_driver_funcs const char *(*p_init_wgl_extensions)(void); BOOL (*p_set_pixel_format)(HWND,int,int,BOOL);
- BOOL (*p_pbuffer_create)(HDC,int,BOOL,GLsizei*,GLsizei*,void **); + BOOL (*p_pbuffer_create)(HDC,int,BOOL,GLenum,GLenum,GLint,GLsizei*,GLsizei*,void **); BOOL (*p_pbuffer_destroy)(HDC,void*); + BOOL (*p_pbuffer_updated)(HDC,void*,GLenum,GLint); + UINT (*p_pbuffer_bind)(HDC,void*,GLenum); };
#endif /* WINE_UNIX_LIB */