}
cl_emit(&job->bcl, VIEWPORT_OFFSET, vp) {
- vp.fine_x = vptranslate[0];
- vp.fine_y = vptranslate[1];
+ float vp_fine_x = vptranslate[0];
+ float vp_fine_y = vptranslate[1];
+ int32_t vp_coarse_x = 0;
+ int32_t vp_coarse_y = 0;
+
+ /* The fine coordinates must be unsigned, but coarse can be signed */
+ if (unlikely(vp_fine_x < 0)) {
+ int32_t blocks_64 = DIV_ROUND_UP(fabsf(vp_fine_x), 64);
+ vp_fine_x += 64.0f * blocks_64;
+ vp_coarse_x -= blocks_64;
+ }
+
+ if (unlikely(vp_fine_y < 0)) {
+ int32_t blocks_64 = DIV_ROUND_UP(fabsf(vp_fine_y), 64);
+ vp_fine_y += 64.0f * blocks_64;
+ vp_coarse_y -= blocks_64;
+ }
+
+ vp.fine_x = vp_fine_x;
+ vp.fine_y = vp_fine_y;
+ vp.coarse_x = vp_coarse_x;
+ vp.coarse_y = vp_coarse_y;
}
cmd_buffer->state.dirty &= ~V3DV_CMD_DIRTY_VIEWPORT;
vp.viewport_centre_y_coordinate =
v3d->viewport.translate[1];
#else
- vp.fine_x = v3d->viewport.translate[0];
- vp.fine_y = v3d->viewport.translate[1];
+ float vp_fine_x = v3d->viewport.translate[0];
+ float vp_fine_y = v3d->viewport.translate[1];
+ int32_t vp_coarse_x = 0;
+ int32_t vp_coarse_y = 0;
+
+ /* The fine coordinates must be unsigned, but coarse
+ * can be signed.
+ */
+ if (unlikely(vp_fine_x < 0)) {
+ int32_t blocks_64 =
+ DIV_ROUND_UP(fabsf(vp_fine_x), 64);
+ vp_fine_x += 64.0f * blocks_64;
+ vp_coarse_x -= blocks_64;
+ }
+
+ if (unlikely(vp_fine_y < 0)) {
+ int32_t blocks_64 =
+ DIV_ROUND_UP(fabsf(vp_fine_y), 64);
+ vp_fine_y += 64.0f * blocks_64;
+ vp_coarse_y -= blocks_64;
+ }
+
+ vp.fine_x = vp_fine_x;
+ vp.fine_y = vp_fine_y;
+ vp.coarse_x = vp_coarse_x;
+ vp.coarse_y = vp_coarse_y;
#endif
}
}