xemu/hw/xbox/nv2a/pgraph/glsl/common.h

107 lines
3.5 KiB
C

/*
* Geforce NV2A PGRAPH GLSL Shader Generator
*
* Copyright (c) 2015 espes
* Copyright (c) 2015 Jannik Vogel
* Copyright (c) 2025 Matt Borgerson
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#ifndef HW_NV2A_SHADERS_COMMON_H
#define HW_NV2A_SHADERS_COMMON_H
#include "qemu/osdep.h"
#include "qemu/mstring.h"
typedef int ivec4[4];
typedef float mat2[2 * 2];
typedef unsigned int uint;
typedef float vec2[2];
typedef float vec3[3];
typedef float vec4[4];
#define UNIFORM_ELEMENT_TYPE_X(DECL) \
DECL(float) \
DECL(int) \
DECL(ivec4) \
DECL(mat2) \
DECL(uint) \
DECL(vec2) \
DECL(vec3) \
DECL(vec4)
enum UniformElementType {
#define DECL_UNIFORM_ELEMENT_TYPE(type) UniformElementType_##type,
UNIFORM_ELEMENT_TYPE_X(DECL_UNIFORM_ELEMENT_TYPE)
};
extern const char *uniform_element_type_to_str[];
#define DECL_UNIFORM_ENUM_VALUE(s, name, type, count) s##_##name,
#define DECL_UNIFORM_ENUM_TYPE(name, decls) \
enum name##Indices{ \
decls(name, DECL_UNIFORM_ENUM_VALUE) name##__COUNT, \
};
#define DECL_UNIFORM_LOC_STRUCT_TYPE(name, decls) \
typedef int name##Locs[name##__COUNT];
#define DECL_UNIFORM_VAL_STRUCT_FIELD(s, name, type, count) type name[count];
#define DECL_UNIFORM_VAL_STRUCT_TYPE(name, decls) \
typedef struct name##Values { \
decls(name, DECL_UNIFORM_VAL_STRUCT_FIELD) \
} name##Values;
typedef struct UniformInfo {
const char *name;
enum UniformElementType type;
size_t size;
size_t count;
size_t val_offs;
} UniformInfo;
#define DECL_UNIFORM_INFO_ITEM(s, name, type, count) \
{ #name, UniformElementType_##type, sizeof(type), count, \
offsetof(s##Values, name) },
#define DECL_UNIFORM_INFO_ARR(name, decls) \
extern const UniformInfo name##Info[];
#define DEF_UNIFORM_INFO_ARR(name, decls) \
const UniformInfo name##Info[] = { decls(name, DECL_UNIFORM_INFO_ITEM) };
#define DECL_UNIFORM_TYPES(name, decls) \
DECL_UNIFORM_ENUM_TYPE(name, decls) \
DECL_UNIFORM_LOC_STRUCT_TYPE(name, decls) \
DECL_UNIFORM_VAL_STRUCT_TYPE(name, decls) \
DECL_UNIFORM_INFO_ARR(name, decls)
#define GLSL_C(idx) "c[" stringify(idx) "]"
#define GLSL_LTCTXA(idx) "ltctxa[" stringify(idx) "]"
#define GLSL_C_MAT4(idx) \
"mat4(" GLSL_C(idx) ", " GLSL_C(idx+1) ", " \
GLSL_C(idx+2) ", " GLSL_C(idx+3) ")"
#define GLSL_DEFINE(a, b) "#define " stringify(a) " " b "\n"
MString *pgraph_glsl_get_vtx_header(MString *out, bool location, bool smooth,
bool in, bool prefix, bool array);
typedef struct PGRAPHState PGRAPHState;
void pgraph_glsl_set_clip_range_uniform_value(PGRAPHState *pg,
float clipRange[4]);
#endif