From: Stefan Dösinger Subject: [PATCH 2/4] wined3d: Keep track of renderbuffer capabilities. Message-Id: <1430344816-30744-2-git-send-email-stefan@codeweavers.com> Date: Thu, 30 Apr 2015 00:00:14 +0200 --- dlls/wined3d/arb_program_shader.c | 8 ++++++++ dlls/wined3d/directx.c | 12 +++++++----- dlls/wined3d/glsl_shader.c | 8 ++++++++ dlls/wined3d/surface.c | 4 ++-- dlls/wined3d/texture.c | 17 +++++++++++++---- dlls/wined3d/utils.c | 8 ++++++-- dlls/wined3d/wined3d_private.h | 3 ++- 7 files changed, 46 insertions(+), 14 deletions(-) diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index a45d25f..da2a8f4 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -3348,6 +3348,10 @@ static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_i "TEX R0.x, fragment.texcoord[0], texture[0], RECT;\n" "MOV result.depth.z, R0.x;\n" "END\n", + /* WINED3D_GL_RES_TYPE_BUFFER */ + NULL, + /* WINED3D_GL_RES_TYPE_RB */ + NULL, }; static const char * const blt_fprograms_masked[WINED3D_GL_RES_TYPE_COUNT] = @@ -3386,6 +3390,10 @@ static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_i "TEX R0.x, fragment.texcoord[0], texture[0], RECT;\n" "MOV result.depth.z, R0.x;\n" "END\n", + /* WINED3D_GL_RES_TYPE_BUFFER */ + NULL, + /* WINED3D_GL_RES_TYPE_RB */ + NULL, }; fprogram = masked ? blt_fprograms_masked[tex_type] : blt_fprograms_full[tex_type]; diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 36be539..ad9b496 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -4095,7 +4095,7 @@ static BOOL wined3d_check_pixel_format_color(const struct wined3d_gl_info *gl_in BYTE redSize, greenSize, blueSize, alphaSize, colorBits; /* Float formats need FBOs. If FBOs are used this function isn't called */ - if (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_FLOAT) + if (format->flags[WINED3D_GL_RES_TYPE_RB] & WINED3DFMT_FLAG_FLOAT) return FALSE; if(cfg->iPixelType == WGL_TYPE_RGBA_ARB) { /* Integer RGBA formats */ @@ -4137,7 +4137,7 @@ static BOOL wined3d_check_pixel_format_depth(const struct wined3d_gl_info *gl_in } /* Float formats need FBOs. If FBOs are used this function isn't called */ - if (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_FLOAT) + if (format->flags[WINED3D_GL_RES_TYPE_RB] & WINED3DFMT_FLAG_FLOAT) return FALSE; if ((format->id == WINED3DFMT_D16_LOCKABLE) || (format->id == WINED3DFMT_D32_FLOAT)) @@ -4178,8 +4178,8 @@ HRESULT CDECL wined3d_check_depth_stencil_match(const struct wined3d *wined3d, ds_format = wined3d_get_format(&adapter->gl_info, depth_stencil_format_id); if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { - if ((rt_format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_RENDERTARGET) - && (ds_format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))) + if ((rt_format->flags[WINED3D_GL_RES_TYPE_RB] & WINED3DFMT_FLAG_RENDERTARGET) + && (ds_format->flags[WINED3D_GL_RES_TYPE_RB] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))) { TRACE("Formats match.\n"); return WINED3D_OK; @@ -4382,6 +4382,8 @@ static BOOL CheckSurfaceCapability(const struct wined3d_adapter *adapter, /* All depth stencil formats are supported on surfaces */ if (CheckDepthStencilCapability(adapter, adapter_format, check_format, WINED3D_GL_RES_TYPE_TEX_2D)) return TRUE; + if (CheckDepthStencilCapability(adapter, adapter_format, check_format, WINED3D_GL_RES_TYPE_RB)) + return TRUE; /* If opengl can't process the format natively, the blitter may be able to convert it */ if (adapter->blitter->blit_supported(&adapter->gl_info, &adapter->d3d_info, @@ -4454,7 +4456,7 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad allowed_usage = WINED3DUSAGE_DEPTHSTENCIL | WINED3DUSAGE_RENDERTARGET | WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING; - gl_type = WINED3D_GL_RES_TYPE_TEX_2D; + gl_type = WINED3D_GL_RES_TYPE_RB; break; case WINED3D_RTYPE_TEXTURE: diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index e814c66..70e39d8 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -6797,6 +6797,10 @@ static GLuint create_glsl_blt_shader(const struct wined3d_gl_info *gl_info, enum "{\n" " gl_FragDepth = texture2DRect(sampler, gl_TexCoord[0].xy).x;\n" "}\n", + /* WINED3D_GL_RES_TYPE_BUFFER */ + NULL, + /* WINED3D_GL_RES_TYPE_RB */ + NULL, }; static const char * const blt_pshaders_masked[WINED3D_GL_RES_TYPE_COUNT] = @@ -6833,6 +6837,10 @@ static GLuint create_glsl_blt_shader(const struct wined3d_gl_info *gl_info, enum " if (all(lessThan(gl_FragCoord.xy, mask.zw))) discard;\n" " gl_FragDepth = texture2DRect(sampler, gl_TexCoord[0].xy).x;\n" "}\n", + /* WINED3D_GL_RES_TYPE_BUFFER */ + NULL, + /* WINED3D_GL_RES_TYPE_RB */ + NULL, }; blt_pshader = masked ? blt_pshaders_masked[tex_type] : blt_pshaders_full[tex_type]; diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 6b5f771..7586000 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -998,9 +998,9 @@ static BOOL fbo_blit_supported(const struct wined3d_gl_info *gl_info, enum wined break; case WINED3D_BLIT_OP_DEPTH_BLIT: - if (!(src_format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))) + if (!(src_format->flags[WINED3D_GL_RES_TYPE_RB] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))) return FALSE; - if (!(dst_format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))) + if (!(dst_format->flags[WINED3D_GL_RES_TYPE_RB] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))) return FALSE; break; diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 916bcb2..8184e6d 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -1067,6 +1067,12 @@ static HRESULT cubetexture_init(struct wined3d_texture *texture, const struct wi return WINED3D_OK; } +static BOOL check_ds_support(const struct wined3d_format *format, unsigned int type, DWORD d3d_usage) +{ + return !(d3d_usage & WINED3DUSAGE_DEPTHSTENCIL) + || (format->flags[type] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)); +} + static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3d_resource_desc *desc, UINT levels, DWORD surface_flags, struct wined3d_device *device, void *parent, const struct wined3d_parent_ops *parent_ops) @@ -1077,7 +1083,7 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3 unsigned int i; HRESULT hr; enum wined3d_gl_resource_type gl_type; - unsigned int required_flags = 0, ds_flags = WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL; + unsigned int required_flags = 0; const struct wined3d_format *format; /* TODO: It should only be possible to create textures for formats @@ -1145,18 +1151,21 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3 /* WINED3DUSAGE_DEPTHSTENCIL needs WINED3DFMT_FLAG_DEPTH or WINED3DFMT_FLAG_STENCIL, not both. */ if ((format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & required_flags) == required_flags - && (!(desc->usage & WINED3DUSAGE_DEPTHSTENCIL) || (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & ds_flags)) + && check_ds_support(format, WINED3D_GL_RES_TYPE_TEX_2D, desc->usage) && (gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT] || (desc->width == pow2_width && desc->height == pow2_height))) gl_type = WINED3D_GL_RES_TYPE_TEX_2D; else if ((format->flags[WINED3D_GL_RES_TYPE_TEX_RECT] & required_flags) == required_flags - && (!(desc->usage & WINED3DUSAGE_DEPTHSTENCIL) || (format->flags[WINED3D_GL_RES_TYPE_TEX_RECT] & ds_flags))) + && check_ds_support(format, WINED3D_GL_RES_TYPE_TEX_RECT, desc->usage)) gl_type = WINED3D_GL_RES_TYPE_TEX_RECT; + else if ((format->flags[WINED3D_GL_RES_TYPE_RB] & required_flags) == required_flags + && check_ds_support(format, WINED3D_GL_RES_TYPE_RB, desc->usage)) + gl_type = WINED3D_GL_RES_TYPE_RB; else gl_type = WINED3D_GL_RES_TYPE_TEX_2D; /* No error, may be SCRATCH pool or emulated conditional np2. */ if (FAILED(hr = wined3d_texture_init(texture, &texture2d_ops, 1, levels, desc, - surface_flags, WINED3D_GL_RES_TYPE_TEX_2D, device, parent, parent_ops, &texture_resource_ops))) + surface_flags, gl_type, device, parent, parent_ops, &texture_resource_ops))) { WARN("Failed to initialize texture, returning %#x.\n", hr); return hr; diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 8a7075d..34da55d 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -1627,6 +1627,8 @@ static GLenum wined3d_gl_type_to_enum(enum wined3d_gl_resource_type type) return GL_TEXTURE_RECTANGLE_ARB; case WINED3D_GL_RES_TYPE_BUFFER: return GL_TEXTURE_2D; /* TODO: GL_TEXTURE_BUFFER. */ + case WINED3D_GL_RES_TYPE_RB: + return GL_RENDERBUFFER; case WINED3D_GL_RES_TYPE_COUNT: break; } @@ -1673,7 +1675,7 @@ static void init_format_fbo_compat_info(struct wined3d_gl_info *gl_info) if (!format->glInternal) continue; - if (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) + if (format->flags[WINED3D_GL_RES_TYPE_RB] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) continue; for (type = 0; type < ARRAY_SIZE(format->flags); ++type) @@ -1783,7 +1785,7 @@ static void init_format_fbo_compat_info(struct wined3d_gl_info *gl_info) if (!format->glInternal) continue; - if (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) + if (format->flags[WINED3D_GL_RES_TYPE_RB] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) { TRACE("Skipping format %s because it's a depth/stencil format.\n", debug_d3dformat(format->id)); @@ -1864,6 +1866,8 @@ static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct win if (gl_info->supported[ARB_TEXTURE_RECTANGLE]) format->flags[WINED3D_GL_RES_TYPE_TEX_RECT] |= format_texture_info[i].flags; format->flags[WINED3D_GL_RES_TYPE_BUFFER] |= format_texture_info[i].flags; + format->flags[WINED3D_GL_RES_TYPE_RB] |= format_texture_info[i].flags; + format->flags[WINED3D_GL_RES_TYPE_RB] &= ~WINED3DFMT_FLAG_TEXTURE; if (gl_info->supported[ARB_INTERNALFORMAT_QUERY2]) { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index f3e2d5f..19d1d23 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -783,7 +783,8 @@ enum wined3d_gl_resource_type WINED3D_GL_RES_TYPE_TEX_CUBE = 3, WINED3D_GL_RES_TYPE_TEX_RECT = 4, WINED3D_GL_RES_TYPE_BUFFER = 5, - WINED3D_GL_RES_TYPE_COUNT = 6, + WINED3D_GL_RES_TYPE_RB = 6, + WINED3D_GL_RES_TYPE_COUNT = 7, }; enum vertexprocessing_mode { -- 2.3.6