mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 07:10:15 +01:00
gallium/softpipe/draw: support samplers in geometry shaders
This commit is contained in:
parent
2396967038
commit
53bd9796a1
11 changed files with 153 additions and 5 deletions
|
|
@ -435,13 +435,18 @@ draw_num_shader_outputs(const struct draw_context *draw)
|
|||
*/
|
||||
void
|
||||
draw_texture_samplers(struct draw_context *draw,
|
||||
uint shader,
|
||||
uint num_samplers,
|
||||
struct tgsi_sampler **samplers)
|
||||
{
|
||||
draw->vs.num_samplers = num_samplers;
|
||||
draw->vs.samplers = samplers;
|
||||
draw->gs.num_samplers = num_samplers;
|
||||
draw->gs.samplers = samplers;
|
||||
if (shader == PIPE_SHADER_VERTEX) {
|
||||
draw->vs.num_samplers = num_samplers;
|
||||
draw->vs.samplers = samplers;
|
||||
} else {
|
||||
debug_assert(shader == PIPE_SHADER_GEOMETRY);
|
||||
draw->gs.num_samplers = num_samplers;
|
||||
draw->gs.samplers = samplers;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -97,6 +97,7 @@ draw_num_shader_outputs(const struct draw_context *draw);
|
|||
|
||||
void
|
||||
draw_texture_samplers(struct draw_context *draw,
|
||||
uint shader_type,
|
||||
uint num_samplers,
|
||||
struct tgsi_sampler **samplers);
|
||||
|
||||
|
|
|
|||
|
|
@ -114,6 +114,11 @@ softpipe_destroy( struct pipe_context *pipe )
|
|||
pipe_sampler_view_reference(&softpipe->vertex_sampler_views[i], NULL);
|
||||
}
|
||||
|
||||
for (i = 0; i < PIPE_MAX_GEOMETRY_SAMPLERS; i++) {
|
||||
sp_destroy_tex_tile_cache(softpipe->geometry_tex_cache[i]);
|
||||
pipe_sampler_view_reference(&softpipe->geometry_sampler_views[i], NULL);
|
||||
}
|
||||
|
||||
for (i = 0; i < PIPE_SHADER_TYPES; i++) {
|
||||
uint j;
|
||||
|
||||
|
|
@ -174,7 +179,12 @@ softpipe_is_resource_referenced( struct pipe_context *pipe,
|
|||
softpipe->vertex_tex_cache[i]->texture == texture)
|
||||
return PIPE_REFERENCED_FOR_READ;
|
||||
}
|
||||
|
||||
for (i = 0; i < PIPE_MAX_GEOMETRY_SAMPLERS; i++) {
|
||||
if (softpipe->geometry_tex_cache[i] &&
|
||||
softpipe->geometry_tex_cache[i]->texture == texture)
|
||||
return PIPE_REFERENCED_FOR_READ;
|
||||
}
|
||||
|
||||
return PIPE_UNREFERENCED;
|
||||
}
|
||||
|
||||
|
|
@ -225,6 +235,7 @@ softpipe_create_context( struct pipe_screen *screen,
|
|||
softpipe->pipe.create_sampler_state = softpipe_create_sampler_state;
|
||||
softpipe->pipe.bind_fragment_sampler_states = softpipe_bind_sampler_states;
|
||||
softpipe->pipe.bind_vertex_sampler_states = softpipe_bind_vertex_sampler_states;
|
||||
softpipe->pipe.bind_geometry_sampler_states = softpipe_bind_geometry_sampler_states;
|
||||
softpipe->pipe.delete_sampler_state = softpipe_delete_sampler_state;
|
||||
|
||||
softpipe->pipe.create_depth_stencil_alpha_state = softpipe_create_depth_stencil_state;
|
||||
|
|
@ -265,6 +276,7 @@ softpipe_create_context( struct pipe_screen *screen,
|
|||
softpipe->pipe.set_scissor_state = softpipe_set_scissor_state;
|
||||
softpipe->pipe.set_fragment_sampler_views = softpipe_set_sampler_views;
|
||||
softpipe->pipe.set_vertex_sampler_views = softpipe_set_vertex_sampler_views;
|
||||
softpipe->pipe.set_geometry_sampler_views = softpipe_set_geometry_sampler_views;
|
||||
softpipe->pipe.create_sampler_view = softpipe_create_sampler_view;
|
||||
softpipe->pipe.sampler_view_destroy = softpipe_sampler_view_destroy;
|
||||
softpipe->pipe.set_viewport_state = softpipe_set_viewport_state;
|
||||
|
|
@ -301,6 +313,9 @@ softpipe_create_context( struct pipe_screen *screen,
|
|||
for (i = 0; i < PIPE_MAX_VERTEX_SAMPLERS; i++) {
|
||||
softpipe->vertex_tex_cache[i] = sp_create_tex_tile_cache( &softpipe->pipe );
|
||||
}
|
||||
for (i = 0; i < PIPE_MAX_GEOMETRY_SAMPLERS; i++) {
|
||||
softpipe->geometry_tex_cache[i] = sp_create_tex_tile_cache( &softpipe->pipe );
|
||||
}
|
||||
|
||||
softpipe->fs_machine = tgsi_exec_machine_create();
|
||||
|
||||
|
|
@ -319,10 +334,17 @@ softpipe_create_context( struct pipe_screen *screen,
|
|||
goto fail;
|
||||
|
||||
draw_texture_samplers(softpipe->draw,
|
||||
PIPE_SHADER_VERTEX,
|
||||
PIPE_MAX_VERTEX_SAMPLERS,
|
||||
(struct tgsi_sampler **)
|
||||
softpipe->tgsi.vert_samplers_list);
|
||||
|
||||
draw_texture_samplers(softpipe->draw,
|
||||
PIPE_SHADER_GEOMETRY,
|
||||
PIPE_MAX_GEOMETRY_SAMPLERS,
|
||||
(struct tgsi_sampler **)
|
||||
softpipe->tgsi.geom_samplers_list);
|
||||
|
||||
if (debug_get_bool_option( "SP_NO_RAST", FALSE ))
|
||||
softpipe->no_rast = TRUE;
|
||||
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ struct softpipe_context {
|
|||
struct pipe_blend_state *blend;
|
||||
struct pipe_sampler_state *sampler[PIPE_MAX_SAMPLERS];
|
||||
struct pipe_sampler_state *vertex_samplers[PIPE_MAX_VERTEX_SAMPLERS];
|
||||
struct pipe_sampler_state *geometry_samplers[PIPE_MAX_GEOMETRY_SAMPLERS];
|
||||
struct pipe_depth_stencil_alpha_state *depth_stencil;
|
||||
struct pipe_rasterizer_state *rasterizer;
|
||||
struct sp_fragment_shader *fs;
|
||||
|
|
@ -78,6 +79,7 @@ struct softpipe_context {
|
|||
struct pipe_scissor_state scissor;
|
||||
struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS];
|
||||
struct pipe_sampler_view *vertex_sampler_views[PIPE_MAX_VERTEX_SAMPLERS];
|
||||
struct pipe_sampler_view *geometry_sampler_views[PIPE_MAX_GEOMETRY_SAMPLERS];
|
||||
struct pipe_viewport_state viewport;
|
||||
struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
|
||||
struct {
|
||||
|
|
@ -92,6 +94,8 @@ struct softpipe_context {
|
|||
unsigned num_sampler_views;
|
||||
unsigned num_vertex_samplers;
|
||||
unsigned num_vertex_sampler_views;
|
||||
unsigned num_geometry_samplers;
|
||||
unsigned num_geometry_sampler_views;
|
||||
unsigned num_vertex_buffers;
|
||||
|
||||
unsigned dirty; /**< Mask of SP_NEW_x flags */
|
||||
|
|
@ -148,6 +152,7 @@ struct softpipe_context {
|
|||
|
||||
/** TGSI exec things */
|
||||
struct {
|
||||
struct sp_sampler_varient *geom_samplers_list[PIPE_MAX_GEOMETRY_SAMPLERS];
|
||||
struct sp_sampler_varient *vert_samplers_list[PIPE_MAX_VERTEX_SAMPLERS];
|
||||
struct sp_sampler_varient *frag_samplers_list[PIPE_MAX_SAMPLERS];
|
||||
} tgsi;
|
||||
|
|
@ -169,6 +174,7 @@ struct softpipe_context {
|
|||
unsigned tex_timestamp;
|
||||
struct softpipe_tex_tile_cache *tex_cache[PIPE_MAX_SAMPLERS];
|
||||
struct softpipe_tex_tile_cache *vertex_tex_cache[PIPE_MAX_VERTEX_SAMPLERS];
|
||||
struct softpipe_tex_tile_cache *geometry_tex_cache[PIPE_MAX_GEOMETRY_SAMPLERS];
|
||||
|
||||
unsigned use_sse : 1;
|
||||
unsigned dump_fs : 1;
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ softpipe_flush( struct pipe_context *pipe,
|
|||
for (i = 0; i < softpipe->num_vertex_sampler_views; i++) {
|
||||
sp_flush_tex_tile_cache(softpipe->vertex_tex_cache[i]);
|
||||
}
|
||||
for (i = 0; i < softpipe->num_geometry_sampler_views; i++) {
|
||||
sp_flush_tex_tile_cache(softpipe->geometry_tex_cache[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if (flags & PIPE_FLUSH_SWAPBUFFERS) {
|
||||
|
|
|
|||
|
|
@ -100,6 +100,7 @@ struct sp_vertex_shader {
|
|||
struct sp_geometry_shader {
|
||||
struct pipe_shader_state shader;
|
||||
struct draw_geometry_shader *draw_data;
|
||||
int max_sampler;
|
||||
};
|
||||
|
||||
struct sp_velems_state {
|
||||
|
|
@ -128,6 +129,10 @@ void
|
|||
softpipe_bind_vertex_sampler_states(struct pipe_context *,
|
||||
unsigned num_samplers,
|
||||
void **samplers);
|
||||
void
|
||||
softpipe_bind_geometry_sampler_states(struct pipe_context *,
|
||||
unsigned num_samplers,
|
||||
void **samplers);
|
||||
void softpipe_delete_sampler_state(struct pipe_context *, void *);
|
||||
|
||||
void *
|
||||
|
|
@ -195,6 +200,11 @@ softpipe_set_vertex_sampler_views(struct pipe_context *,
|
|||
unsigned num,
|
||||
struct pipe_sampler_view **);
|
||||
|
||||
void
|
||||
softpipe_set_geometry_sampler_views(struct pipe_context *,
|
||||
unsigned num,
|
||||
struct pipe_sampler_view **);
|
||||
|
||||
struct pipe_sampler_view *
|
||||
softpipe_create_sampler_view(struct pipe_context *pipe,
|
||||
struct pipe_resource *texture,
|
||||
|
|
|
|||
|
|
@ -225,6 +225,19 @@ update_tgsi_samplers( struct softpipe_context *softpipe )
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < PIPE_MAX_GEOMETRY_SAMPLERS; i++) {
|
||||
struct softpipe_tex_tile_cache *tc = softpipe->geometry_tex_cache[i];
|
||||
|
||||
if (tc->texture) {
|
||||
struct softpipe_resource *spt = softpipe_resource(tc->texture);
|
||||
|
||||
if (spt->timestamp != tc->timestamp) {
|
||||
sp_tex_tile_cache_validate_texture(tc);
|
||||
tc->timestamp = spt->timestamp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
#include "util/u_inlines.h"
|
||||
#include "draw/draw_context.h"
|
||||
#include "draw/draw_vs.h"
|
||||
#include "draw/draw_gs.h"
|
||||
#include "tgsi/tgsi_dump.h"
|
||||
#include "tgsi/tgsi_exec.h"
|
||||
#include "tgsi/tgsi_scan.h"
|
||||
|
|
@ -223,6 +224,8 @@ softpipe_create_gs_state(struct pipe_context *pipe,
|
|||
if (state->draw_data == NULL)
|
||||
goto fail;
|
||||
|
||||
state->max_sampler = state->draw_data->info.file_max[TGSI_FILE_SAMPLER];
|
||||
|
||||
return state;
|
||||
|
||||
fail:
|
||||
|
|
|
|||
|
|
@ -121,6 +121,33 @@ softpipe_bind_vertex_sampler_states(struct pipe_context *pipe,
|
|||
softpipe->dirty |= SP_NEW_SAMPLER;
|
||||
}
|
||||
|
||||
void
|
||||
softpipe_bind_geometry_sampler_states(struct pipe_context *pipe,
|
||||
unsigned num_samplers,
|
||||
void **samplers)
|
||||
{
|
||||
struct softpipe_context *softpipe = softpipe_context(pipe);
|
||||
unsigned i;
|
||||
|
||||
assert(num_samplers <= PIPE_MAX_GEOMETRY_SAMPLERS);
|
||||
|
||||
/* Check for no-op */
|
||||
if (num_samplers == softpipe->num_geometry_samplers &&
|
||||
!memcmp(softpipe->geometry_samplers, samplers, num_samplers * sizeof(void *)))
|
||||
return;
|
||||
|
||||
draw_flush(softpipe->draw);
|
||||
|
||||
for (i = 0; i < num_samplers; ++i)
|
||||
softpipe->geometry_samplers[i] = samplers[i];
|
||||
for (i = num_samplers; i < PIPE_MAX_GEOMETRY_SAMPLERS; ++i)
|
||||
softpipe->geometry_samplers[i] = NULL;
|
||||
|
||||
softpipe->num_geometry_samplers = num_samplers;
|
||||
|
||||
softpipe->dirty |= SP_NEW_SAMPLER;
|
||||
}
|
||||
|
||||
|
||||
struct pipe_sampler_view *
|
||||
softpipe_create_sampler_view(struct pipe_context *pipe,
|
||||
|
|
@ -210,6 +237,36 @@ softpipe_set_vertex_sampler_views(struct pipe_context *pipe,
|
|||
softpipe->dirty |= SP_NEW_TEXTURE;
|
||||
}
|
||||
|
||||
void
|
||||
softpipe_set_geometry_sampler_views(struct pipe_context *pipe,
|
||||
unsigned num,
|
||||
struct pipe_sampler_view **views)
|
||||
{
|
||||
struct softpipe_context *softpipe = softpipe_context(pipe);
|
||||
uint i;
|
||||
|
||||
assert(num <= PIPE_MAX_GEOMETRY_SAMPLERS);
|
||||
|
||||
/* Check for no-op */
|
||||
if (num == softpipe->num_geometry_sampler_views &&
|
||||
!memcmp(softpipe->geometry_sampler_views, views, num * sizeof(struct pipe_sampler_view *))) {
|
||||
return;
|
||||
}
|
||||
|
||||
draw_flush(softpipe->draw);
|
||||
|
||||
for (i = 0; i < PIPE_MAX_GEOMETRY_SAMPLERS; i++) {
|
||||
struct pipe_sampler_view *view = i < num ? views[i] : NULL;
|
||||
|
||||
pipe_sampler_view_reference(&softpipe->geometry_sampler_views[i], view);
|
||||
sp_tex_tile_cache_set_sampler_view(softpipe->geometry_tex_cache[i], view);
|
||||
}
|
||||
|
||||
softpipe->num_geometry_sampler_views = num;
|
||||
|
||||
softpipe->dirty |= SP_NEW_TEXTURE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Find/create an sp_sampler_varient object for sampling the given texture,
|
||||
|
|
@ -293,6 +350,26 @@ softpipe_reset_sampler_varients(struct softpipe_context *softpipe)
|
|||
}
|
||||
}
|
||||
|
||||
for (i = 0; i <= softpipe->gs->max_sampler; i++) {
|
||||
if (softpipe->geometry_samplers[i]) {
|
||||
struct pipe_resource *texture = NULL;
|
||||
|
||||
if (softpipe->geometry_sampler_views[i]) {
|
||||
texture = softpipe->geometry_sampler_views[i]->texture;
|
||||
}
|
||||
|
||||
softpipe->tgsi.geom_samplers_list[i] =
|
||||
get_sampler_varient( i,
|
||||
sp_sampler(softpipe->geometry_samplers[i]),
|
||||
texture,
|
||||
TGSI_PROCESSOR_GEOMETRY );
|
||||
|
||||
sp_sampler_varient_bind_texture( softpipe->tgsi.geom_samplers_list[i],
|
||||
softpipe->geometry_tex_cache[i],
|
||||
texture );
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i <= softpipe->fs->info.file_max[TGSI_FILE_SAMPLER]; i++) {
|
||||
if (softpipe->sampler[i]) {
|
||||
struct pipe_resource *texture = NULL;
|
||||
|
|
|
|||
|
|
@ -158,6 +158,9 @@ struct pipe_context {
|
|||
void (*bind_vertex_sampler_states)(struct pipe_context *,
|
||||
unsigned num_samplers,
|
||||
void **samplers);
|
||||
void (*bind_geometry_sampler_states)(struct pipe_context *,
|
||||
unsigned num_samplers,
|
||||
void **samplers);
|
||||
void (*delete_sampler_state)(struct pipe_context *, void *);
|
||||
|
||||
void * (*create_rasterizer_state)(struct pipe_context *,
|
||||
|
|
@ -238,6 +241,10 @@ struct pipe_context {
|
|||
unsigned num_views,
|
||||
struct pipe_sampler_view **);
|
||||
|
||||
void (*set_geometry_sampler_views)(struct pipe_context *,
|
||||
unsigned num_views,
|
||||
struct pipe_sampler_view **);
|
||||
|
||||
void (*set_vertex_buffers)( struct pipe_context *,
|
||||
unsigned num_buffers,
|
||||
const struct pipe_vertex_buffer * );
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ extern "C" {
|
|||
#define PIPE_MAX_CONSTANT_BUFFERS 32
|
||||
#define PIPE_MAX_SAMPLERS 16
|
||||
#define PIPE_MAX_VERTEX_SAMPLERS 16
|
||||
#define PIPE_MAX_GEOMETRY_SAMPLERS 16
|
||||
#define PIPE_MAX_SHADER_INPUTS 16
|
||||
#define PIPE_MAX_SHADER_OUTPUTS 16
|
||||
#define PIPE_MAX_TEXTURE_LEVELS 16
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue