Henri Verbeet : wined3d: Create a separate function for checking a format' s FBO compatibility.
Alexandre Julliard
julliard at winehq.org
Fri Mar 27 10:06:38 CDT 2009
Module: wine
Branch: master
Commit: 7874a6b74b3e4f77e45044eef4b4377fc7bdf568
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7874a6b74b3e4f77e45044eef4b4377fc7bdf568
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Fri Mar 27 15:15:17 2009 +0100
wined3d: Create a separate function for checking a format's FBO compatibility.
---
dlls/wined3d/utils.c | 58 ++++++++++++++++++++++++++-----------------------
1 files changed, 31 insertions(+), 27 deletions(-)
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index e63fd60..7753888 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -404,12 +404,36 @@ static BOOL init_format_base_info(WineD3D_GL_Info *gl_info)
return TRUE;
}
+#define GLINFO_LOCATION (*gl_info)
+
+static BOOL check_fbo_compat(const WineD3D_GL_Info *gl_info, GLint internal_format)
+{
+ GLuint tex, fb;
+ GLenum status;
+
+ while(glGetError());
+ glGenTextures(1, &tex);
+ glBindTexture(GL_TEXTURE_2D, tex);
+ glTexImage2D(GL_TEXTURE_2D, 0, internal_format, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+
+ GL_EXTCALL(glGenFramebuffersEXT(1, &fb));
+ GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb));
+ GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0));
+
+ status = GL_EXTCALL(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT));
+ GL_EXTCALL(glDeleteFramebuffersEXT(1, &fb));
+ glDeleteTextures(1, &tex);
+
+ checkGLcall("Framebuffer format check");
+
+ return status == GL_FRAMEBUFFER_COMPLETE_EXT;
+}
+
BOOL initPixelFormatsNoGL(WineD3D_GL_Info *gl_info)
{
return init_format_base_info(gl_info);
}
-#define GLINFO_LOCATION (*gl_info)
BOOL initPixelFormats(WineD3D_GL_Info *gl_info)
{
unsigned int src;
@@ -433,42 +457,22 @@ BOOL initPixelFormats(WineD3D_GL_Info *gl_info)
desc->Flags |= gl_formats_template[src].Flags;
desc->heightscale = 1.0;
- if(wined3d_settings.offscreen_rendering_mode == ORM_FBO &&
- gl_formats_template[src].rtInternal != 0) {
- GLuint tex, fb;
- GLenum status;
-
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO && gl_formats_template[src].rtInternal)
+ {
/* Check if the default internal format is supported as a frame buffer target, otherwise
* fall back to the render target internal.
*
* Try to stick to the standard format if possible, this limits precision differences
*/
- while(glGetError());
- glGenTextures(1, &tex);
- glBindTexture(GL_TEXTURE_2D, tex);
- glTexImage2D(GL_TEXTURE_2D, 0, gl_formats_template[src].glInternal, 16, 16, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, NULL);
-
- GL_EXTCALL(glGenFramebuffersEXT(1, &fb));
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb));
- GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
- GL_TEXTURE_2D, tex, 0));
-
- status = GL_EXTCALL(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT));
- GL_EXTCALL(glDeleteFramebuffersEXT(1, &fb));
- glDeleteTextures(1, &tex);
-
- checkGLcall("Framebuffer format check");
-
- if(status != GL_FRAMEBUFFER_COMPLETE_EXT) {
- TRACE("Internal format of %s not supported as frame buffer target, using render target internal instead\n",
- debug_d3dformat(gl_formats_template[src].fmt));
+ if (!check_fbo_compat(gl_info, gl_formats_template[src].glInternal))
+ {
+ TRACE("Internal format of %s not supported as FBO target, using render target internal instead\n",
+ debug_d3dformat(gl_formats_template[src].fmt));
gl_info->gl_formats[dst].rtInternal = gl_formats_template[src].rtInternal;
} else {
TRACE("Format %s is supported as fbo target\n", debug_d3dformat(gl_formats_template[src].fmt));
gl_info->gl_formats[dst].rtInternal = gl_formats_template[src].glInternal;
}
-
} else {
gl_info->gl_formats[dst].rtInternal = gl_formats_template[src].glInternal;
}
More information about the wine-cvs
mailing list