X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fi915%2Fi915_state.c;h=ddc27098de2533ef52f93f8caa0cd66721bf2b78;hb=19f3141e6ab34dc7389b5e1fa9f3dca5e23b2191;hp=06d4d3bd1aff7551841889282654d29757c9ef99;hpb=eaabb4ead07ae043ecc789024028e225ebd0f318;p=mesa.git diff --git a/src/gallium/drivers/i915/i915_state.c b/src/gallium/drivers/i915/i915_state.c index 06d4d3bd1af..ddc27098de2 100644 --- a/src/gallium/drivers/i915/i915_state.c +++ b/src/gallium/drivers/i915/i915_state.c @@ -1,6 +1,6 @@ /************************************************************************** * - * 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 @@ -18,14 +18,14 @@ * 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 +/* Authors: Keith Whitwell */ @@ -42,6 +42,7 @@ #include "i915_state_inlines.h" #include "i915_fpc.h" #include "i915_resource.h" +#include "i915_state.h" /* The i915 (and related graphics cores) do not support GL_CLAMP. The * Intel drivers for "other operating systems" implement GL_CLAMP as @@ -94,7 +95,6 @@ static unsigned translate_mip_filter( unsigned filter ) } } - /* None of this state is actually used for anything yet. */ static void * @@ -117,10 +117,10 @@ i915_create_blend_state(struct pipe_context *pipe, */ 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 | @@ -131,7 +131,7 @@ i915_create_blend_state(struct pipe_context *pipe, (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); } @@ -147,7 +147,7 @@ i915_create_blend_state(struct pipe_context *pipe, 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; @@ -276,7 +276,7 @@ i915_create_sampler_state(struct pipe_context *pipe, maxlod = CLAMP(maxlod, 0, 16 * 11); if (minlod > maxlod) - maxlod = minlod; + maxlod = minlod; cso->minlod = minlod; cso->maxlod = maxlod; @@ -294,25 +294,31 @@ i915_create_sampler_state(struct pipe_context *pipe, 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 <= ARRAY_SIZE(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, @@ -323,26 +329,53 @@ i915_bind_vertex_sampler_states(struct pipe_context *pipe, 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, + enum pipe_shader_type 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) { @@ -391,7 +424,7 @@ i915_prepare_vertex_sampling(struct i915_context *i915) for (j = view->u.tex.first_level; j <= tex->last_level; j++) { mip_offsets[j] = i915_texture_offset(i915_tex, j , 0 /* FIXME depth */); row_stride[j] = i915_tex->stride; - img_stride[j] = 0; /* FIXME */; + img_stride[j] = 0; /* FIXME */ } draw_set_mapped_texture(i915->draw, @@ -411,7 +444,7 @@ i915_cleanup_vertex_sampling(struct i915_context *i915) { struct i915_winsys *iws = i915->iws; unsigned i; - for (i = 0; i < Elements(i915->mapped_vs_tex); i++) { + for (i = 0; i < ARRAY_SIZE(i915->mapped_vs_tex); i++) { if (i915->mapped_vs_tex_buffer[i]) { iws->buffer_unmap(iws, i915->mapped_vs_tex_buffer[i]); pipe_resource_reference(&i915->mapped_vs_tex[i], NULL); @@ -499,7 +532,7 @@ i915_create_depth_stencil_state(struct pipe_context *pipe, (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) { @@ -596,12 +629,10 @@ void i915_delete_fs_state(struct pipe_context *pipe, void *shader) FREE(ifs->decl); ifs->decl = NULL; - if (ifs->program) { - FREE(ifs->program); - ifs->program = NULL; - FREE((struct tgsi_token *)ifs->state.tokens); - ifs->state.tokens = NULL; - } + FREE(ifs->program); + ifs->program = NULL; + FREE((struct tgsi_token *)ifs->state.tokens); + ifs->state.tokens = NULL; ifs->program_len = 0; ifs->decl_len = 0; @@ -644,8 +675,8 @@ static void i915_delete_vs_state(struct pipe_context *pipe, void *shader) } static void i915_set_constant_buffer(struct pipe_context *pipe, - uint shader, uint index, - struct pipe_constant_buffer *cb) + enum pipe_shader_type shader, uint index, + const struct pipe_constant_buffer *cb) { struct i915_context *i915 = i915_context(pipe); struct pipe_resource *buf = cb ? cb->buffer : NULL; @@ -739,7 +770,7 @@ i915_set_vertex_sampler_views(struct pipe_context *pipe, struct i915_context *i915 = i915_context(pipe); uint i; - assert(num <= Elements(i915->vertex_sampler_views)); + assert(num <= ARRAY_SIZE(i915->vertex_sampler_views)); /* Check for no-op */ if (num == i915->num_vertex_sampler_views && @@ -747,7 +778,7 @@ i915_set_vertex_sampler_views(struct pipe_context *pipe, return; } - for (i = 0; i < Elements(i915->vertex_sampler_views); i++) { + for (i = 0; i < ARRAY_SIZE(i915->vertex_sampler_views); i++) { struct pipe_sampler_view *view = i < num ? views[i] : NULL; pipe_sampler_view_reference(&i915->vertex_sampler_views[i], view); @@ -762,6 +793,45 @@ i915_set_vertex_sampler_views(struct pipe_context *pipe, } +static void +i915_set_sampler_views(struct pipe_context *pipe, enum pipe_shader_type 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: + ; + } +} + + +struct pipe_sampler_view * +i915_create_sampler_view_custom(struct pipe_context *pipe, + struct pipe_resource *texture, + const struct pipe_sampler_view *templ, + unsigned width0, + unsigned height0) +{ + struct pipe_sampler_view *view = CALLOC_STRUCT(pipe_sampler_view); + + if (view) { + *view = *templ; + view->reference.count = 1; + view->texture = NULL; + pipe_resource_reference(&view->texture, texture); + view->context = pipe; + } + + return view; +} + static struct pipe_sampler_view * i915_create_sampler_view(struct pipe_context *pipe, struct pipe_resource *texture, @@ -851,7 +921,6 @@ i915_create_rasterizer_state(struct pipe_context *pipe, struct i915_rasterizer_state *cso = CALLOC_STRUCT( i915_rasterizer_state ); cso->templ = *rasterizer; - cso->color_interp = rasterizer->flatshade ? INTERP_CONSTANT : INTERP_LINEAR; cso->light_twoside = rasterizer->light_twoside; cso->ds[0].u = _3DSTATE_DEPTH_OFFSET_SCALE; cso->ds[1].f = rasterizer->offset_scale; @@ -991,17 +1060,6 @@ i915_delete_vertex_elements_state(struct pipe_context *pipe, void *velems) FREE( velems ); } -static void i915_set_index_buffer(struct pipe_context *pipe, - const struct pipe_index_buffer *ib) -{ - struct i915_context *i915 = i915_context(pipe); - - if (ib) - memcpy(&i915->index_buffer, ib, sizeof(i915->index_buffer)); - else - memset(&i915->index_buffer, 0, sizeof(i915->index_buffer)); -} - static void i915_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask) @@ -1016,8 +1074,7 @@ i915_init_state_functions( struct i915_context *i915 ) 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; @@ -1046,11 +1103,9 @@ i915_init_state_functions( struct i915_context *i915 ) i915->base.set_polygon_stipple = i915_set_polygon_stipple; i915->base.set_scissor_states = i915_set_scissor_states; - 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_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_states = i915_set_viewport_states; i915->base.set_vertex_buffers = i915_set_vertex_buffers; - i915->base.set_index_buffer = i915_set_index_buffer; }