v3d_X_thing; \
})
+/* FIXME: The same for vulkan/opengl. Common place? define it at the
+ * v3d_packet files?
+ */
+#define V3D33_CLIPPER_XY_GRANULARITY 256.0f
+#define V3D42_CLIPPER_XY_GRANULARITY 256.0f
+#define V3D71_CLIPPER_XY_GRANULARITY 64.0f
+
+/* Helper to get hw-specific macro values */
+#define V3DV_X(devinfo, thing) ({ \
+ __typeof(V3D33_##thing) V3D_X_THING; \
+ switch (devinfo->ver) { \
+ case 33: \
+ case 40: \
+ V3D_X_THING = V3D33_##thing; \
+ break; \
+ case 41: \
+ case 42: \
+ V3D_X_THING = V3D42_##thing; \
+ break; \
+ case 71: \
+ V3D_X_THING = V3D71_##thing; \
+ break; \
+ default: \
+ unreachable("Unsupported hardware generation"); \
+ } \
+ V3D_X_THING; \
+})
+
#ifdef v3dX
# include "v3dx_context.h"
#else
struct v3d_compiled_shader *shader,
enum pipe_shader_type stage)
{
+ struct v3d_device_info *devinfo = &v3d->screen->devinfo;
struct v3d_constbuf_stateobj *cb = &v3d->constbuf[stage];
struct v3d_texture_stateobj *texstate = &v3d->tex[stage];
struct v3d_uniform_list *uinfo = &shader->prog_data.base->uniforms;
case QUNIFORM_UNIFORM:
cl_aligned_u32(&uniforms, gallium_uniforms[data]);
break;
- case QUNIFORM_VIEWPORT_X_SCALE:
- cl_aligned_f(&uniforms, v3d->viewport.scale[0] * 256.0f);
+ case QUNIFORM_VIEWPORT_X_SCALE: {
+ float clipper_xy_granularity = V3DV_X(devinfo, CLIPPER_XY_GRANULARITY);
+ cl_aligned_f(&uniforms, v3d->viewport.scale[0] * clipper_xy_granularity);
break;
- case QUNIFORM_VIEWPORT_Y_SCALE:
- cl_aligned_f(&uniforms, v3d->viewport.scale[1] * 256.0f);
+ }
+ case QUNIFORM_VIEWPORT_Y_SCALE: {
+ float clipper_xy_granularity = V3DV_X(devinfo, CLIPPER_XY_GRANULARITY);
+ cl_aligned_f(&uniforms, v3d->viewport.scale[1] * clipper_xy_granularity);
break;
-
+ }
case QUNIFORM_VIEWPORT_Z_OFFSET:
cl_aligned_f(&uniforms, v3d->viewport.translate[2]);
break;