mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-26 04:40:39 +02:00
nv50: 3d driver skeleton
This commit is contained in:
parent
97f8c39d91
commit
47b418b8fa
22 changed files with 1079 additions and 5 deletions
|
|
@ -8,7 +8,8 @@ MINIGLX_SOURCES =
|
|||
|
||||
PIPE_DRIVERS = \
|
||||
$(TOP)/src/mesa/pipe/softpipe/libsoftpipe.a \
|
||||
$(TOP)/src/mesa/pipe/nv40/libnv40.a
|
||||
$(TOP)/src/mesa/pipe/nv40/libnv40.a \
|
||||
$(TOP)/src/mesa/pipe/nv50/libnv50.a
|
||||
|
||||
DRIVER_SOURCES = \
|
||||
nouveau_bo.c \
|
||||
|
|
|
|||
|
|
@ -181,6 +181,10 @@ nouveau_pipe_create(struct nouveau_context *nv)
|
|||
case 0x40:
|
||||
hw_create = nv40_create;
|
||||
break;
|
||||
case 0x50:
|
||||
case 0x80:
|
||||
hw_create = nv50_create;
|
||||
break;
|
||||
default:
|
||||
NOUVEAU_ERR("Unknown chipset NV%02x\n", (int)nv->chipset);
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ nv50_region_fill(struct nouveau_context *nv,
|
|||
OUT_RING (dst->pitch);
|
||||
OUT_RING (dst->height);
|
||||
|
||||
BEGIN_RING(Nv2D, 0x0580, 4);
|
||||
BEGIN_RING(Nv2D, 0x0580, 3);
|
||||
OUT_RING (4);
|
||||
OUT_RING (rect_format);
|
||||
OUT_RING (value);
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ default:
|
|||
cd i915simple ; make
|
||||
cd failover ; make
|
||||
cd nv40; make
|
||||
cd nv50; make
|
||||
|
||||
clean:
|
||||
rm -f `find . -name \*.[oa]`
|
||||
|
|
|
|||
|
|
@ -67,4 +67,7 @@ struct nouveau_winsys {
|
|||
extern struct pipe_context *
|
||||
nv40_create(struct pipe_winsys *, struct nouveau_winsys *, unsigned chipset);
|
||||
|
||||
extern struct pipe_context *
|
||||
nv50_create(struct pipe_winsys *, struct nouveau_winsys *, unsigned chipset);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
#include "pipe/draw/draw_vertex.h"
|
||||
|
||||
#include "pipe/nouveau/nouveau_winsys.h"
|
||||
#include "pipe/nouveau/nouveau_gldefs.h"
|
||||
|
||||
#include "nv40_state.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -6,8 +6,6 @@
|
|||
#include "nv40_dma.h"
|
||||
#include "nv40_state.h"
|
||||
|
||||
#include "nvgl_pipe.h"
|
||||
|
||||
static void *
|
||||
nv40_alpha_test_state_create(struct pipe_context *pipe,
|
||||
const struct pipe_alpha_test_state *cso)
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@
|
|||
#include "nv40_context.h"
|
||||
#include "nv40_dma.h"
|
||||
#include "nv40_state.h"
|
||||
#include "nvgl_pipe.h"
|
||||
|
||||
boolean
|
||||
nv40_draw_arrays(struct pipe_context *pipe, unsigned mode, unsigned start,
|
||||
|
|
|
|||
26
src/mesa/pipe/nv50/Makefile
Normal file
26
src/mesa/pipe/nv50/Makefile
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
TOP = ../../../..
|
||||
include $(TOP)/configs/current
|
||||
|
||||
LIBNAME = nv50
|
||||
|
||||
DRIVER_SOURCES = \
|
||||
nv50_clear.c \
|
||||
nv50_context.c \
|
||||
nv50_draw.c \
|
||||
nv50_miptree.c \
|
||||
nv50_query.c \
|
||||
nv50_region.c \
|
||||
nv50_state.c \
|
||||
nv50_surface.c \
|
||||
nv50_vbo.c
|
||||
|
||||
C_SOURCES = \
|
||||
$(COMMON_SOURCES) \
|
||||
$(DRIVER_SOURCES)
|
||||
|
||||
ASM_SOURCES =
|
||||
|
||||
include ../Makefile.template
|
||||
|
||||
symlinks:
|
||||
|
||||
15
src/mesa/pipe/nv50/nv50_clear.c
Normal file
15
src/mesa/pipe/nv50/nv50_clear.c
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "pipe/p_state.h"
|
||||
|
||||
#include "nv50_context.h"
|
||||
#include "nv50_dma.h"
|
||||
|
||||
|
||||
void
|
||||
nv50_clear(struct pipe_context *pipe, struct pipe_surface *ps,
|
||||
unsigned clearValue)
|
||||
{
|
||||
pipe->region_fill(pipe, ps->region, 0, 0, 0, ps->width, ps->height,
|
||||
clearValue);
|
||||
}
|
||||
215
src/mesa/pipe/nv50/nv50_context.c
Normal file
215
src/mesa/pipe/nv50/nv50_context.c
Normal file
|
|
@ -0,0 +1,215 @@
|
|||
#include "pipe/draw/draw_context.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "pipe/p_winsys.h"
|
||||
#include "pipe/p_util.h"
|
||||
|
||||
#include "nv50_context.h"
|
||||
#include "nv50_dma.h"
|
||||
|
||||
static boolean
|
||||
nv50_is_format_supported(struct pipe_context *pipe, uint format)
|
||||
{
|
||||
switch (format) {
|
||||
case PIPE_FORMAT_U_A8_R8_G8_B8:
|
||||
case PIPE_FORMAT_Z24_S8:
|
||||
return TRUE;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static const char *
|
||||
nv50_get_name(struct pipe_context *pipe)
|
||||
{
|
||||
struct nv50_context *nv50 = (struct nv50_context *)pipe;
|
||||
static char buffer[128];
|
||||
|
||||
snprintf(buffer, sizeof(buffer), "NV%02X", nv50->chipset);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static const char *
|
||||
nv50_get_vendor(struct pipe_context *pipe)
|
||||
{
|
||||
return "nouveau";
|
||||
}
|
||||
|
||||
static int
|
||||
nv50_get_param(struct pipe_context *pipe, int param)
|
||||
{
|
||||
switch (param) {
|
||||
case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
|
||||
return 32;
|
||||
case PIPE_CAP_NPOT_TEXTURES:
|
||||
return 0;
|
||||
case PIPE_CAP_TWO_SIDED_STENCIL:
|
||||
return 1;
|
||||
case PIPE_CAP_GLSL:
|
||||
return 0;
|
||||
case PIPE_CAP_S3TC:
|
||||
return 0;
|
||||
case PIPE_CAP_ANISOTROPIC_FILTER:
|
||||
return 0;
|
||||
case PIPE_CAP_POINT_SPRITE:
|
||||
return 0;
|
||||
case PIPE_CAP_MAX_RENDER_TARGETS:
|
||||
return 8;
|
||||
case PIPE_CAP_OCCLUSION_QUERY:
|
||||
return 0;
|
||||
case PIPE_CAP_TEXTURE_SHADOW_MAP:
|
||||
return 0;
|
||||
case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
|
||||
return 13;
|
||||
case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
|
||||
return 10;
|
||||
case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
|
||||
return 13;
|
||||
default:
|
||||
NOUVEAU_ERR("Unknown PIPE_CAP %d\n", param);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static float
|
||||
nv50_get_paramf(struct pipe_context *pipe, int param)
|
||||
{
|
||||
switch (param) {
|
||||
case PIPE_CAP_MAX_LINE_WIDTH:
|
||||
case PIPE_CAP_MAX_LINE_WIDTH_AA:
|
||||
return 10.0;
|
||||
case PIPE_CAP_MAX_POINT_WIDTH:
|
||||
case PIPE_CAP_MAX_POINT_WIDTH_AA:
|
||||
return 64.0;
|
||||
case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
|
||||
return 16.0;
|
||||
case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
|
||||
return 4.0;
|
||||
default:
|
||||
NOUVEAU_ERR("Unknown PIPE_CAP %d\n", param);
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_flush(struct pipe_context *pipe, unsigned flags)
|
||||
{
|
||||
struct nv50_context *nv50 = (struct nv50_context *)pipe;
|
||||
struct nouveau_winsys *nvws = nv50->nvws;
|
||||
|
||||
if (flags & PIPE_FLUSH_WAIT) {
|
||||
nvws->notifier_reset(nv50->sync, 0);
|
||||
BEGIN_RING(tesla, 0x104, 1);
|
||||
OUT_RING (0);
|
||||
BEGIN_RING(tesla, 0x100, 1);
|
||||
OUT_RING (0);
|
||||
}
|
||||
|
||||
FIRE_RING();
|
||||
|
||||
if (flags & PIPE_FLUSH_WAIT)
|
||||
nvws->notifier_wait(nv50->sync, 0, 0, 2000);
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_destroy(struct pipe_context *pipe)
|
||||
{
|
||||
struct nv50_context *nv50 = (struct nv50_context *)pipe;
|
||||
|
||||
draw_destroy(nv50->draw);
|
||||
free(nv50);
|
||||
}
|
||||
|
||||
static boolean
|
||||
nv50_init_hwctx(struct nv50_context *nv50, int tesla_class)
|
||||
{
|
||||
struct nouveau_winsys *nvws = nv50->nvws;
|
||||
int ret;
|
||||
|
||||
if ((ret = nvws->grobj_alloc(nvws, tesla_class, &nv50->tesla))) {
|
||||
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BEGIN_RING(tesla, NV50TCL_DMA_NOTIFY, 1);
|
||||
OUT_RING (nv50->sync->handle);
|
||||
|
||||
FIRE_RING ();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#define GRCLASS5097_CHIPSETS 0x00000000
|
||||
#define GRCLASS8297_CHIPSETS 0x00000010
|
||||
struct pipe_context *
|
||||
nv50_create(struct pipe_winsys *pipe_winsys, struct nouveau_winsys *nvws,
|
||||
unsigned chipset)
|
||||
{
|
||||
struct nv50_context *nv50;
|
||||
int tesla_class, ret;
|
||||
|
||||
if ((chipset & 0xf0) != 0x50 && (chipset & 0xf0) != 0x80) {
|
||||
NOUVEAU_ERR("Not a G8x chipset\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (GRCLASS5097_CHIPSETS & (1 << (chipset & 0x0f))) {
|
||||
tesla_class = 0x5097;
|
||||
} else
|
||||
if (GRCLASS8297_CHIPSETS & (1 << (chipset & 0x0f))) {
|
||||
tesla_class = 0x8297;
|
||||
} else {
|
||||
NOUVEAU_ERR("Unknown G8x chipset: NV%02x\n", chipset);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
nv50 = CALLOC_STRUCT(nv50_context);
|
||||
if (!nv50)
|
||||
return NULL;
|
||||
nv50->chipset = chipset;
|
||||
nv50->nvws = nvws;
|
||||
|
||||
if ((ret = nvws->notifier_alloc(nvws, 1, &nv50->sync))) {
|
||||
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
|
||||
free(nv50);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!nv50_init_hwctx(nv50, tesla_class)) {
|
||||
free(nv50);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
nv50->pipe.winsys = pipe_winsys;
|
||||
|
||||
nv50->pipe.destroy = nv50_destroy;
|
||||
nv50->pipe.is_format_supported = nv50_is_format_supported;
|
||||
nv50->pipe.get_name = nv50_get_name;
|
||||
nv50->pipe.get_vendor = nv50_get_vendor;
|
||||
nv50->pipe.get_param = nv50_get_param;
|
||||
nv50->pipe.get_paramf = nv50_get_paramf;
|
||||
|
||||
nv50->pipe.draw_arrays = nv50_draw_arrays;
|
||||
nv50->pipe.draw_elements = nv50_draw_elements;
|
||||
nv50->pipe.clear = nv50_clear;
|
||||
|
||||
nv50->pipe.begin_query = nv50_query_begin;
|
||||
nv50->pipe.end_query = nv50_query_end;
|
||||
nv50->pipe.wait_query = nv50_query_wait;
|
||||
|
||||
nv50->pipe.mipmap_tree_layout = nv50_miptree_layout;
|
||||
|
||||
nv50->pipe.flush = nv50_flush;
|
||||
|
||||
nv50_init_region_functions(nv50);
|
||||
nv50_init_surface_functions(nv50);
|
||||
nv50_init_state_functions(nv50);
|
||||
|
||||
nv50->draw = draw_create();
|
||||
assert(nv50->draw);
|
||||
draw_set_rasterize_stage(nv50->draw, nv50_draw_render_stage(nv50));
|
||||
|
||||
return &nv50->pipe;
|
||||
}
|
||||
|
||||
|
||||
62
src/mesa/pipe/nv50/nv50_context.h
Normal file
62
src/mesa/pipe/nv50/nv50_context.h
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
#ifndef __NV50_CONTEXT_H__
|
||||
#define __NV50_CONTEXT_H__
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "pipe/p_state.h"
|
||||
|
||||
#include "pipe/draw/draw_vertex.h"
|
||||
|
||||
#include "pipe/nouveau/nouveau_winsys.h"
|
||||
#include "pipe/nouveau/nouveau_gldefs.h"
|
||||
|
||||
#include "nv50_state.h"
|
||||
|
||||
#define NOUVEAU_ERR(fmt, args...) \
|
||||
fprintf(stderr, "%s:%d - "fmt, __func__, __LINE__, ##args);
|
||||
#define NOUVEAU_MSG(fmt, args...) \
|
||||
fprintf(stderr, "nouveau: "fmt, ##args);
|
||||
|
||||
struct nv50_context {
|
||||
struct pipe_context pipe;
|
||||
struct nouveau_winsys *nvws;
|
||||
|
||||
struct draw_context *draw;
|
||||
|
||||
int chipset;
|
||||
struct nouveau_grobj *tesla;
|
||||
struct nouveau_notifier *sync;
|
||||
uint32_t *pushbuf;
|
||||
};
|
||||
|
||||
|
||||
extern void nv50_init_region_functions(struct nv50_context *nv50);
|
||||
extern void nv50_init_surface_functions(struct nv50_context *nv50);
|
||||
extern void nv50_init_state_functions(struct nv50_context *nv50);
|
||||
|
||||
/* nv50_draw.c */
|
||||
extern struct draw_stage *nv50_draw_render_stage(struct nv50_context *nv50);
|
||||
|
||||
/* nv50_miptree.c */
|
||||
extern boolean nv50_miptree_layout(struct pipe_context *,
|
||||
struct pipe_mipmap_tree *);
|
||||
/* nv50_vbo.c */
|
||||
extern boolean nv50_draw_arrays(struct pipe_context *, unsigned mode,
|
||||
unsigned start, unsigned count);
|
||||
extern boolean nv50_draw_elements(struct pipe_context *pipe,
|
||||
struct pipe_buffer_handle *indexBuffer,
|
||||
unsigned indexSize,
|
||||
unsigned mode, unsigned start,
|
||||
unsigned count);
|
||||
|
||||
/* nv50_clear.c */
|
||||
extern void nv50_clear(struct pipe_context *pipe, struct pipe_surface *ps,
|
||||
unsigned clearValue);
|
||||
|
||||
/* nv50_query.c */
|
||||
extern void nv50_query_begin(struct pipe_context *, struct pipe_query_object *);
|
||||
extern void nv50_query_end(struct pipe_context *, struct pipe_query_object *);
|
||||
extern void nv50_query_wait(struct pipe_context *, struct pipe_query_object *);
|
||||
|
||||
|
||||
#endif
|
||||
62
src/mesa/pipe/nv50/nv50_dma.h
Normal file
62
src/mesa/pipe/nv50/nv50_dma.h
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
#ifndef __NV50_DMA_H__
|
||||
#define __NV50_DMA_H__
|
||||
|
||||
#include "pipe/nouveau/nouveau_winsys.h"
|
||||
|
||||
#define BEGIN_RING(obj,mthd,size) do { \
|
||||
nv50->pushbuf = nv50->nvws->begin_ring(nv50->obj, (mthd), (size)); \
|
||||
} while(0)
|
||||
|
||||
#define BEGIN_RING_NI(obj,mthd,size) do { \
|
||||
BEGIN_RING(obj, (mthd) | 0x40000000, (size)); \
|
||||
} while(0)
|
||||
|
||||
#define OUT_RING(data) do { \
|
||||
(*nv50->pushbuf++) = (data); \
|
||||
} while(0)
|
||||
|
||||
#define OUT_RINGp(src,size) do { \
|
||||
memcpy(nv50->pushbuf, (src), (size) * 4); \
|
||||
nv50->pushbuf += (size); \
|
||||
} while(0)
|
||||
|
||||
#define OUT_RINGf(data) do { \
|
||||
union { float v; uint32_t u; } c; \
|
||||
c.v = (data); \
|
||||
OUT_RING(c.u); \
|
||||
} while(0)
|
||||
|
||||
#define FIRE_RING() do { \
|
||||
nv50->nvws->fire_ring(nv50->nvws->channel); \
|
||||
} while(0)
|
||||
|
||||
#define OUT_RELOC(bo,data,flags,vor,tor) do { \
|
||||
nv50->nvws->out_reloc(nv50->nvws->channel, nv50->pushbuf, \
|
||||
(struct nouveau_bo *)(bo), \
|
||||
(data), (flags), (vor), (tor)); \
|
||||
OUT_RING(0); \
|
||||
} while(0)
|
||||
|
||||
/* Raw data + flags depending on FB/TT buffer */
|
||||
#define OUT_RELOCd(bo,data,flags,vor,tor) do { \
|
||||
OUT_RELOC((bo), (data), (flags) | NOUVEAU_BO_OR, (vor), (tor)); \
|
||||
} while(0)
|
||||
|
||||
/* FB/TT object handle */
|
||||
#define OUT_RELOCo(bo,flags) do { \
|
||||
OUT_RELOC((bo), 0, (flags) | NOUVEAU_BO_OR, \
|
||||
nv50->nvws->channel->vram->handle, \
|
||||
nv50->nvws->channel->gart->handle); \
|
||||
} while(0)
|
||||
|
||||
/* Low 32-bits of offset */
|
||||
#define OUT_RELOCl(bo,delta,flags) do { \
|
||||
OUT_RELOC((bo), (delta), (flags) | NOUVEAU_BO_LOW, 0, 0); \
|
||||
} while(0)
|
||||
|
||||
/* High 32-bits of offset */
|
||||
#define OUT_RELOCh(bo,delta,flags) do { \
|
||||
OUT_RELOC((bo), (delta), (flags) | NOUVEAU_BO_HIGH, 0, 0); \
|
||||
} while(0)
|
||||
|
||||
#endif
|
||||
63
src/mesa/pipe/nv50/nv50_draw.c
Normal file
63
src/mesa/pipe/nv50/nv50_draw.c
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
#include "pipe/draw/draw_private.h"
|
||||
#include "pipe/p_util.h"
|
||||
|
||||
#include "nv50_context.h"
|
||||
|
||||
struct nv50_draw_stage {
|
||||
struct draw_stage draw;
|
||||
struct nv50_context *nv50;
|
||||
};
|
||||
|
||||
static void
|
||||
nv50_draw_begin(struct draw_stage *draw)
|
||||
{
|
||||
NOUVEAU_ERR("\n");
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_draw_end(struct draw_stage *draw)
|
||||
{
|
||||
NOUVEAU_ERR("\n");
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_draw_point(struct draw_stage *draw, struct prim_header *prim)
|
||||
{
|
||||
NOUVEAU_ERR("\n");
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_draw_line(struct draw_stage *draw, struct prim_header *prim)
|
||||
{
|
||||
NOUVEAU_ERR("\n");
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_draw_tri(struct draw_stage *draw, struct prim_header *prim)
|
||||
{
|
||||
NOUVEAU_ERR("\n");
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_draw_reset_stipple_counter(struct draw_stage *draw)
|
||||
{
|
||||
NOUVEAU_ERR("\n");
|
||||
}
|
||||
|
||||
struct draw_stage *
|
||||
nv50_draw_render_stage(struct nv50_context *nv50)
|
||||
{
|
||||
struct nv50_draw_stage *nv50draw = CALLOC_STRUCT(nv50_draw_stage);
|
||||
|
||||
nv50draw->nv50 = nv50;
|
||||
nv50draw->draw.draw = nv50->draw;
|
||||
nv50draw->draw.begin = nv50_draw_begin;
|
||||
nv50draw->draw.point = nv50_draw_point;
|
||||
nv50draw->draw.line = nv50_draw_line;
|
||||
nv50draw->draw.tri = nv50_draw_tri;
|
||||
nv50draw->draw.end = nv50_draw_end;
|
||||
nv50draw->draw.reset_stipple_counter = nv50_draw_reset_stipple_counter;
|
||||
|
||||
return &nv50draw->draw;
|
||||
}
|
||||
|
||||
13
src/mesa/pipe/nv50/nv50_miptree.c
Normal file
13
src/mesa/pipe/nv50/nv50_miptree.c
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
#include "pipe/p_state.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "pipe/p_util.h"
|
||||
|
||||
#include "nv50_context.h"
|
||||
|
||||
boolean
|
||||
nv50_miptree_layout(struct pipe_context *pipe, struct pipe_mipmap_tree *mt)
|
||||
{
|
||||
NOUVEAU_ERR("unimplemented\n");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
23
src/mesa/pipe/nv50/nv50_query.c
Normal file
23
src/mesa/pipe/nv50/nv50_query.c
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
#include "pipe/p_context.h"
|
||||
|
||||
#include "nv50_context.h"
|
||||
#include "nv50_dma.h"
|
||||
|
||||
void
|
||||
nv50_query_begin(struct pipe_context *pipe, struct pipe_query_object *q)
|
||||
{
|
||||
NOUVEAU_ERR("unimplemented\n");
|
||||
}
|
||||
|
||||
void
|
||||
nv50_query_end(struct pipe_context *pipe, struct pipe_query_object *q)
|
||||
{
|
||||
NOUVEAU_ERR("unimplemented\n");
|
||||
}
|
||||
|
||||
void
|
||||
nv50_query_wait(struct pipe_context *pipe, struct pipe_query_object *q)
|
||||
{
|
||||
NOUVEAU_ERR("unimplemented\n");
|
||||
}
|
||||
|
||||
85
src/mesa/pipe/nv50/nv50_region.c
Normal file
85
src/mesa/pipe/nv50/nv50_region.c
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
#include "pipe/p_defines.h"
|
||||
#include "pipe/p_winsys.h"
|
||||
|
||||
#include "nv50_context.h"
|
||||
#include "nv50_dma.h"
|
||||
|
||||
static ubyte *
|
||||
nv50_region_map(struct pipe_context *pipe, struct pipe_region *region)
|
||||
{
|
||||
struct nv50_context *nv50 = (struct nv50_context *)pipe;
|
||||
struct pipe_winsys *ws = nv50->pipe.winsys;
|
||||
|
||||
if (!region->map_refcount++) {
|
||||
region->map = ws->buffer_map(ws, region->buffer,
|
||||
PIPE_BUFFER_FLAG_WRITE |
|
||||
PIPE_BUFFER_FLAG_READ);
|
||||
}
|
||||
|
||||
return region->map;
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_region_unmap(struct pipe_context *pipe, struct pipe_region *region)
|
||||
{
|
||||
struct nv50_context *nv50 = (struct nv50_context *)pipe;
|
||||
struct pipe_winsys *ws = nv50->pipe.winsys;
|
||||
|
||||
if (!--region->map_refcount) {
|
||||
ws->buffer_unmap(ws, region->buffer);
|
||||
region->map = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_region_data(struct pipe_context *pipe,
|
||||
struct pipe_region *dst,
|
||||
unsigned dst_offset,
|
||||
unsigned dstx, unsigned dsty,
|
||||
const void *src, unsigned src_pitch,
|
||||
unsigned srcx, unsigned srcy, unsigned width, unsigned height)
|
||||
{
|
||||
struct nv50_context *nv50 = (struct nv50_context *)pipe;
|
||||
struct nouveau_winsys *nvws = nv50->nvws;
|
||||
|
||||
nvws->region_data(nvws, dst, dst_offset, dstx, dsty,
|
||||
src, src_pitch, srcx, srcy, width, height);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
nv50_region_copy(struct pipe_context *pipe, struct pipe_region *dst,
|
||||
unsigned dst_offset, unsigned dstx, unsigned dsty,
|
||||
struct pipe_region *src, unsigned src_offset,
|
||||
unsigned srcx, unsigned srcy, unsigned width, unsigned height)
|
||||
{
|
||||
struct nv50_context *nv50 = (struct nv50_context *)pipe;
|
||||
struct nouveau_winsys *nvws = nv50->nvws;
|
||||
|
||||
nvws->region_copy(nvws, dst, dst_offset, dstx, dsty,
|
||||
src, src_offset, srcx, srcy, width, height);
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_region_fill(struct pipe_context *pipe,
|
||||
struct pipe_region *dst, unsigned dst_offset,
|
||||
unsigned dstx, unsigned dsty,
|
||||
unsigned width, unsigned height, unsigned value)
|
||||
{
|
||||
struct nv50_context *nv50 = (struct nv50_context *)pipe;
|
||||
struct nouveau_winsys *nvws = nv50->nvws;
|
||||
|
||||
nvws->region_fill(nvws, dst, dst_offset, dstx, dsty,
|
||||
width, height, value);
|
||||
}
|
||||
|
||||
void
|
||||
nv50_init_region_functions(struct nv50_context *nv50)
|
||||
{
|
||||
nv50->pipe.region_map = nv50_region_map;
|
||||
nv50->pipe.region_unmap = nv50_region_unmap;
|
||||
nv50->pipe.region_data = nv50_region_data;
|
||||
nv50->pipe.region_copy = nv50_region_copy;
|
||||
nv50->pipe.region_fill = nv50_region_fill;
|
||||
}
|
||||
|
||||
242
src/mesa/pipe/nv50/nv50_state.c
Normal file
242
src/mesa/pipe/nv50/nv50_state.c
Normal file
|
|
@ -0,0 +1,242 @@
|
|||
#include "pipe/p_state.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "pipe/p_util.h"
|
||||
|
||||
#include "nv50_context.h"
|
||||
#include "nv50_dma.h"
|
||||
#include "nv50_state.h"
|
||||
|
||||
static void *
|
||||
nv50_alpha_test_state_create(struct pipe_context *pipe,
|
||||
const struct pipe_alpha_test_state *cso)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_alpha_test_state_bind(struct pipe_context *pipe, void *hwcso)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_alpha_test_state_delete(struct pipe_context *pipe, void *hwcso)
|
||||
{
|
||||
}
|
||||
|
||||
static void *
|
||||
nv50_blend_state_create(struct pipe_context *pipe,
|
||||
const struct pipe_blend_state *cso)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_blend_state_bind(struct pipe_context *pipe, void *hwcso)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_blend_state_delete(struct pipe_context *pipe, void *hwcso)
|
||||
{
|
||||
}
|
||||
|
||||
static void *
|
||||
nv50_sampler_state_create(struct pipe_context *pipe,
|
||||
const struct pipe_sampler_state *cso)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_sampler_state_bind(struct pipe_context *pipe, unsigned unit,
|
||||
void *hwcso)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_sampler_state_delete(struct pipe_context *pipe, void *hwcso)
|
||||
{
|
||||
}
|
||||
|
||||
static void *
|
||||
nv50_rasterizer_state_create(struct pipe_context *pipe,
|
||||
const struct pipe_rasterizer_state *cso)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_rasterizer_state_bind(struct pipe_context *pipe, void *hwcso)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_rasterizer_state_delete(struct pipe_context *pipe, void *hwcso)
|
||||
{
|
||||
}
|
||||
|
||||
static void *
|
||||
nv50_depth_stencil_state_create(struct pipe_context *pipe,
|
||||
const struct pipe_depth_stencil_state *cso)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_depth_stencil_state_bind(struct pipe_context *pipe, void *hwcso)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_depth_stencil_state_delete(struct pipe_context *pipe, void *hwcso)
|
||||
{
|
||||
}
|
||||
|
||||
static void *
|
||||
nv50_vp_state_create(struct pipe_context *pipe,
|
||||
const struct pipe_shader_state *cso)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_vp_state_bind(struct pipe_context *pipe, void *hwcso)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_vp_state_delete(struct pipe_context *pipe, void *hwcso)
|
||||
{
|
||||
}
|
||||
|
||||
static void *
|
||||
nv50_fp_state_create(struct pipe_context *pipe,
|
||||
const struct pipe_shader_state *cso)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_fp_state_bind(struct pipe_context *pipe, void *hwcso)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_fp_state_delete(struct pipe_context *pipe, void *hwcso)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_set_blend_color(struct pipe_context *pipe,
|
||||
const struct pipe_blend_color *bcol)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_set_clip_state(struct pipe_context *pipe,
|
||||
const struct pipe_clip_state *clip)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_set_clear_color_state(struct pipe_context *pipe,
|
||||
const struct pipe_clear_color_state *ccol)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
|
||||
const struct pipe_constant_buffer *buf )
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_set_framebuffer_state(struct pipe_context *pipe,
|
||||
const struct pipe_framebuffer_state *fb)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_set_polygon_stipple(struct pipe_context *pipe,
|
||||
const struct pipe_poly_stipple *stipple)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_set_sampler_units(struct pipe_context *pipe,
|
||||
uint num_samplers, const uint *units)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_set_scissor_state(struct pipe_context *pipe,
|
||||
const struct pipe_scissor_state *s)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_set_texture_state(struct pipe_context *pipe, unsigned unit,
|
||||
struct pipe_mipmap_tree *miptree)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_set_viewport_state(struct pipe_context *pipe,
|
||||
const struct pipe_viewport_state *vpt)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_set_vertex_buffer(struct pipe_context *pipe, unsigned index,
|
||||
const struct pipe_vertex_buffer *vb)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_set_vertex_element(struct pipe_context *pipe, unsigned index,
|
||||
const struct pipe_vertex_element *ve)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
nv50_init_state_functions(struct nv50_context *nv50)
|
||||
{
|
||||
nv50->pipe.create_alpha_test_state = nv50_alpha_test_state_create;
|
||||
nv50->pipe.bind_alpha_test_state = nv50_alpha_test_state_bind;
|
||||
nv50->pipe.delete_alpha_test_state = nv50_alpha_test_state_delete;
|
||||
|
||||
nv50->pipe.create_blend_state = nv50_blend_state_create;
|
||||
nv50->pipe.bind_blend_state = nv50_blend_state_bind;
|
||||
nv50->pipe.delete_blend_state = nv50_blend_state_delete;
|
||||
|
||||
nv50->pipe.create_sampler_state = nv50_sampler_state_create;
|
||||
nv50->pipe.bind_sampler_state = nv50_sampler_state_bind;
|
||||
nv50->pipe.delete_sampler_state = nv50_sampler_state_delete;
|
||||
|
||||
nv50->pipe.create_rasterizer_state = nv50_rasterizer_state_create;
|
||||
nv50->pipe.bind_rasterizer_state = nv50_rasterizer_state_bind;
|
||||
nv50->pipe.delete_rasterizer_state = nv50_rasterizer_state_delete;
|
||||
|
||||
nv50->pipe.create_depth_stencil_state = nv50_depth_stencil_state_create;
|
||||
nv50->pipe.bind_depth_stencil_state = nv50_depth_stencil_state_bind;
|
||||
nv50->pipe.delete_depth_stencil_state = nv50_depth_stencil_state_delete;
|
||||
|
||||
nv50->pipe.create_vs_state = nv50_vp_state_create;
|
||||
nv50->pipe.bind_vs_state = nv50_vp_state_bind;
|
||||
nv50->pipe.delete_vs_state = nv50_vp_state_delete;
|
||||
|
||||
nv50->pipe.create_fs_state = nv50_fp_state_create;
|
||||
nv50->pipe.bind_fs_state = nv50_fp_state_bind;
|
||||
nv50->pipe.delete_fs_state = nv50_fp_state_delete;
|
||||
|
||||
nv50->pipe.set_blend_color = nv50_set_blend_color;
|
||||
nv50->pipe.set_clip_state = nv50_set_clip_state;
|
||||
nv50->pipe.set_clear_color_state = nv50_set_clear_color_state;
|
||||
nv50->pipe.set_constant_buffer = nv50_set_constant_buffer;
|
||||
nv50->pipe.set_framebuffer_state = nv50_set_framebuffer_state;
|
||||
nv50->pipe.set_polygon_stipple = nv50_set_polygon_stipple;
|
||||
nv50->pipe.set_sampler_units = nv50_set_sampler_units;
|
||||
nv50->pipe.set_scissor_state = nv50_set_scissor_state;
|
||||
nv50->pipe.set_texture_state = nv50_set_texture_state;
|
||||
nv50->pipe.set_viewport_state = nv50_set_viewport_state;
|
||||
|
||||
nv50->pipe.set_vertex_buffer = nv50_set_vertex_buffer;
|
||||
nv50->pipe.set_vertex_element = nv50_set_vertex_element;
|
||||
|
||||
// nv50->pipe.set_feedback_state = nv50_set_feedback_state;
|
||||
// nv50->pipe.set_feedback_buffer = nv50_set_feedback_buffer;
|
||||
}
|
||||
|
||||
7
src/mesa/pipe/nv50/nv50_state.h
Normal file
7
src/mesa/pipe/nv50/nv50_state.h
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
#ifndef __NV50_STATE_H__
|
||||
#define __NV50_STATE_H__
|
||||
|
||||
#include "pipe/p_state.h"
|
||||
|
||||
|
||||
#endif
|
||||
229
src/mesa/pipe/nv50/nv50_surface.c
Normal file
229
src/mesa/pipe/nv50/nv50_surface.c
Normal file
|
|
@ -0,0 +1,229 @@
|
|||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#include "nv50_context.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "pipe/p_util.h"
|
||||
#include "pipe/p_winsys.h"
|
||||
#include "pipe/p_inlines.h"
|
||||
|
||||
|
||||
#define CLIP_TILE \
|
||||
do { \
|
||||
if (x >= ps->width) \
|
||||
return; \
|
||||
if (y >= ps->height) \
|
||||
return; \
|
||||
if (x + w > ps->width) \
|
||||
w = ps->width - x; \
|
||||
if (y + h > ps->height) \
|
||||
h = ps->height -y; \
|
||||
} while(0)
|
||||
|
||||
|
||||
/**
|
||||
* Note: this is exactly like a8r8g8b8_get_tile() in sp_surface.c
|
||||
* Share it someday.
|
||||
*/
|
||||
static void
|
||||
nv50_get_tile_rgba(struct pipe_context *pipe,
|
||||
struct pipe_surface *ps,
|
||||
uint x, uint y, uint w, uint h, float *p)
|
||||
{
|
||||
const unsigned *src
|
||||
= ((const unsigned *) (ps->region->map + ps->offset))
|
||||
+ y * ps->region->pitch + x;
|
||||
unsigned i, j;
|
||||
unsigned w0 = w;
|
||||
|
||||
CLIP_TILE;
|
||||
|
||||
switch (ps->format) {
|
||||
case PIPE_FORMAT_U_A8_R8_G8_B8:
|
||||
for (i = 0; i < h; i++) {
|
||||
float *pRow = p;
|
||||
for (j = 0; j < w; j++) {
|
||||
const unsigned pixel = src[j];
|
||||
pRow[0] = UBYTE_TO_FLOAT((pixel >> 16) & 0xff);
|
||||
pRow[1] = UBYTE_TO_FLOAT((pixel >> 8) & 0xff);
|
||||
pRow[2] = UBYTE_TO_FLOAT((pixel >> 0) & 0xff);
|
||||
pRow[3] = UBYTE_TO_FLOAT((pixel >> 24) & 0xff);
|
||||
pRow += 4;
|
||||
}
|
||||
src += ps->region->pitch;
|
||||
p += w0 * 4;
|
||||
}
|
||||
break;
|
||||
case PIPE_FORMAT_Z24_S8:
|
||||
{
|
||||
const float scale = 1.0 / (float) 0xffffff;
|
||||
for (i = 0; i < h; i++) {
|
||||
float *pRow = p;
|
||||
for (j = 0; j < w; j++) {
|
||||
const unsigned pixel = src[j];
|
||||
pRow[0] =
|
||||
pRow[1] =
|
||||
pRow[2] =
|
||||
pRow[3] = ((pixel & 0xffffff) >> 8) * scale;
|
||||
pRow += 4;
|
||||
}
|
||||
src += ps->region->pitch;
|
||||
p += w0 * 4;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
nv50_put_tile_rgba(struct pipe_context *pipe,
|
||||
struct pipe_surface *ps,
|
||||
uint x, uint y, uint w, uint h, const float *p)
|
||||
{
|
||||
/* TODO */
|
||||
assert(0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* XXX note: same as code in sp_surface.c
|
||||
*/
|
||||
static void
|
||||
nv50_get_tile(struct pipe_context *pipe,
|
||||
struct pipe_surface *ps,
|
||||
uint x, uint y, uint w, uint h,
|
||||
void *p, int dst_stride)
|
||||
{
|
||||
const uint cpp = ps->region->cpp;
|
||||
const uint w0 = w;
|
||||
const ubyte *pSrc;
|
||||
ubyte *pDest;
|
||||
uint i;
|
||||
|
||||
assert(ps->region->map);
|
||||
|
||||
CLIP_TILE;
|
||||
|
||||
if (dst_stride == 0) {
|
||||
dst_stride = w0 * cpp;
|
||||
}
|
||||
|
||||
pSrc = ps->region->map + ps->offset + (y * ps->region->pitch + x) * cpp;
|
||||
pDest = (ubyte *) p;
|
||||
|
||||
for (i = 0; i < h; i++) {
|
||||
memcpy(pDest, pSrc, w0 * cpp);
|
||||
pDest += dst_stride;
|
||||
pSrc += ps->region->pitch * cpp;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* XXX note: same as code in sp_surface.c
|
||||
*/
|
||||
static void
|
||||
nv50_put_tile(struct pipe_context *pipe,
|
||||
struct pipe_surface *ps,
|
||||
uint x, uint y, uint w, uint h,
|
||||
const void *p, int src_stride)
|
||||
{
|
||||
const uint cpp = ps->region->cpp;
|
||||
const uint w0 = w;
|
||||
const ubyte *pSrc;
|
||||
ubyte *pDest;
|
||||
uint i;
|
||||
|
||||
assert(ps->region->map);
|
||||
|
||||
CLIP_TILE;
|
||||
|
||||
if (src_stride == 0) {
|
||||
src_stride = w0 * cpp;
|
||||
}
|
||||
|
||||
pSrc = (const ubyte *) p;
|
||||
pDest = ps->region->map + ps->offset + (y * ps->region->pitch + x) * cpp;
|
||||
|
||||
for (i = 0; i < h; i++) {
|
||||
memcpy(pDest, pSrc, w0 * cpp);
|
||||
pDest += ps->region->pitch * cpp;
|
||||
pSrc += src_stride;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* XXX note: same as code in sp_surface.c
|
||||
*/
|
||||
static struct pipe_surface *
|
||||
nv50_get_tex_surface(struct pipe_context *pipe,
|
||||
struct pipe_mipmap_tree *mt,
|
||||
unsigned face, unsigned level, unsigned zslice)
|
||||
{
|
||||
struct pipe_surface *ps;
|
||||
unsigned offset; /* in bytes */
|
||||
|
||||
offset = mt->level[level].level_offset;
|
||||
|
||||
if (mt->target == PIPE_TEXTURE_CUBE) {
|
||||
offset += mt->level[level].image_offset[face] * mt->cpp;
|
||||
}
|
||||
else if (mt->target == PIPE_TEXTURE_3D) {
|
||||
offset += mt->level[level].image_offset[zslice] * mt->cpp;
|
||||
}
|
||||
else {
|
||||
assert(face == 0);
|
||||
assert(zslice == 0);
|
||||
}
|
||||
|
||||
ps = pipe->winsys->surface_alloc(pipe->winsys, mt->format);
|
||||
if (ps) {
|
||||
assert(ps->format);
|
||||
assert(ps->refcount);
|
||||
pipe_region_reference(&ps->region, mt->region);
|
||||
ps->width = mt->level[level].width;
|
||||
ps->height = mt->level[level].height;
|
||||
ps->offset = offset;
|
||||
}
|
||||
return ps;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
nv50_init_surface_functions(struct nv50_context *nv50)
|
||||
{
|
||||
nv50->pipe.get_tex_surface = nv50_get_tex_surface;
|
||||
nv50->pipe.get_tile = nv50_get_tile;
|
||||
nv50->pipe.put_tile = nv50_put_tile;
|
||||
nv50->pipe.get_tile_rgba = nv50_get_tile_rgba;
|
||||
nv50->pipe.put_tile_rgba = nv50_put_tile_rgba;
|
||||
}
|
||||
25
src/mesa/pipe/nv50/nv50_vbo.c
Normal file
25
src/mesa/pipe/nv50/nv50_vbo.c
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_state.h"
|
||||
#include "pipe/p_util.h"
|
||||
|
||||
#include "nv50_context.h"
|
||||
#include "nv50_dma.h"
|
||||
#include "nv50_state.h"
|
||||
|
||||
boolean
|
||||
nv50_draw_arrays(struct pipe_context *pipe, unsigned mode, unsigned start,
|
||||
unsigned count)
|
||||
{
|
||||
NOUVEAU_ERR("unimplemented\n");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
boolean
|
||||
nv50_draw_elements(struct pipe_context *pipe,
|
||||
struct pipe_buffer_handle *indexBuffer, unsigned indexSize,
|
||||
unsigned mode, unsigned start, unsigned count)
|
||||
{
|
||||
NOUVEAU_ERR("unimplemented\n");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Loading…
Add table
Reference in a new issue