X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fnvfx%2Fnvfx_state.h;h=15e1cbb1986703cf6202f5ca6ef76fe47b14191a;hb=695cc370a280a637f411f5ff3877b3fd1c05e424;hp=e585246879b8a53a081ffb335c9bb94ac9e1ead0;hpb=ee30e24f5f9cc2ec6c5a3edbe498e5e0334f788b;p=mesa.git diff --git a/src/gallium/drivers/nvfx/nvfx_state.h b/src/gallium/drivers/nvfx/nvfx_state.h index e585246879b..15e1cbb1986 100644 --- a/src/gallium/drivers/nvfx/nvfx_state.h +++ b/src/gallium/drivers/nvfx/nvfx_state.h @@ -2,12 +2,14 @@ #define __NVFX_STATE_H__ #include "pipe/p_state.h" +#include "pipe/p_video_state.h" #include "tgsi/tgsi_scan.h" +#include "nouveau/nouveau_statebuf.h" +#include "util/u_dynarray.h" +#include "util/u_linkage.h" struct nvfx_vertex_program_exec { uint32_t data[4]; - boolean has_branch_offset; - int const_index; }; struct nvfx_vertex_program_data { @@ -16,19 +18,16 @@ struct nvfx_vertex_program_data { }; struct nvfx_vertex_program { - struct pipe_shader_state pipe; - - struct draw_vertex_shader *draw; - - boolean translated; - - struct pipe_clip_state ucp; + unsigned long long id; struct nvfx_vertex_program_exec *insns; unsigned nr_insns; struct nvfx_vertex_program_data *consts; unsigned nr_consts; + char generic_to_fp_input[256]; + int sprite_fp_input; + struct nouveau_resource *exec; unsigned exec_start; struct nouveau_resource *data; @@ -37,8 +36,24 @@ struct nvfx_vertex_program { uint32_t ir; uint32_t or; - uint32_t clip_ctrl; - struct nouveau_stateobj *so; + int clip_nr; + + struct util_dynarray branch_relocs; + struct util_dynarray const_relocs; +}; + +#define NVFX_VP_FAILED ((struct nvfx_vertex_program*)-1) + +struct nvfx_pipe_vertex_program { + struct pipe_shader_state pipe; + struct tgsi_shader_info info; + + unsigned draw_elements; + boolean draw_no_elements; + struct draw_vertex_shader *draw_vs; + struct nvfx_vertex_program* draw_vp; + + struct nvfx_vertex_program* vp; }; struct nvfx_fragment_program_data { @@ -46,12 +61,18 @@ struct nvfx_fragment_program_data { unsigned index; }; -struct nvfx_fragment_program { - struct pipe_shader_state pipe; - struct tgsi_shader_info info; +struct nvfx_fragment_program_bo { + struct nvfx_fragment_program_bo* next; + struct nouveau_bo* bo; + unsigned char* slots; + char insn[] __attribute__((aligned(16))); +}; - boolean translated; +struct nvfx_fragment_program { unsigned samplers; + unsigned point_sprite_control; + unsigned or; + unsigned coord_conventions; uint32_t *insn; int insn_len; @@ -59,25 +80,36 @@ struct nvfx_fragment_program { struct nvfx_fragment_program_data *consts; unsigned nr_consts; - struct pipe_buffer *buffer; + /* the slot at num_slots is for the sprite coordinate, if any */ + unsigned num_slots; /* how many input semantics? */ + unsigned char slot_to_generic[10]; /* semantics */ + unsigned char slot_to_fp_input[11]; /* current assignment of slots for each used semantic */ + struct util_dynarray slot_relocations[11]; + + /* This is reset to progs on any relocation update, and decreases every time we + * move to a new prog due to a constant update + * When this is the same as progs, applying relocations is no longer necessary. + */ + unsigned progs_left_with_obsolete_slot_assignments; + + unsigned long long last_vp_id; + unsigned last_sprite_coord_enable; uint32_t fp_control; - struct nouveau_stateobj *so; -}; -#define NVFX_MAX_TEXTURE_LEVELS 16 + unsigned bo_prog_idx; + unsigned prog_size; + unsigned progs_per_bo; + unsigned progs; -struct nvfx_miptree { - struct pipe_texture base; - struct nouveau_bo *bo; + struct nvfx_fragment_program_bo* fpbo; +}; - struct pipe_buffer *buffer; - uint total_size; +struct nvfx_pipe_fragment_program { + struct pipe_shader_state pipe; + struct tgsi_shader_info info; - struct { - uint pitch; - uint *image_offset; - } level[NVFX_MAX_TEXTURE_LEVELS]; + struct nvfx_fragment_program* fps[2]; }; #endif