summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorAxel Davy <[email protected]>2015-01-19 17:13:57 +0100
committerAxel Davy <[email protected]>2015-02-06 00:07:19 +0100
commit1543defc5ea8a17cf5558bb6468031f9c29b9a15 (patch)
treecad602eac7521c1b388009f4b6bed393bd3434eb /src/gallium
parent49214a3dfc4f5173e22846d92c5dd0c2b24e3638 (diff)
st/nine: Fix depth stencil formats bindings flags.
Reviewed-by: Tiziano Bacocco <[email protected]> Signed-off-by: Axel Davy <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/state_trackers/nine/adapter9.c26
-rw-r--r--src/gallium/state_trackers/nine/device9.c4
-rw-r--r--src/gallium/state_trackers/nine/nine_pipe.h51
-rw-r--r--src/gallium/state_trackers/nine/swapchain9.c20
4 files changed, 74 insertions, 27 deletions
diff --git a/src/gallium/state_trackers/nine/adapter9.c b/src/gallium/state_trackers/nine/adapter9.c
index 459aac3695f..e9bb9c08ee9 100644
--- a/src/gallium/state_trackers/nine/adapter9.c
+++ b/src/gallium/state_trackers/nine/adapter9.c
@@ -385,29 +385,6 @@ NineAdapter9_CheckDeviceMultiSampleType( struct NineAdapter9 *This,
return D3D_OK;
}
-static INLINE boolean
-depth_stencil_format( D3DFORMAT fmt )
-{
- static D3DFORMAT allowed[] = {
- D3DFMT_D16_LOCKABLE,
- D3DFMT_D32,
- D3DFMT_D15S1,
- D3DFMT_D24S8,
- D3DFMT_D24X8,
- D3DFMT_D24X4S4,
- D3DFMT_D16,
- D3DFMT_D32F_LOCKABLE,
- D3DFMT_D24FS8,
- D3DFMT_D32_LOCKABLE
- };
- unsigned i;
-
- for (i = 0; i < sizeof(allowed)/sizeof(D3DFORMAT); i++) {
- if (fmt == allowed[i]) { return TRUE; }
- }
- return FALSE;
-}
-
HRESULT WINAPI
NineAdapter9_CheckDepthStencilMatch( struct NineAdapter9 *This,
D3DDEVTYPE DeviceType,
@@ -441,7 +418,8 @@ NineAdapter9_CheckDepthStencilMatch( struct NineAdapter9 *This,
bfmt = dfmt;
zsfmt = d3d9_to_pipe_format_checked(screen, DepthStencilFormat,
PIPE_TEXTURE_2D, 0,
- PIPE_BIND_DEPTH_STENCIL, FALSE);
+ d3d9_get_pipe_depth_format_bindings(DepthStencilFormat),
+ FALSE);
if (dfmt == PIPE_FORMAT_NONE ||
bfmt == PIPE_FORMAT_NONE ||
zsfmt == PIPE_FORMAT_NONE) {
diff --git a/src/gallium/state_trackers/nine/device9.c b/src/gallium/state_trackers/nine/device9.c
index dfec5f91770..fe251fe3ce0 100644
--- a/src/gallium/state_trackers/nine/device9.c
+++ b/src/gallium/state_trackers/nine/device9.c
@@ -971,7 +971,7 @@ create_zs_or_rt_surface(struct NineDevice9 *This,
templ.bind = PIPE_BIND_SAMPLER_VIEW; /* StretchRect */
switch (type) {
case 0: templ.bind |= PIPE_BIND_RENDER_TARGET; break;
- case 1: templ.bind |= PIPE_BIND_DEPTH_STENCIL; break;
+ case 1: templ.bind = d3d9_get_pipe_depth_format_bindings(Format); break;
default:
assert(type == 2);
break;
@@ -1042,6 +1042,8 @@ NineDevice9_CreateDepthStencilSurface( struct NineDevice9 *This,
HANDLE *pSharedHandle )
{
*ppSurface = NULL;
+ if (!depth_stencil_format(Format))
+ return D3DERR_NOTAVAILABLE;
return create_zs_or_rt_surface(This, 1, D3DPOOL_DEFAULT,
Width, Height, Format,
MultiSample, MultisampleQuality,
diff --git a/src/gallium/state_trackers/nine/nine_pipe.h b/src/gallium/state_trackers/nine/nine_pipe.h
index 9521d1a6542..7295bdf9c6e 100644
--- a/src/gallium/state_trackers/nine/nine_pipe.h
+++ b/src/gallium/state_trackers/nine/nine_pipe.h
@@ -175,6 +175,57 @@ pipe_to_d3d9_format(enum pipe_format format)
return nine_pipe_to_d3d9_format_map[format];
}
+static INLINE boolean
+depth_stencil_format( D3DFORMAT fmt )
+{
+ static D3DFORMAT allowed[] = {
+ D3DFMT_D16_LOCKABLE,
+ D3DFMT_D32,
+ D3DFMT_D15S1,
+ D3DFMT_D24S8,
+ D3DFMT_D24X8,
+ D3DFMT_D24X4S4,
+ D3DFMT_D16,
+ D3DFMT_D32F_LOCKABLE,
+ D3DFMT_D24FS8,
+ D3DFMT_D32_LOCKABLE,
+ D3DFMT_DF16,
+ D3DFMT_DF24,
+ D3DFMT_INTZ
+ };
+ unsigned i;
+
+ for (i = 0; i < sizeof(allowed)/sizeof(D3DFORMAT); i++) {
+ if (fmt == allowed[i]) { return TRUE; }
+ }
+ return FALSE;
+}
+
+static INLINE unsigned
+d3d9_get_pipe_depth_format_bindings(D3DFORMAT format)
+{
+ switch (format) {
+ case D3DFMT_D32:
+ case D3DFMT_D15S1:
+ case D3DFMT_D24S8:
+ case D3DFMT_D24X8:
+ case D3DFMT_D24X4S4:
+ case D3DFMT_D16:
+ case D3DFMT_D24FS8:
+ return PIPE_BIND_DEPTH_STENCIL;
+ case D3DFMT_D32F_LOCKABLE:
+ case D3DFMT_D16_LOCKABLE:
+ case D3DFMT_D32_LOCKABLE:
+ return PIPE_BIND_DEPTH_STENCIL | PIPE_BIND_TRANSFER_READ |
+ PIPE_BIND_TRANSFER_WRITE;
+ case D3DFMT_DF16:
+ case D3DFMT_DF24:
+ case D3DFMT_INTZ:
+ return PIPE_BIND_DEPTH_STENCIL | PIPE_BIND_SAMPLER_VIEW;
+ default: assert(0);
+ }
+}
+
static INLINE enum pipe_format
d3d9_to_pipe_format_internal(D3DFORMAT format)
{
diff --git a/src/gallium/state_trackers/nine/swapchain9.c b/src/gallium/state_trackers/nine/swapchain9.c
index 03ed24ee6c8..296d6dcd474 100644
--- a/src/gallium/state_trackers/nine/swapchain9.c
+++ b/src/gallium/state_trackers/nine/swapchain9.c
@@ -341,8 +341,14 @@ NineSwapChain9_Resize( struct NineSwapChain9 *This,
pipe_resource_reference(&resource, NULL);
}
if (pParams->EnableAutoDepthStencil) {
- tmplt.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_TRANSFER_READ |
- PIPE_BIND_TRANSFER_WRITE | PIPE_BIND_DEPTH_STENCIL;
+ tmplt.bind = d3d9_get_pipe_depth_format_bindings(pParams->AutoDepthStencilFormat);
+ /* Checking the d3d9 depth format for texture support indicates the app if it can use
+ * the format for shadow mapping or texturing. If the check returns true, then the app
+ * is allowed to use this functionnality, so try first to create the buffer
+ * with PIPE_BIND_SAMPLER_VIEW. If the format can't be created with it, try without.
+ * If it fails with PIPE_BIND_SAMPLER_VIEW, then the app check for texture support
+ * would fail too, so we are fine. */
+ tmplt.bind |= PIPE_BIND_SAMPLER_VIEW;
tmplt.nr_samples = pParams->MultiSampleType;
tmplt.format = d3d9_to_pipe_format_checked(This->screen,
pParams->AutoDepthStencilFormat,
@@ -350,6 +356,16 @@ NineSwapChain9_Resize( struct NineSwapChain9 *This,
tmplt.nr_samples,
tmplt.bind,
FALSE);
+ if (tmplt.format == PIPE_FORMAT_NONE) {
+ tmplt.bind &= ~PIPE_BIND_SAMPLER_VIEW;
+ tmplt.format = d3d9_to_pipe_format_checked(This->screen,
+ pParams->AutoDepthStencilFormat,
+ PIPE_TEXTURE_2D,
+ tmplt.nr_samples,
+ tmplt.bind,
+ FALSE);
+ }
+
if (tmplt.format == PIPE_FORMAT_NONE)
return D3DERR_INVALIDCALL;