summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/i965/brw_wm_sampler_state.c
diff options
context:
space:
mode:
authorKeith Whitwell <keithw@vmware.com>2009-11-05 13:57:05 +0000
committerKeith Whitwell <keithw@vmware.com>2009-11-05 14:01:37 +0000
commitc796aed5ddad011d66e631c4cafdbf779e73f213 (patch)
treed8a510233b281c9d6a0690632948f10a03819a84 /src/gallium/drivers/i965/brw_wm_sampler_state.c
parent31b8b1dd36d9f07a7893a89ee985d83c4d0bb95b (diff)
i965g: add lots of error checks and early returns
Any allocation that may fail should be checked, and propogate the error upwards. At the highest level we will flush batch and retry. This is an alternate strategy to what the original DRI driver did of attempting to flush batch from the lowest levels (eg inside BEGIN_BATCH). The trouble with that strategy was that flushes could occur at unexpected times, and additionally there was a need for a wierd notification mechanism to propogate the 'lost context' state back up to higher levels. Propogating the errors directly gives us a lot of flexibility how to deal with these states, at the expense of a lot more checking in the code. Will add some sanity checks later to make sure that out-of-memory conditions are properly escalated and not lost halfway up the stack.
Diffstat (limited to 'src/gallium/drivers/i965/brw_wm_sampler_state.c')
-rw-r--r--src/gallium/drivers/i965/brw_wm_sampler_state.c98
1 files changed, 60 insertions, 38 deletions
diff --git a/src/gallium/drivers/i965/brw_wm_sampler_state.c b/src/gallium/drivers/i965/brw_wm_sampler_state.c
index 2fddb4ad89..2861aa979f 100644
--- a/src/gallium/drivers/i965/brw_wm_sampler_state.c
+++ b/src/gallium/drivers/i965/brw_wm_sampler_state.c
@@ -43,16 +43,22 @@
-static struct brw_winsys_buffer *
+static enum pipe_error
upload_default_color( struct brw_context *brw,
- const GLfloat *color )
+ const GLfloat *color,
+ struct brw_winsys_buffer **bo_out )
{
struct brw_sampler_default_color sdc;
+ enum pipe_error ret;
COPY_4V(sdc.color, color);
- return brw_cache_data( &brw->cache, BRW_SAMPLER_DEFAULT_COLOR, &sdc,
- NULL, 0 );
+ ret = brw_cache_data( &brw->cache, BRW_SAMPLER_DEFAULT_COLOR, &sdc,
+ NULL, 0, bo_out );
+ if (ret)
+ return ret;
+
+ return PIPE_OK;
}
@@ -111,9 +117,10 @@ brw_wm_sampler_populate_key(struct brw_context *brw,
}
-static void
+static enum pipe_error
brw_wm_sampler_update_default_colors(struct brw_context *brw)
{
+ enum pipe_error ret;
int nr = MIN2(brw->curr.num_textures,
brw->curr.num_samplers);
int i;
@@ -121,8 +128,7 @@ brw_wm_sampler_update_default_colors(struct brw_context *brw)
for (i = 0; i < nr; i++) {
const struct brw_texture *tex = brw_texture(brw->curr.texture[i]);
const struct brw_sampler *sampler = brw->curr.sampler[i];
-
- brw->sws->bo_unreference(brw->wm.sdc_bo[i]);
+ const float *bc;
if (pf_is_depth_or_stencil(tex->base.format)) {
float bordercolor[4] = {
@@ -131,15 +137,25 @@ brw_wm_sampler_update_default_colors(struct brw_context *brw)
sampler->border_color[0],
sampler->border_color[0]
};
- /* GL specs that border color for depth textures is taken from the
- * R channel, while the hardware uses A. Spam R into all the
- * channels for safety.
- */
- brw->wm.sdc_bo[i] = upload_default_color(brw, bordercolor);
- } else {
- brw->wm.sdc_bo[i] = upload_default_color(brw, sampler->border_color);
+
+ bc = bordercolor;
+ }
+ else {
+ bc = sampler->border_color;
}
+
+ /* GL specs that border color for depth textures is taken from the
+ * R channel, while the hardware uses A. Spam R into all the
+ * channels for safety.
+ */
+ ret = upload_default_color(brw,
+ bc,
+ &brw->wm.sdc_bo[i]);
+ if (ret)
+ return ret;
}
+
+ return PIPE_OK;
}
@@ -149,6 +165,7 @@ brw_wm_sampler_update_default_colors(struct brw_context *brw)
static int upload_wm_samplers( struct brw_context *brw )
{
struct wm_sampler_key key;
+ enum pipe_error ret;
int i;
brw_wm_sampler_update_default_colors(brw);
@@ -159,35 +176,40 @@ static int upload_wm_samplers( struct brw_context *brw )
brw->state.dirty.cache |= CACHE_NEW_SAMPLER;
}
- brw->sws->bo_unreference(brw->wm.sampler_bo);
- brw->wm.sampler_bo = NULL;
- if (brw->wm.sampler_count == 0)
- return 0;
+ if (brw->wm.sampler_count == 0) {
+ bo_reference(&brw->wm.sampler_bo, NULL);
+ return PIPE_OK;
+ }
- brw->wm.sampler_bo = brw_search_cache(&brw->cache, BRW_SAMPLER,
- &key, sizeof(key),
- brw->wm.sdc_bo, key.sampler_count,
- NULL);
+ if (brw_search_cache(&brw->cache, BRW_SAMPLER,
+ &key, sizeof(key),
+ brw->wm.sdc_bo, key.sampler_count,
+ NULL,
+ &brw->wm.sampler_bo))
+ return PIPE_OK;
/* If we didnt find it in the cache, compute the state and put it in the
* cache.
*/
- if (brw->wm.sampler_bo == NULL) {
- brw->wm.sampler_bo = brw_upload_cache(&brw->cache, BRW_SAMPLER,
- &key, sizeof(key),
- brw->wm.sdc_bo, key.sampler_count,
- &key.sampler, sizeof(key.sampler),
- NULL, NULL);
-
- /* Emit SDC relocations */
- for (i = 0; i < key.sampler_count; i++) {
- brw->sws->bo_emit_reloc(brw->wm.sampler_bo,
- BRW_USAGE_SAMPLER,
- 0,
- i * sizeof(struct brw_sampler_state) +
- offsetof(struct brw_sampler_state, ss2),
- brw->wm.sdc_bo[i]);
- }
+ ret = brw_upload_cache(&brw->cache, BRW_SAMPLER,
+ &key, sizeof(key),
+ brw->wm.sdc_bo, key.sampler_count,
+ &key.sampler, sizeof(key.sampler),
+ NULL, NULL,
+ &brw->wm.sampler_bo);
+ if (ret)
+ return ret;
+
+ /* Emit SDC relocations */
+ for (i = 0; i < key.sampler_count; i++) {
+ ret = brw->sws->bo_emit_reloc(brw->wm.sampler_bo,
+ BRW_USAGE_SAMPLER,
+ 0,
+ i * sizeof(struct brw_sampler_state) +
+ offsetof(struct brw_sampler_state, ss2),
+ brw->wm.sdc_bo[i]);
+ if (ret)
+ return ret;
}
return 0;