mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-20 01:20:44 +02:00
nv50,nvc0: share sampler state creation
This commit is contained in:
parent
e4c968cdbb
commit
1f5d6fc59b
10 changed files with 60 additions and 150 deletions
|
|
@ -380,7 +380,7 @@ nv50_tsc_wrap_mode(unsigned wrap)
|
|||
}
|
||||
}
|
||||
|
||||
static void *
|
||||
void *
|
||||
nv50_sampler_state_create(struct pipe_context *pipe,
|
||||
const struct pipe_sampler_state *cso)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -16,35 +16,14 @@
|
|||
|
||||
#define SB_DATA(so, u) (so)->state[(so)->size++] = (u)
|
||||
|
||||
#include "nv50_stateobj_tex.h"
|
||||
|
||||
struct nv50_blend_stateobj {
|
||||
struct pipe_blend_state pipe;
|
||||
int size;
|
||||
uint32_t state[78];
|
||||
};
|
||||
|
||||
struct nv50_tsc_entry {
|
||||
int id;
|
||||
uint32_t tsc[8];
|
||||
};
|
||||
|
||||
static INLINE struct nv50_tsc_entry *
|
||||
nv50_tsc_entry(void *hwcso)
|
||||
{
|
||||
return (struct nv50_tsc_entry *)hwcso;
|
||||
}
|
||||
|
||||
struct nv50_tic_entry {
|
||||
struct pipe_sampler_view pipe;
|
||||
int id;
|
||||
uint32_t tic[8];
|
||||
};
|
||||
|
||||
static INLINE struct nv50_tic_entry *
|
||||
nv50_tic_entry(struct pipe_sampler_view *view)
|
||||
{
|
||||
return (struct nv50_tic_entry *)view;
|
||||
}
|
||||
|
||||
struct nv50_rasterizer_stateobj {
|
||||
struct pipe_rasterizer_state pipe;
|
||||
int size;
|
||||
|
|
|
|||
34
src/gallium/drivers/nv50/nv50_stateobj_tex.h
Normal file
34
src/gallium/drivers/nv50/nv50_stateobj_tex.h
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
|
||||
#ifndef __NV50_STATEOBJ_TEX_H__
|
||||
#define __NV50_STATEOBJ_TEX_H__
|
||||
|
||||
#include "pipe/p_state.h"
|
||||
|
||||
struct nv50_tsc_entry {
|
||||
int id;
|
||||
uint32_t tsc[8];
|
||||
};
|
||||
|
||||
static INLINE struct nv50_tsc_entry *
|
||||
nv50_tsc_entry(void *hwcso)
|
||||
{
|
||||
return (struct nv50_tsc_entry *)hwcso;
|
||||
}
|
||||
|
||||
struct nv50_tic_entry {
|
||||
struct pipe_sampler_view pipe;
|
||||
int id;
|
||||
uint32_t tic[8];
|
||||
};
|
||||
|
||||
static INLINE struct nv50_tic_entry *
|
||||
nv50_tic_entry(struct pipe_sampler_view *view)
|
||||
{
|
||||
return (struct nv50_tic_entry *)view;
|
||||
}
|
||||
|
||||
extern void *
|
||||
nv50_sampler_state_create(struct pipe_context *,
|
||||
const struct pipe_sampler_state *);
|
||||
|
||||
#endif /* __NV50_STATEOBJ_TEX_H__ */
|
||||
|
|
@ -148,6 +148,7 @@ nv50_create_sampler_view(struct pipe_context *pipe,
|
|||
break;
|
||||
case PIPE_BUFFER:
|
||||
tic[2] |= NV50_TIC_2_TARGET_BUFFER | NV50_TIC_2_LINEAR;
|
||||
break;
|
||||
default:
|
||||
NOUVEAU_ERR("invalid texture target: %d\n", mt->base.base.target);
|
||||
return FALSE;
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ struct nvc0_context {
|
|||
|
||||
struct pipe_sampler_view *textures[5][PIPE_MAX_SAMPLERS];
|
||||
unsigned num_textures[5];
|
||||
struct nvc0_tsc_entry *samplers[5][PIPE_MAX_SAMPLERS];
|
||||
struct nv50_tsc_entry *samplers[5][PIPE_MAX_SAMPLERS];
|
||||
unsigned num_samplers[5];
|
||||
|
||||
struct pipe_framebuffer_state framebuffer;
|
||||
|
|
|
|||
|
|
@ -651,7 +651,7 @@ nvc0_screen_tic_alloc(struct nvc0_screen *screen, void *entry)
|
|||
screen->tic.next = (i + 1) & (NVC0_TIC_MAX_ENTRIES - 1);
|
||||
|
||||
if (screen->tic.entries[i])
|
||||
nvc0_tic_entry(screen->tic.entries[i])->id = -1;
|
||||
nv50_tic_entry(screen->tic.entries[i])->id = -1;
|
||||
|
||||
screen->tic.entries[i] = entry;
|
||||
return i;
|
||||
|
|
@ -668,7 +668,7 @@ nvc0_screen_tsc_alloc(struct nvc0_screen *screen, void *entry)
|
|||
screen->tsc.next = (i + 1) & (NVC0_TSC_MAX_ENTRIES - 1);
|
||||
|
||||
if (screen->tsc.entries[i])
|
||||
nvc0_tsc_entry(screen->tsc.entries[i])->id = -1;
|
||||
nv50_tsc_entry(screen->tsc.entries[i])->id = -1;
|
||||
|
||||
screen->tsc.entries[i] = entry;
|
||||
return i;
|
||||
|
|
|
|||
|
|
@ -114,21 +114,21 @@ struct nvc0_format {
|
|||
extern const struct nvc0_format nvc0_format_table[];
|
||||
|
||||
static INLINE void
|
||||
nvc0_screen_tic_unlock(struct nvc0_screen *screen, struct nvc0_tic_entry *tic)
|
||||
nvc0_screen_tic_unlock(struct nvc0_screen *screen, struct nv50_tic_entry *tic)
|
||||
{
|
||||
if (tic->id >= 0)
|
||||
screen->tic.lock[tic->id / 32] &= ~(1 << (tic->id % 32));
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
nvc0_screen_tsc_unlock(struct nvc0_screen *screen, struct nvc0_tsc_entry *tsc)
|
||||
nvc0_screen_tsc_unlock(struct nvc0_screen *screen, struct nv50_tsc_entry *tsc)
|
||||
{
|
||||
if (tsc->id >= 0)
|
||||
screen->tsc.lock[tsc->id / 32] &= ~(1 << (tsc->id % 32));
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
nvc0_screen_tic_free(struct nvc0_screen *screen, struct nvc0_tic_entry *tic)
|
||||
nvc0_screen_tic_free(struct nvc0_screen *screen, struct nv50_tic_entry *tic)
|
||||
{
|
||||
if (tic->id >= 0) {
|
||||
screen->tic.entries[tic->id] = NULL;
|
||||
|
|
@ -137,7 +137,7 @@ nvc0_screen_tic_free(struct nvc0_screen *screen, struct nvc0_tic_entry *tic)
|
|||
}
|
||||
|
||||
static INLINE void
|
||||
nvc0_screen_tsc_free(struct nvc0_screen *screen, struct nvc0_tsc_entry *tsc)
|
||||
nvc0_screen_tsc_free(struct nvc0_screen *screen, struct nv50_tsc_entry *tsc)
|
||||
{
|
||||
if (tsc->id >= 0) {
|
||||
screen->tsc.entries[tsc->id] = NULL;
|
||||
|
|
|
|||
|
|
@ -361,90 +361,6 @@ nv50_tsc_wrap_mode(unsigned wrap)
|
|||
}
|
||||
}
|
||||
|
||||
static void *
|
||||
nvc0_sampler_state_create(struct pipe_context *pipe,
|
||||
const struct pipe_sampler_state *cso)
|
||||
{
|
||||
struct nvc0_tsc_entry *so = CALLOC_STRUCT(nvc0_tsc_entry);
|
||||
float f[2];
|
||||
|
||||
so->id = -1;
|
||||
|
||||
so->tsc[0] = (0x00026000 |
|
||||
(nv50_tsc_wrap_mode(cso->wrap_s) << 0) |
|
||||
(nv50_tsc_wrap_mode(cso->wrap_t) << 3) |
|
||||
(nv50_tsc_wrap_mode(cso->wrap_r) << 6));
|
||||
|
||||
switch (cso->mag_img_filter) {
|
||||
case PIPE_TEX_FILTER_LINEAR:
|
||||
so->tsc[1] |= NV50_TSC_1_MAGF_LINEAR;
|
||||
break;
|
||||
case PIPE_TEX_FILTER_NEAREST:
|
||||
default:
|
||||
so->tsc[1] |= NV50_TSC_1_MAGF_NEAREST;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (cso->min_img_filter) {
|
||||
case PIPE_TEX_FILTER_LINEAR:
|
||||
so->tsc[1] |= NV50_TSC_1_MINF_LINEAR;
|
||||
break;
|
||||
case PIPE_TEX_FILTER_NEAREST:
|
||||
default:
|
||||
so->tsc[1] |= NV50_TSC_1_MINF_NEAREST;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (cso->min_mip_filter) {
|
||||
case PIPE_TEX_MIPFILTER_LINEAR:
|
||||
so->tsc[1] |= NV50_TSC_1_MIPF_LINEAR;
|
||||
break;
|
||||
case PIPE_TEX_MIPFILTER_NEAREST:
|
||||
so->tsc[1] |= NV50_TSC_1_MIPF_NEAREST;
|
||||
break;
|
||||
case PIPE_TEX_MIPFILTER_NONE:
|
||||
default:
|
||||
so->tsc[1] |= NV50_TSC_1_MIPF_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (cso->max_anisotropy >= 16)
|
||||
so->tsc[0] |= (7 << 20);
|
||||
else
|
||||
if (cso->max_anisotropy >= 12)
|
||||
so->tsc[0] |= (6 << 20);
|
||||
else {
|
||||
so->tsc[0] |= (cso->max_anisotropy >> 1) << 20;
|
||||
|
||||
if (cso->max_anisotropy >= 4)
|
||||
so->tsc[1] |= NV50_TSC_1_UNKN_ANISO_35;
|
||||
else
|
||||
if (cso->max_anisotropy >= 2)
|
||||
so->tsc[1] |= NV50_TSC_1_UNKN_ANISO_15;
|
||||
}
|
||||
|
||||
if (cso->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) {
|
||||
/* NOTE: must be deactivated for non-shadow textures */
|
||||
so->tsc[0] |= (1 << 9);
|
||||
so->tsc[0] |= (nvgl_comparison_op(cso->compare_func) & 0x7) << 10;
|
||||
}
|
||||
|
||||
f[0] = CLAMP(cso->lod_bias, -16.0f, 15.0f);
|
||||
so->tsc[1] |= ((int)(f[0] * 256.0f) & 0x1fff) << 12;
|
||||
|
||||
f[0] = CLAMP(cso->min_lod, 0.0f, 15.0f);
|
||||
f[1] = CLAMP(cso->max_lod, 0.0f, 15.0f);
|
||||
so->tsc[2] |=
|
||||
(((int)(f[1] * 256.0f) & 0xfff) << 12) | ((int)(f[0] * 256.0f) & 0xfff);
|
||||
|
||||
so->tsc[4] = fui(cso->border_color[0]);
|
||||
so->tsc[5] = fui(cso->border_color[1]);
|
||||
so->tsc[6] = fui(cso->border_color[2]);
|
||||
so->tsc[7] = fui(cso->border_color[3]);
|
||||
|
||||
return (void *)so;
|
||||
}
|
||||
|
||||
static void
|
||||
nvc0_sampler_state_delete(struct pipe_context *pipe, void *hwcso)
|
||||
{
|
||||
|
|
@ -455,7 +371,7 @@ nvc0_sampler_state_delete(struct pipe_context *pipe, void *hwcso)
|
|||
if (nvc0_context(pipe)->samplers[s][i] == hwcso)
|
||||
nvc0_context(pipe)->samplers[s][i] = NULL;
|
||||
|
||||
nvc0_screen_tsc_free(nvc0_context(pipe)->screen, nvc0_tsc_entry(hwcso));
|
||||
nvc0_screen_tsc_free(nvc0_context(pipe)->screen, nv50_tsc_entry(hwcso));
|
||||
|
||||
FREE(hwcso);
|
||||
}
|
||||
|
|
@ -467,9 +383,9 @@ nvc0_stage_sampler_states_bind(struct nvc0_context *nvc0, int s,
|
|||
unsigned i;
|
||||
|
||||
for (i = 0; i < nr; ++i) {
|
||||
struct nvc0_tsc_entry *old = nvc0->samplers[s][i];
|
||||
struct nv50_tsc_entry *old = nvc0->samplers[s][i];
|
||||
|
||||
nvc0->samplers[s][i] = nvc0_tsc_entry(hwcso[i]);
|
||||
nvc0->samplers[s][i] = nv50_tsc_entry(hwcso[i]);
|
||||
if (old)
|
||||
nvc0_screen_tsc_unlock(nvc0->screen, old);
|
||||
}
|
||||
|
|
@ -507,9 +423,9 @@ nvc0_sampler_view_destroy(struct pipe_context *pipe,
|
|||
{
|
||||
pipe_resource_reference(&view->texture, NULL);
|
||||
|
||||
nvc0_screen_tic_free(nvc0_context(pipe)->screen, nvc0_tic_entry(view));
|
||||
nvc0_screen_tic_free(nvc0_context(pipe)->screen, nv50_tic_entry(view));
|
||||
|
||||
FREE(nvc0_tic_entry(view));
|
||||
FREE(nv50_tic_entry(view));
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
|
|
@ -520,7 +436,7 @@ nvc0_stage_set_sampler_views(struct nvc0_context *nvc0, int s,
|
|||
unsigned i;
|
||||
|
||||
for (i = 0; i < nr; ++i) {
|
||||
struct nvc0_tic_entry *old = nvc0_tic_entry(nvc0->textures[s][i]);
|
||||
struct nv50_tic_entry *old = nv50_tic_entry(nvc0->textures[s][i]);
|
||||
if (old)
|
||||
nvc0_screen_tic_unlock(nvc0->screen, old);
|
||||
|
||||
|
|
@ -528,7 +444,7 @@ nvc0_stage_set_sampler_views(struct nvc0_context *nvc0, int s,
|
|||
}
|
||||
|
||||
for (i = nr; i < nvc0->num_textures[s]; ++i) {
|
||||
struct nvc0_tic_entry *old = nvc0_tic_entry(nvc0->textures[s][i]);
|
||||
struct nv50_tic_entry *old = nv50_tic_entry(nvc0->textures[s][i]);
|
||||
if (!old)
|
||||
continue;
|
||||
nvc0_screen_tic_unlock(nvc0->screen, old);
|
||||
|
|
@ -890,7 +806,7 @@ nvc0_init_state_functions(struct nvc0_context *nvc0)
|
|||
pipe->bind_depth_stencil_alpha_state = nvc0_zsa_state_bind;
|
||||
pipe->delete_depth_stencil_alpha_state = nvc0_zsa_state_delete;
|
||||
|
||||
pipe->create_sampler_state = nvc0_sampler_state_create;
|
||||
pipe->create_sampler_state = nv50_sampler_state_create;
|
||||
pipe->delete_sampler_state = nvc0_sampler_state_delete;
|
||||
pipe->bind_vertex_sampler_states = nvc0_vp_sampler_states_bind;
|
||||
pipe->bind_fragment_sampler_states = nvc0_fp_sampler_states_bind;
|
||||
|
|
|
|||
|
|
@ -14,35 +14,14 @@
|
|||
|
||||
#define SB_DATA(so, u) (so)->state[(so)->size++] = (u)
|
||||
|
||||
#include "nv50/nv50_stateobj_tex.h"
|
||||
|
||||
struct nvc0_blend_stateobj {
|
||||
struct pipe_blend_state pipe;
|
||||
int size;
|
||||
uint32_t state[72];
|
||||
};
|
||||
|
||||
struct nvc0_tsc_entry {
|
||||
int id;
|
||||
uint32_t tsc[8];
|
||||
};
|
||||
|
||||
static INLINE struct nvc0_tsc_entry *
|
||||
nvc0_tsc_entry(void *hwcso)
|
||||
{
|
||||
return (struct nvc0_tsc_entry *)hwcso;
|
||||
}
|
||||
|
||||
struct nvc0_tic_entry {
|
||||
struct pipe_sampler_view pipe;
|
||||
int id;
|
||||
uint32_t tic[8]; /* tic[1] (low 32 bit of address) is used for offset */
|
||||
};
|
||||
|
||||
static INLINE struct nvc0_tic_entry *
|
||||
nvc0_tic_entry(struct pipe_sampler_view *view)
|
||||
{
|
||||
return (struct nvc0_tic_entry *)view;
|
||||
}
|
||||
|
||||
struct nvc0_rasterizer_stateobj {
|
||||
struct pipe_rasterizer_state pipe;
|
||||
int size;
|
||||
|
|
|
|||
|
|
@ -59,11 +59,11 @@ nvc0_create_sampler_view(struct pipe_context *pipe,
|
|||
uint32_t *tic;
|
||||
uint32_t swz[4];
|
||||
uint32_t depth;
|
||||
struct nvc0_tic_entry *view;
|
||||
struct nv50_tic_entry *view;
|
||||
struct nvc0_miptree *mt = nvc0_miptree(texture);
|
||||
boolean tex_int;
|
||||
|
||||
view = MALLOC_STRUCT(nvc0_tic_entry);
|
||||
view = MALLOC_STRUCT(nv50_tic_entry);
|
||||
if (!view)
|
||||
return NULL;
|
||||
|
||||
|
|
@ -148,6 +148,7 @@ nvc0_create_sampler_view(struct pipe_context *pipe,
|
|||
break;
|
||||
case PIPE_BUFFER:
|
||||
tic[2] |= NV50_TIC_2_TARGET_BUFFER | NV50_TIC_2_LINEAR;
|
||||
break;
|
||||
default:
|
||||
NOUVEAU_ERR("invalid texture target: %d\n", mt->base.base.target);
|
||||
return FALSE;
|
||||
|
|
@ -180,7 +181,7 @@ nvc0_validate_tic(struct nvc0_context *nvc0, int s)
|
|||
boolean need_flush = FALSE;
|
||||
|
||||
for (i = 0; i < nvc0->num_textures[s]; ++i) {
|
||||
struct nvc0_tic_entry *tic = nvc0_tic_entry(nvc0->textures[s][i]);
|
||||
struct nv50_tic_entry *tic = nv50_tic_entry(nvc0->textures[s][i]);
|
||||
struct nv04_resource *res;
|
||||
|
||||
if (!tic) {
|
||||
|
|
@ -258,7 +259,7 @@ nvc0_validate_tsc(struct nvc0_context *nvc0, int s)
|
|||
boolean need_flush = FALSE;
|
||||
|
||||
for (i = 0; i < nvc0->num_samplers[s]; ++i) {
|
||||
struct nvc0_tsc_entry *tsc = nvc0_tsc_entry(nvc0->samplers[s][i]);
|
||||
struct nv50_tsc_entry *tsc = nv50_tsc_entry(nvc0->samplers[s][i]);
|
||||
|
||||
if (!tsc) {
|
||||
BEGIN_RING(chan, RING_3D(BIND_TSC(s)), 1);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue