Path: blob/21.2-virgl/src/gallium/frontends/nine/nine_ff.h
4561 views
1#ifndef _NINE_FF_H_2#define _NINE_FF_H_34#include "device9.h"5#include "vertexdeclaration9.h"67boolean nine_ff_init(struct NineDevice9 *);8void nine_ff_fini(struct NineDevice9 *);910void nine_ff_update(struct NineDevice9 *);1112void13nine_d3d_matrix_matrix_mul(D3DMATRIX *, const D3DMATRIX *, const D3DMATRIX *);1415void16nine_d3d_vector4_matrix_mul(D3DVECTOR *, const D3DVECTOR *, const D3DMATRIX *);17void18nine_d3d_vector3_matrix_mul(D3DVECTOR *, const D3DVECTOR *, const D3DMATRIX *);1920float21nine_d3d_matrix_det(const D3DMATRIX *);2223void24nine_d3d_matrix_inverse(D3DMATRIX *, const D3DMATRIX *);2526void27nine_d3d_matrix_transpose(D3DMATRIX *, const D3DMATRIX *);2829#define NINED3DTSS_TCI_DISABLE 030#define NINED3DTSS_TCI_PASSTHRU 131#define NINED3DTSS_TCI_CAMERASPACENORMAL 232#define NINED3DTSS_TCI_CAMERASPACEPOSITION 333#define NINED3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR 434#define NINED3DTSS_TCI_SPHEREMAP 53536static inline unsigned37nine_decltype_get_dim(BYTE type)38{39switch (type) {40case D3DDECLTYPE_FLOAT1: return 1;41case D3DDECLTYPE_FLOAT2: return 2;42case D3DDECLTYPE_FLOAT3: return 3;43case D3DDECLTYPE_FLOAT4: return 4;44case D3DDECLTYPE_D3DCOLOR: return 1;45case D3DDECLTYPE_UBYTE4: return 4;46case D3DDECLTYPE_SHORT2: return 2;47case D3DDECLTYPE_SHORT4: return 4;48case D3DDECLTYPE_UBYTE4N: return 4;49case D3DDECLTYPE_SHORT2N: return 2;50case D3DDECLTYPE_SHORT4N: return 4;51case D3DDECLTYPE_USHORT2N: return 2;52case D3DDECLTYPE_USHORT4N: return 4;53case D3DDECLTYPE_UDEC3: return 3;54case D3DDECLTYPE_DEC3N: return 3;55case D3DDECLTYPE_FLOAT16_2: return 2;56case D3DDECLTYPE_FLOAT16_4: return 4;57default:58assert(!"Implementation error !");59}60return 0;61}6263static inline uint16_t64nine_ff_get_projected_key(struct nine_context *context, unsigned num_stages)65{66unsigned s, i;67uint16_t projected = 0;68char input_texture_coord[num_stages];69memset(&input_texture_coord, 0, sizeof(input_texture_coord));7071if (context->vdecl) {72for (i = 0; i < context->vdecl->nelems; i++) {73uint16_t usage = context->vdecl->usage_map[i];74if (usage % NINE_DECLUSAGE_COUNT == NINE_DECLUSAGE_TEXCOORD) {75s = usage / NINE_DECLUSAGE_COUNT;76if (s < num_stages)77input_texture_coord[s] = nine_decltype_get_dim(context->vdecl->decls[i].Type);78}79}80}8182for (s = 0; s < num_stages; ++s) {83unsigned gen = (context->ff.tex_stage[s][D3DTSS_TEXCOORDINDEX] >> 16) + 1;84unsigned dim = context->ff.tex_stage[s][D3DTSS_TEXTURETRANSFORMFLAGS] & 0x7;85unsigned proj = !!(context->ff.tex_stage[s][D3DTSS_TEXTURETRANSFORMFLAGS] & D3DTTFF_PROJECTED);8687if (!context->vs) {88if (dim > 4)89dim = input_texture_coord[s];9091if (!dim && gen == NINED3DTSS_TCI_PASSTHRU)92dim = input_texture_coord[s];93else if (!dim)94dim = 4;9596if (dim == 1) /* NV behaviour */97proj = 0;98if (dim > input_texture_coord[s] && gen == NINED3DTSS_TCI_PASSTHRU)99proj = 0;100} else {101dim = 4;102}103if (proj)104projected |= (dim-1) << (2 * s);105}106return projected;107}108109static inline uint16_t110nine_ff_get_projected_key_ff(struct nine_context *context)111{112/* 8 stages */113return nine_ff_get_projected_key(context, 8);114}115116static inline uint8_t117nine_ff_get_projected_key_programmable(struct nine_context *context)118{119/* We only look at the 4 stages because this function120* is used only for ps 1.1-3, where only the first four121* slots are available */122return (uint8_t)nine_ff_get_projected_key(context, 4);123}124125#endif /* _NINE_FF_H_ */126127128