summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAxel Davy <[email protected]>2014-12-07 16:51:49 +0100
committerEmil Velikov <[email protected]>2015-01-22 22:16:18 +0000
commit0abfb80dacf80c1f2d0a6a4142b9ab84695aa9e7 (patch)
tree35b5d8b4d2602ceee24a2499c5b7a3d17509b7f7
parent0d2c22e64844e20f9a52bffe2b934079a4121886 (diff)
st/nine: Return D3DERR_INVALIDCALL when trying to create a texture of bad format
Reviewed-by: Ilia Mirkin <[email protected]> Reviewed-by: David Heidelberg <[email protected]> Signed-off-by: Axel Davy <[email protected]>
-rw-r--r--src/gallium/state_trackers/nine/cubetexture9.c10
-rw-r--r--src/gallium/state_trackers/nine/texture9.c9
-rw-r--r--src/gallium/state_trackers/nine/volumetexture9.c10
3 files changed, 26 insertions, 3 deletions
diff --git a/src/gallium/state_trackers/nine/cubetexture9.c b/src/gallium/state_trackers/nine/cubetexture9.c
index 2c607c06799..bb1219aa88f 100644
--- a/src/gallium/state_trackers/nine/cubetexture9.c
+++ b/src/gallium/state_trackers/nine/cubetexture9.c
@@ -38,6 +38,8 @@ NineCubeTexture9_ctor( struct NineCubeTexture9 *This,
HANDLE *pSharedHandle )
{
struct pipe_resource *info = &This->base.base.info;
+ struct pipe_screen *screen = pParams->device->screen;
+ enum pipe_format pf;
unsigned i;
D3DSURFACE_DESC sfdesc;
HRESULT hr;
@@ -55,9 +57,15 @@ NineCubeTexture9_ctor( struct NineCubeTexture9 *This,
if (Usage & D3DUSAGE_AUTOGENMIPMAP)
Levels = 0;
+ pf = d3d9_to_pipe_format(Format);
+ if (pf == PIPE_FORMAT_NONE ||
+ !screen->is_format_supported(screen, pf, PIPE_TEXTURE_CUBE, 0, PIPE_BIND_SAMPLER_VIEW)) {
+ return D3DERR_INVALIDCALL;
+ }
+
info->screen = pParams->device->screen;
info->target = PIPE_TEXTURE_CUBE;
- info->format = d3d9_to_pipe_format(Format);
+ info->format = pf;
info->width0 = EdgeLength;
info->height0 = EdgeLength;
info->depth0 = 1;
diff --git a/src/gallium/state_trackers/nine/texture9.c b/src/gallium/state_trackers/nine/texture9.c
index 8852142c8e7..4d7e950e2ca 100644
--- a/src/gallium/state_trackers/nine/texture9.c
+++ b/src/gallium/state_trackers/nine/texture9.c
@@ -47,6 +47,7 @@ NineTexture9_ctor( struct NineTexture9 *This,
struct pipe_screen *screen = pParams->device->screen;
struct pipe_resource *info = &This->base.base.info;
struct pipe_resource *resource;
+ enum pipe_format pf;
unsigned l;
D3DSURFACE_DESC sfdesc;
HRESULT hr;
@@ -92,9 +93,15 @@ NineTexture9_ctor( struct NineTexture9 *This,
if (Usage & D3DUSAGE_AUTOGENMIPMAP)
Levels = 0;
+ pf = d3d9_to_pipe_format(Format);
+ if (Format != D3DFMT_NULL && (pf == PIPE_FORMAT_NONE ||
+ !screen->is_format_supported(screen, pf, PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW))) {
+ return D3DERR_INVALIDCALL;
+ }
+
info->screen = screen;
info->target = PIPE_TEXTURE_2D;
- info->format = d3d9_to_pipe_format(Format);
+ info->format = pf;
info->width0 = Width;
info->height0 = Height;
info->depth0 = 1;
diff --git a/src/gallium/state_trackers/nine/volumetexture9.c b/src/gallium/state_trackers/nine/volumetexture9.c
index 9366dc95a14..f116899bcef 100644
--- a/src/gallium/state_trackers/nine/volumetexture9.c
+++ b/src/gallium/state_trackers/nine/volumetexture9.c
@@ -37,6 +37,8 @@ NineVolumeTexture9_ctor( struct NineVolumeTexture9 *This,
HANDLE *pSharedHandle )
{
struct pipe_resource *info = &This->base.base.info;
+ struct pipe_screen *screen = pParams->device->screen;
+ enum pipe_format pf;
unsigned l;
D3DVOLUME_DESC voldesc;
HRESULT hr;
@@ -57,9 +59,15 @@ NineVolumeTexture9_ctor( struct NineVolumeTexture9 *This,
if (Usage & D3DUSAGE_AUTOGENMIPMAP)
Levels = 0;
+ pf = d3d9_to_pipe_format(Format);
+ if (pf == PIPE_FORMAT_NONE ||
+ !screen->is_format_supported(screen, pf, PIPE_TEXTURE_3D, 0, PIPE_BIND_SAMPLER_VIEW)) {
+ return D3DERR_INVALIDCALL;
+ }
+
info->screen = pParams->device->screen;
info->target = PIPE_TEXTURE_3D;
- info->format = d3d9_to_pipe_format(Format);
+ info->format = pf;
info->width0 = Width;
info->height0 = Height;
info->depth0 = Depth;