From: Brian Paul Date: Fri, 13 Sep 2013 00:09:33 +0000 (-0600) Subject: nouveau: implement pipe_context::bind_sampler_states() X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3f0627c2ad605b006737312c478907859411ffa8;p=mesa.git nouveau: implement pipe_context::bind_sampler_states() --- diff --git a/src/gallium/drivers/nouveau/nv30/nv30_context.h b/src/gallium/drivers/nouveau/nv30/nv30_context.h index 12ae0c71e4f..292dcfe61a4 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_context.h +++ b/src/gallium/drivers/nouveau/nv30/nv30_context.h @@ -186,6 +186,14 @@ nv40_verttex_init(struct pipe_context *pipe); void nv40_verttex_validate(struct nv30_context *nv30); +void +nv30_fragtex_sampler_states_bind(struct pipe_context *pipe, + unsigned nr, void **hwcso); + +void +nv40_verttex_sampler_states_bind(struct pipe_context *pipe, + unsigned nr, void **hwcso); + void nv30_push_vbo(struct nv30_context *nv30, const struct pipe_draw_info *info); diff --git a/src/gallium/drivers/nouveau/nv30/nv30_fragtex.c b/src/gallium/drivers/nouveau/nv30/nv30_fragtex.c index 60ffb03c89f..ac819786a6c 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_fragtex.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_fragtex.c @@ -149,7 +149,7 @@ nv30_fragtex_validate(struct nv30_context *nv30) nv30->fragprog.dirty_samplers = 0; } -static void +void nv30_fragtex_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **hwcso) { diff --git a/src/gallium/drivers/nouveau/nv30/nv30_texture.c b/src/gallium/drivers/nouveau/nv30/nv30_texture.c index d3cffcfb261..c3567217442 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_texture.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_texture.c @@ -186,6 +186,21 @@ nv30_sampler_state_delete(struct pipe_context *pipe, void *hwcso) FREE(hwcso); } +static void +nv30_bind_sampler_states(struct pipe_context *pipe, + unsigned shader, unsigned start_slot, + unsigned num_samplers, void **samplers) +{ + switch (shader) { + case PIPE_SHADER_VERTEX: + nv40_verttex_sampler_states_bind(pipe, num_samplers, samplers); + break; + case PIPE_SHADER_FRAGMENT: + nv30_fragtex_sampler_states_bind(pipe, num_samplers, samplers); + break; + } +} + static INLINE uint32_t swizzle(const struct nv30_texfmt *fmt, unsigned cmp, unsigned swz) { @@ -301,6 +316,8 @@ nv30_texture_init(struct pipe_context *pipe) { pipe->create_sampler_state = nv30_sampler_state_create; pipe->delete_sampler_state = nv30_sampler_state_delete; + pipe->bind_sampler_states = nv30_bind_sampler_states; + pipe->create_sampler_view = nv30_sampler_view_create; pipe->sampler_view_destroy = nv30_sampler_view_destroy; } diff --git a/src/gallium/drivers/nouveau/nv30/nv40_verttex.c b/src/gallium/drivers/nouveau/nv30/nv40_verttex.c index 9a7163c448f..c099208fb60 100644 --- a/src/gallium/drivers/nouveau/nv30/nv40_verttex.c +++ b/src/gallium/drivers/nouveau/nv30/nv40_verttex.c @@ -47,7 +47,7 @@ nv40_verttex_validate(struct nv30_context *nv30) nv30->vertprog.dirty_samplers = 0; } -static void +void nv40_verttex_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **hwcso) { diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state.c b/src/gallium/drivers/nouveau/nv50/nv50_state.c index 7dceb51c19e..03a2ebb63b9 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_state.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_state.c @@ -606,6 +606,27 @@ nv50_gp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) nv50_stage_sampler_states_bind(nv50_context(pipe), 1, nr, s); } +static void +nv50_bind_sampler_states(struct pipe_context *pipe, + unsigned shader, unsigned start, + unsigned num_samplers, void **samplers) +{ + assert(start == 0); + switch (shader) { + case PIPE_SHADER_VERTEX: + nv50_vp_sampler_states_bind(pipe, num_samplers, samplers); + break; + case PIPE_SHADER_GEOMETRY: + nv50_gp_sampler_states_bind(pipe, num_samplers, samplers); + break; + case PIPE_SHADER_FRAGMENT: + nv50_fp_sampler_states_bind(pipe, num_samplers, samplers); + break; + } +} + + + /* NOTE: only called when not referenced anywhere, won't be bound */ static void nv50_sampler_view_destroy(struct pipe_context *pipe, @@ -1067,6 +1088,7 @@ nv50_init_state_functions(struct nv50_context *nv50) pipe->create_sampler_state = nv50_sampler_state_create; pipe->delete_sampler_state = nv50_sampler_state_delete; + pipe->bind_sampler_states = nv50_bind_sampler_states; pipe->bind_vertex_sampler_states = nv50_vp_sampler_states_bind; pipe->bind_fragment_sampler_states = nv50_fp_sampler_states_bind; pipe->bind_geometry_sampler_states = nv50_gp_sampler_states_bind; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c index e56ef0160f2..e3117d443a2 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c @@ -540,6 +540,32 @@ nvc0_cp_sampler_states_bind(struct pipe_context *pipe, nvc0_context(pipe)->dirty_cp |= NVC0_NEW_CP_SAMPLERS; } +static void +nvc0_bind_sampler_states(struct pipe_context *pipe, unsigned shader, + unsigned start, unsigned nr, void **s) +{ + switch (shader) { + case PIPE_SHADER_VERTEX: + assert(start == 0); + nvc0_stage_sampler_states_bind(nvc0_context(pipe), 0, nr, s); + break; + case PIPE_SHADER_GEOMETRY: + assert(start == 0); + nvc0_stage_sampler_states_bind(nvc0_context(pipe), 3, nr, s); + break; + case PIPE_SHADER_FRAGMENT: + assert(start == 0); + nvc0_stage_sampler_states_bind(nvc0_context(pipe), 4, nr, s); + break; + case PIPE_SHADER_COMPUTE: + nvc0_stage_sampler_states_bind_range(nvc0_context(pipe), 5, + start, nr, s); + nvc0_context(pipe)->dirty_cp |= NVC0_NEW_CP_SAMPLERS; + break; + } +} + + /* NOTE: only called when not referenced anywhere, won't be bound */ static void nvc0_sampler_view_destroy(struct pipe_context *pipe, @@ -1194,6 +1220,7 @@ nvc0_init_state_functions(struct nvc0_context *nvc0) pipe->create_sampler_state = nv50_sampler_state_create; pipe->delete_sampler_state = nvc0_sampler_state_delete; + pipe->bind_sampler_states = nvc0_bind_sampler_states; pipe->bind_vertex_sampler_states = nvc0_vp_sampler_states_bind; pipe->bind_fragment_sampler_states = nvc0_fp_sampler_states_bind; pipe->bind_geometry_sampler_states = nvc0_gp_sampler_states_bind;