#include "nvfx_resource.h"
#include "nouveau/nouveau_channel.h"
+#include "nouveau/nouveau_class.h"
#include "nouveau/nouveau_pushbuf.h"
#include "nouveau/nouveau_util.h"
struct pipe_transfer *transfer;
struct nouveau_channel* chan = nvfx->screen->base.channel;
void *map;
+ float *v;
map = pipe_buffer_map(&nvfx->pipe, vb->buffer, PIPE_TRANSFER_READ, &transfer);
- map += vb->buffer_offset + ve->src_offset;
+ map = (uint8_t *) map + vb->buffer_offset + ve->src_offset;
- float *v = map;
+ v = map;
switch (ncomp) {
case 4:
nvfx_vbo_set_idxbuf(nvfx, NULL, 0);
if (nvfx->screen->force_swtnl || !nvfx_state_validate(nvfx)) {
- nvfx_draw_elements_swtnl(pipe, NULL, 0,
+ nvfx_draw_elements_swtnl(pipe, NULL, 0, 0,
mode, start, count);
return;
}
while (count) {
- unsigned vc, nr;
+ unsigned vc, nr, avail;
nvfx_state_emit(nvfx);
- unsigned avail = AVAIL_RING(chan);
+ avail = AVAIL_RING(chan);
avail -= 16 + (avail >> 10); /* for the BEGIN_RING_NIs, conservatively assuming one every 1024, plus 16 for safety */
vc = nouveau_vbuf_split(avail, 6, 256,
while (count) {
uint8_t *elts = (uint8_t *)ib + start;
- unsigned vc, push, restart = 0;
+ unsigned vc, push, restart = 0, avail;
nvfx_state_emit(nvfx);
- unsigned avail = AVAIL_RING(chan);
+ avail = AVAIL_RING(chan);
avail -= 16 + (avail >> 10); /* for the BEGIN_RING_NIs, conservatively assuming one every 1024, plus 16 for safety */
vc = nouveau_vbuf_split(avail, 6, 2,
while (count) {
uint16_t *elts = (uint16_t *)ib + start;
- unsigned vc, push, restart = 0;
+ unsigned vc, push, restart = 0, avail;
nvfx_state_emit(nvfx);
- unsigned avail = AVAIL_RING(chan);
+ avail = AVAIL_RING(chan);
avail -= 16 + (avail >> 10); /* for the BEGIN_RING_NIs, conservatively assuming one every 1024, plus 16 for safety */
vc = nouveau_vbuf_split(avail, 6, 2,
while (count) {
uint32_t *elts = (uint32_t *)ib + start;
- unsigned vc, push, restart = 0;
+ unsigned vc, push, restart = 0, avail;
nvfx_state_emit(nvfx);
- unsigned avail = AVAIL_RING(chan);
+ avail = AVAIL_RING(chan);
avail -= 16 + (avail >> 10); /* for the BEGIN_RING_NIs, conservatively assuming one every 1024, plus 16 for safety */
vc = nouveau_vbuf_split(avail, 5, 1,
static void
nvfx_draw_elements_inline(struct pipe_context *pipe,
- struct pipe_resource *ib, unsigned ib_size,
+ struct pipe_resource *ib,
+ unsigned ib_size, int ib_bias,
unsigned mode, unsigned start, unsigned count)
{
struct nvfx_context *nvfx = nvfx_context(pipe);
return;
}
+ assert(ib_bias == 0);
+
switch (ib_size) {
case 1:
nvfx_draw_elements_u08(nvfx, map, mode, start, count);
unsigned restart = 0;
while (count) {
- unsigned nr, vc;
+ unsigned nr, vc, avail;
nvfx_state_emit(nvfx);
- unsigned avail = AVAIL_RING(chan);
+ avail = AVAIL_RING(chan);
avail -= 16 + (avail >> 10); /* for the BEGIN_RING_NIs, conservatively assuming one every 1024, plus 16 for safety */
vc = nouveau_vbuf_split(avail, 6, 256,
void
nvfx_draw_elements(struct pipe_context *pipe,
- struct pipe_resource *indexBuffer, unsigned indexSize,
+ struct pipe_resource *indexBuffer,
+ unsigned indexSize, int indexBias,
unsigned mode, unsigned start, unsigned count)
{
struct nvfx_context *nvfx = nvfx_context(pipe);
idxbuf = nvfx_vbo_set_idxbuf(nvfx, indexBuffer, indexSize);
if (nvfx->screen->force_swtnl || !nvfx_state_validate(nvfx)) {
- nvfx_draw_elements_swtnl(pipe, indexBuffer, indexSize,
- mode, start, count);
+ nvfx_draw_elements_swtnl(pipe,
+ indexBuffer, indexSize, indexBias,
+ mode, start, count);
return;
}
if (idxbuf) {
nvfx_draw_elements_vbo(pipe, mode, start, count);
} else {
- nvfx_draw_elements_inline(pipe, indexBuffer, indexSize,
+ nvfx_draw_elements_inline(pipe,
+ indexBuffer, indexSize, indexBias,
mode, start, count);
}