Mesa (master): d3d1x: don' t crash on drivers not supporting vertex or geometry sampling
Luca Barbieri
lb at kemper.freedesktop.org
Fri Sep 24 13:12:44 UTC 2010
Module: Mesa
Branch: master
Commit: f1063cfee213ba92f7c9e34199caccf4bed78c1c
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f1063cfee213ba92f7c9e34199caccf4bed78c1c
Author: Luca Barbieri <luca at luca-barbieri.com>
Date: Fri Sep 24 14:28:31 2010 +0200
d3d1x: don't crash on drivers not supporting vertex or geometry sampling
---
src/gallium/state_trackers/d3d1x/gd3d11/d3d11.cpp | 1 +
.../state_trackers/d3d1x/gd3d11/d3d11_context.h | 10 ++++++++--
.../state_trackers/d3d1x/gd3d11/d3d11_screen.h | 4 ++++
3 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/src/gallium/state_trackers/d3d1x/gd3d11/d3d11.cpp b/src/gallium/state_trackers/d3d1x/gd3d11/d3d11.cpp
index 42678fa..27cfebc 100644
--- a/src/gallium/state_trackers/d3d1x/gd3d11/d3d11.cpp
+++ b/src/gallium/state_trackers/d3d1x/gd3d11/d3d11.cpp
@@ -125,6 +125,7 @@ struct GalliumD3D11Caps
bool render_condition;
unsigned constant_buffers[D3D11_STAGES];
unsigned stages;
+ unsigned stages_with_sampling;
};
typedef GalliumDXGIDevice<
diff --git a/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_context.h b/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_context.h
index d7c1c92..4abb4ac 100644
--- a/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_context.h
+++ b/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_context.h
@@ -158,6 +158,12 @@ struct GalliumD3D10Device : public GalliumD3D10ScreenImpl<threadsafe>
}
if(!pipe->set_stream_output_buffers)
caps.so = false;
+ if(!pipe->set_geometry_sampler_views)
+ caps.stages_with_sampling &=~ (1 << PIPE_SHADER_GEOMETRY);
+ if(!pipe->set_fragment_sampler_views)
+ caps.stages_with_sampling &=~ (1 << PIPE_SHADER_FRAGMENT);
+ if(!pipe->set_vertex_sampler_views)
+ caps.stages_with_sampling &=~ (1 << PIPE_SHADER_VERTEX);
update_flags = 0;
@@ -505,7 +511,7 @@ struct GalliumD3D10Device : public GalliumD3D10ScreenImpl<threadsafe>
{
while(num_shader_resource_views[s] && !sampler_views[s][num_shader_resource_views[s] - 1]) \
--num_shader_resource_views[s];
- if(s < caps.stages)
+ if((1 << s) & caps.stages_with_sampling)
{
struct pipe_sampler_view* views_to_bind[PIPE_MAX_SAMPLERS];
unsigned num_views_to_bind = shaders[s] ? shaders[s]->slot_to_resource.size() : 0;
@@ -532,7 +538,7 @@ struct GalliumD3D10Device : public GalliumD3D10ScreenImpl<threadsafe>
{
while(num_samplers[s] && !sampler_csos[s].v[num_samplers[s] - 1])
--num_samplers[s];
- if(s < caps.stages)
+ if((1 << s) & caps.stages_with_sampling)
{
void* samplers_to_bind[PIPE_MAX_SAMPLERS];
unsigned num_samplers_to_bind = shaders[s] ? shaders[s]->slot_to_sampler.size() : 0;
diff --git a/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_screen.h b/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_screen.h
index 528d32c..1ecd67c 100644
--- a/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_screen.h
+++ b/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_screen.h
@@ -101,6 +101,10 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
screen_caps.stages = i + 1;
}
+ screen_caps.stages_with_sampling = (1 << screen_caps.stages) - 1;
+ if(!screen->get_param(screen, PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS))
+ screen_caps.stages_with_sampling &=~ (1 << PIPE_SHADER_VERTEX);
+
memset(format_support, 0xff, sizeof(format_support));
float default_level;
More information about the mesa-commit
mailing list