/**************************************************************************
*
- * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * Copyright 2007 VMware, Inc.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
**************************************************************************/
-/* Authors: Keith Whitwell <keith@tungstengraphics.com>
+/* Authors: Keith Whitwell <keithw@vmware.com>
*/
}
}
-
/* None of this state is actually used for anything yet.
*/
static void *
*/
if (srcA != srcRGB ||
- dstA != dstRGB ||
- eqA != eqRGB) {
+ dstA != dstRGB ||
+ eqA != eqRGB) {
- cso_data->iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
+ cso_data->iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
IAB_MODIFY_ENABLE |
IAB_ENABLE |
IAB_MODIFY_FUNC |
(i915_translate_blend_func(eqA) << IAB_FUNC_SHIFT));
}
else {
- cso_data->iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
+ cso_data->iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
IAB_MODIFY_ENABLE |
0);
}
if (blend->dither)
cso_data->LIS5 |= S5_COLOR_DITHER_ENABLE;
- /* XXX here take the target fixup into account */
+ /* We potentially do some fixup at emission for non-BGRA targets */
if ((blend->rt[0].colormask & PIPE_MASK_R) == 0)
cso_data->LIS5 |= S5_WRITEDISABLE_RED;
maxlod = CLAMP(maxlod, 0, 16 * 11);
if (minlod > maxlod)
- maxlod = minlod;
+ maxlod = minlod;
cso->minlod = minlod;
cso->maxlod = maxlod;
static void
i915_bind_vertex_sampler_states(struct pipe_context *pipe,
- unsigned num_samplers,
+ unsigned start,
+ unsigned num,
void **samplers)
{
struct i915_context *i915 = i915_context(pipe);
unsigned i;
- assert(num_samplers <= Elements(i915->vertex_samplers));
+ assert(start + num <= Elements(i915->vertex_samplers));
/* Check for no-op */
- if (num_samplers == i915->num_vertex_samplers &&
- !memcmp(i915->vertex_samplers, samplers, num_samplers * sizeof(void *)))
+ if (num == i915->num_vertex_samplers &&
+ !memcmp(i915->vertex_samplers + start, samplers,
+ num * sizeof(void *)))
return;
- for (i = 0; i < num_samplers; ++i)
- i915->vertex_samplers[i] = samplers[i];
- for (i = num_samplers; i < Elements(i915->vertex_samplers); ++i)
- i915->vertex_samplers[i] = NULL;
+ for (i = 0; i < num; ++i)
+ i915->vertex_samplers[i + start] = samplers[i];
- i915->num_vertex_samplers = num_samplers;
+ /* find highest non-null samplers[] entry */
+ {
+ unsigned j = MAX2(i915->num_vertex_samplers, start + num);
+ while (j > 0 && i915->vertex_samplers[j - 1] == NULL)
+ j--;
+ i915->num_vertex_samplers = j;
+ }
draw_set_samplers(i915->draw,
PIPE_SHADER_VERTEX,
static void i915_bind_fragment_sampler_states(struct pipe_context *pipe,
- unsigned num, void **sampler)
+ unsigned start,
+ unsigned num,
+ void **samplers)
{
struct i915_context *i915 = i915_context(pipe);
unsigned i;
/* Check for no-op */
if (num == i915->num_samplers &&
- !memcmp(i915->sampler, sampler, num * sizeof(void *)))
+ !memcmp(i915->fragment_sampler + start, samplers,
+ num * sizeof(void *)))
return;
for (i = 0; i < num; ++i)
- i915->sampler[i] = sampler[i];
- for (i = num; i < PIPE_MAX_SAMPLERS; ++i)
- i915->sampler[i] = NULL;
+ i915->fragment_sampler[i + start] = samplers[i];
- i915->num_samplers = num;
+ /* find highest non-null samplers[] entry */
+ {
+ unsigned j = MAX2(i915->num_samplers, start + num);
+ while (j > 0 && i915->fragment_sampler[j - 1] == NULL)
+ j--;
+ i915->num_samplers = j;
+ }
i915->dirty |= I915_NEW_SAMPLER;
}
+
+static void
+i915_bind_sampler_states(struct pipe_context *pipe, unsigned shader,
+ unsigned start, unsigned num_samplers,
+ void **samplers)
+{
+ switch (shader) {
+ case PIPE_SHADER_VERTEX:
+ i915_bind_vertex_sampler_states(pipe, start, num_samplers, samplers);
+ break;
+ case PIPE_SHADER_FRAGMENT:
+ i915_bind_fragment_sampler_states(pipe, start, num_samplers, samplers);
+ break;
+ default:
+ ;
+ }
+}
+
+
static void i915_delete_sampler_state(struct pipe_context *pipe,
void *sampler)
{
unsigned i,j;
uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS];
uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS];
- const void* data[PIPE_MAX_TEXTURE_LEVELS];
+ uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS];
unsigned num = i915->num_vertex_sampler_views;
struct pipe_sampler_view **views = i915->vertex_sampler_views;
*/
pipe_resource_reference(&i915->mapped_vs_tex[i], tex);
- i915->mapped_vs_tex_buffer[i] = i915_tex->buffer;
+ i915->mapped_vs_tex_buffer[i] = i915_tex->buffer;
addr = iws->buffer_map(iws,
i915_tex->buffer,
FALSE /* read only */);
/* Setup array of mipmap level pointers */
- /* FIXME: handle 3D textures? */
+ /* FIXME: handle 3D textures? */
for (j = view->u.tex.first_level; j <= tex->last_level; j++) {
- unsigned offset = i915_texture_offset(i915_tex, j , 0 /* FIXME depth */);
- data[j] = addr + offset;
+ mip_offsets[j] = i915_texture_offset(i915_tex, j , 0 /* FIXME depth */);
row_stride[j] = i915_tex->stride;
img_stride[j] = 0; /* FIXME */;
}
i,
tex->width0, tex->height0, tex->depth0,
view->u.tex.first_level, tex->last_level,
- row_stride, img_stride, data);
+ addr,
+ row_stride, img_stride, mip_offsets);
} else
i915->mapped_vs_tex[i] = NULL;
}
(func << S6_DEPTH_TEST_FUNC_SHIFT));
if (depth_stencil->depth.writemask)
- cso->depth_LIS6 |= S6_DEPTH_WRITE_ENABLE;
+ cso->depth_LIS6 |= S6_DEPTH_WRITE_ENABLE;
}
if (depth_stencil->alpha.enabled) {
}
-static void i915_set_scissor_state( struct pipe_context *pipe,
+static void i915_set_scissor_states( struct pipe_context *pipe,
+ unsigned start_slot,
+ unsigned num_scissors,
const struct pipe_scissor_state *scissor )
{
struct i915_context *i915 = i915_context(pipe);
!memcmp(i915->fragment_sampler_views, views, num * sizeof(struct pipe_sampler_view *)))
return;
- for (i = 0; i < num; i++)
+ for (i = 0; i < num; i++) {
+ /* Note: we're using pipe_sampler_view_release() here to work around
+ * a possible crash when the old view belongs to another context that
+ * was already destroyed.
+ */
+ pipe_sampler_view_release(pipe, &i915->fragment_sampler_views[i]);
pipe_sampler_view_reference(&i915->fragment_sampler_views[i],
views[i]);
+ }
for (i = num; i < i915->num_fragment_sampler_views; i++)
- pipe_sampler_view_reference(&i915->fragment_sampler_views[i],
- NULL);
+ pipe_sampler_view_release(pipe, &i915->fragment_sampler_views[i]);
i915->num_fragment_sampler_views = num;
}
+static void
+i915_set_sampler_views(struct pipe_context *pipe, unsigned shader,
+ unsigned start, unsigned num,
+ struct pipe_sampler_view **views)
+{
+ assert(start == 0);
+ switch (shader) {
+ case PIPE_SHADER_FRAGMENT:
+ i915_set_fragment_sampler_views(pipe, num, views);
+ break;
+ case PIPE_SHADER_VERTEX:
+ i915_set_vertex_sampler_views(pipe, num, views);
+ break;
+ default:
+ ;
+ }
+}
+
+
static struct pipe_sampler_view *
i915_create_sampler_view(struct pipe_context *pipe,
struct pipe_resource *texture,
/* Called when driver state tracker notices changes to the viewport
* matrix:
*/
-static void i915_set_viewport_state( struct pipe_context *pipe,
+static void i915_set_viewport_states( struct pipe_context *pipe,
+ unsigned start_slot,
+ unsigned num_viewports,
const struct pipe_viewport_state *viewport )
{
struct i915_context *i915 = i915_context(pipe);
i915->viewport = *viewport; /* struct copy */
/* pass the viewport info to the draw module */
- draw_set_viewport_state(i915->draw, &i915->viewport);
+ draw_set_viewport_states(i915->draw, start_slot, num_viewports,
+ &i915->viewport);
i915->dirty |= I915_NEW_VIEWPORT;
}
i915->base.delete_blend_state = i915_delete_blend_state;
i915->base.create_sampler_state = i915_create_sampler_state;
- i915->base.bind_fragment_sampler_states = i915_bind_fragment_sampler_states;
- i915->base.bind_vertex_sampler_states = i915_bind_vertex_sampler_states;
+ i915->base.bind_sampler_states = i915_bind_sampler_states;
i915->base.delete_sampler_state = i915_delete_sampler_state;
i915->base.create_depth_stencil_alpha_state = i915_create_depth_stencil_state;
i915->base.set_framebuffer_state = i915_set_framebuffer_state;
i915->base.set_polygon_stipple = i915_set_polygon_stipple;
- i915->base.set_scissor_state = i915_set_scissor_state;
- i915->base.set_fragment_sampler_views = i915_set_fragment_sampler_views;
- i915->base.set_vertex_sampler_views = i915_set_vertex_sampler_views;
+ i915->base.set_scissor_states = i915_set_scissor_states;
+ i915->base.set_sampler_views = i915_set_sampler_views;
i915->base.create_sampler_view = i915_create_sampler_view;
i915->base.sampler_view_destroy = i915_sampler_view_destroy;
- i915->base.set_viewport_state = i915_set_viewport_state;
+ i915->base.set_viewport_states = i915_set_viewport_states;
i915->base.set_vertex_buffers = i915_set_vertex_buffers;
i915->base.set_index_buffer = i915_set_index_buffer;
}