Module: wine Branch: master Commit: f11f6f681e923f9d47a0f7d0151e02cd750cd150 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f11f6f681e923f9d47a0f7d015...
Author: Stefan Dösinger stefandoesinger@gmx.at Date: Sun Feb 21 21:29:56 2016 +0000
wined3d: Retrieve FBO attachments from GL in context_check_fbo_status.
Signed-off-by: Stefan Dösinger stefandoesinger@gmx.at Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wined3d/context.c | 115 +++++++++++++++++++++++++++++++++-------- dlls/wined3d/utils.c | 29 +++++++++++ dlls/wined3d/wined3d_private.h | 1 + 3 files changed, 123 insertions(+), 22 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 442516a..3668195 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -243,6 +243,95 @@ static void context_attach_surface_fbo(struct wined3d_context *context, } }
+static void context_dump_fbo_attachment(const struct wined3d_gl_info *gl_info, GLenum target, + GLenum attachment) +{ + GLint type, name, samples, width, height, old_texture, level, face, fmt, tex_target; + + gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv(target, attachment, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &name); + gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv(target, attachment, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &type); + + if (type == GL_RENDERBUFFER) + { + gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, name); + gl_info->fbo_ops.glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width); + gl_info->fbo_ops.glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height); + if (gl_info->limits.samples > 1) + gl_info->fbo_ops.glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, &samples); + else + samples = 1; + gl_info->fbo_ops.glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_INTERNAL_FORMAT, &fmt); + FIXME(" %s: renderbuffer %d, %dx%d, %d samples, format %#x.\n", + debug_fboattachment(attachment), name, width, height, samples, fmt); + } + else if (type == GL_TEXTURE) + { + const char *tex_type_str; + + gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv(target, attachment, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, &level); + gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv(target, attachment, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, &face); + + if (face) + { + gl_info->gl_ops.gl.p_glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP, &old_texture); + + glBindTexture(GL_TEXTURE_CUBE_MAP, name); + glGetTexLevelParameteriv(face, level, GL_TEXTURE_INTERNAL_FORMAT, &fmt); + glGetTexLevelParameteriv(face, level, GL_TEXTURE_WIDTH, &width); + glGetTexLevelParameteriv(face, level, GL_TEXTURE_HEIGHT, &height); + + tex_target = GL_TEXTURE_CUBE_MAP; + tex_type_str = "cube"; + } + else + { + gl_info->gl_ops.gl.p_glGetIntegerv(GL_TEXTURE_BINDING_2D, &old_texture); + while (gl_info->gl_ops.gl.p_glGetError()); + + glBindTexture(GL_TEXTURE_2D, name); + if (!gl_info->gl_ops.gl.p_glGetError()) + { + tex_target = GL_TEXTURE_2D; + tex_type_str = "2d"; + } + else + { + glBindTexture(GL_TEXTURE_2D, old_texture); + gl_info->gl_ops.gl.p_glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_texture); + + glBindTexture(GL_TEXTURE_RECTANGLE_ARB, name); + if (gl_info->gl_ops.gl.p_glGetError()) + { + glBindTexture(GL_TEXTURE_RECTANGLE_ARB, old_texture); + FIXME("Cannot find type of texture %d.\n", name); + return; + } + tex_target = GL_TEXTURE_RECTANGLE_ARB; + tex_type_str = "rectangle"; + } + + glGetTexLevelParameteriv(tex_target, level, GL_TEXTURE_INTERNAL_FORMAT, &fmt); + glGetTexLevelParameteriv(tex_target, level, GL_TEXTURE_WIDTH, &width); + glGetTexLevelParameteriv(tex_target, level, GL_TEXTURE_HEIGHT, &height); + } + + FIXME(" %s: %s texture %d, %dx%d, format %#x.\n", debug_fboattachment(attachment), + tex_type_str, name, width, height, fmt); + + glBindTexture(tex_target, old_texture); + } + else if (type == GL_NONE) + { + FIXME("\t%s: NONE.\n", debug_fboattachment(attachment)); + } + else + ERR("\t%s: Unknown attachment %#x.\n", debug_fboattachment(attachment), type); +} + /* Context activation is done by the caller. */ void context_check_fbo_status(const struct wined3d_context *context, GLenum target) { @@ -258,7 +347,6 @@ void context_check_fbo_status(const struct wined3d_context *context, GLenum targ } else { - const struct wined3d_surface *attachment; unsigned int i;
FIXME("FBO status %s (%#x)\n", debug_fbostatus(status), status); @@ -269,29 +357,12 @@ void context_check_fbo_status(const struct wined3d_context *context, GLenum targ return; }
- FIXME("\tColor Location %s (%#x).\n", wined3d_debug_location(context->current_fbo->color_location), - context->current_fbo->color_location); - FIXME("\tDepth Stencil Location %s (%#x).\n", wined3d_debug_location(context->current_fbo->ds_location), - context->current_fbo->ds_location); + context_dump_fbo_attachment(gl_info, target, GL_DEPTH_ATTACHMENT); + context_dump_fbo_attachment(gl_info, target, GL_STENCIL_ATTACHMENT);
- /* Dump the FBO attachments */ for (i = 0; i < gl_info->limits.buffers; ++i) - { - attachment = context->current_fbo->render_targets[i]; - if (attachment) - { - FIXME("\tColor attachment %d: (%p) %s %ux%u %u samples.\n", - i, attachment, debug_d3dformat(attachment->resource.format->id), - attachment->pow2Width, attachment->pow2Height, attachment->resource.multisample_type); - } - } - attachment = context->current_fbo->depth_stencil; - if (attachment) - { - FIXME("\tDepth attachment: (%p) %s %ux%u %u samples.\n", - attachment, debug_d3dformat(attachment->resource.format->id), - attachment->pow2Width, attachment->pow2Height, attachment->resource.multisample_type); - } + context_dump_fbo_attachment(gl_info, target, GL_COLOR_ATTACHMENT0 + i); + checkGLcall("Dump FBO attachments"); } }
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 734b265..4e33f86 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -3948,6 +3948,35 @@ const char *debug_d3dpool(enum wined3d_pool pool) } }
+const char *debug_fboattachment(GLenum attachment) +{ + switch(attachment) + { +#define WINED3D_TO_STR(x) case x: return #x + WINED3D_TO_STR(GL_COLOR_ATTACHMENT0); + WINED3D_TO_STR(GL_COLOR_ATTACHMENT1); + WINED3D_TO_STR(GL_COLOR_ATTACHMENT2); + WINED3D_TO_STR(GL_COLOR_ATTACHMENT3); + WINED3D_TO_STR(GL_COLOR_ATTACHMENT4); + WINED3D_TO_STR(GL_COLOR_ATTACHMENT5); + WINED3D_TO_STR(GL_COLOR_ATTACHMENT6); + WINED3D_TO_STR(GL_COLOR_ATTACHMENT7); + WINED3D_TO_STR(GL_COLOR_ATTACHMENT8); + WINED3D_TO_STR(GL_COLOR_ATTACHMENT9); + WINED3D_TO_STR(GL_COLOR_ATTACHMENT10); + WINED3D_TO_STR(GL_COLOR_ATTACHMENT11); + WINED3D_TO_STR(GL_COLOR_ATTACHMENT12); + WINED3D_TO_STR(GL_COLOR_ATTACHMENT13); + WINED3D_TO_STR(GL_COLOR_ATTACHMENT14); + WINED3D_TO_STR(GL_COLOR_ATTACHMENT15); + WINED3D_TO_STR(GL_DEPTH_ATTACHMENT); + WINED3D_TO_STR(GL_STENCIL_ATTACHMENT); +#undef WINED3D_TO_STR + default: + return wine_dbg_sprintf("Unknown FBO attachment %#x", attachment); + } +} + const char *debug_fbostatus(GLenum status) { switch(status) { #define FBOSTATUS_TO_STR(u) case u: return #u diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 4e3d779..324fabd 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2969,6 +2969,7 @@ const char *debug_d3dtexturefiltertype(enum wined3d_texture_filter_type filter_t const char *debug_d3dtexturestate(enum wined3d_texture_stage_state state) DECLSPEC_HIDDEN; const char *debug_d3dtstype(enum wined3d_transform_state tstype) DECLSPEC_HIDDEN; const char *debug_d3dpool(enum wined3d_pool pool) DECLSPEC_HIDDEN; +const char *debug_fboattachment(GLenum attachment) DECLSPEC_HIDDEN; const char *debug_fbostatus(GLenum status) DECLSPEC_HIDDEN; const char *debug_glerror(GLenum error) DECLSPEC_HIDDEN; const char *debug_d3dtop(enum wined3d_texture_op d3dtop) DECLSPEC_HIDDEN;