From d291f134b93e30ed7948b22f98d601c3049ddd95 Mon Sep 17 00:00:00 2001 From: Patrice Mandin Date: Sat, 23 Aug 2008 22:27:36 +0200 Subject: Add image blit setup --- Makefile | 5 +++-- imageblit.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ imageblit.h | 7 +++++++ main.c | 19 +++++++------------ object.c | 11 ++++++++++- object.h | 11 +++++++++-- 6 files changed, 80 insertions(+), 17 deletions(-) create mode 100644 imageblit.c create mode 100644 imageblit.h diff --git a/Makefile b/Makefile index a02407c..c61bf20 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,8 @@ SOURCES = main.c screen.c fifo.c object.c test_nops.c \ - tcl_init.c tcl_triangle.c + tcl_init.c tcl_triangle.c imageblit.c HEADERS = screen.h fifo.h object.h test_nops.h \ - tcl_init.h tcl_triangle.h nv30_fpinst.h + tcl_init.h tcl_triangle.h imageblit.h \ + nv30_fpinst.h OBJECTS = $(SOURCES:%.c=%.o) diff --git a/imageblit.c b/imageblit.c new file mode 100644 index 0000000..af8d54a --- /dev/null +++ b/imageblit.c @@ -0,0 +1,44 @@ +#include + +#include "screen.h" +#include "object.h" +#include "fifo.h" +#include "nouveau_class.h" + +void imageblit_init(void) +{ + printf("--ImageBlit, init\n"); + + SetSubchannel(NvSubImageBlit, NvImageBlit); + + BEGIN_RING(NvSubImageBlit, NV04_IMAGE_BLIT_SURFACE, 1); + OUT_RING(NvCtxSurf2D); + BEGIN_RING(NvSubImageBlit, NV04_IMAGE_BLIT_CLIP_RECTANGLE, 1); + OUT_RING(NvClipRect); + BEGIN_RING(NvSubImageBlit, NV04_IMAGE_BLIT_PATTERN, 1); + OUT_RING(NvImagePattern); + BEGIN_RING(NvSubImageBlit, NV04_IMAGE_BLIT_ROP, 1); + OUT_RING(NvRasterOp); + BEGIN_RING(NvSubImageBlit, NV04_IMAGE_BLIT_OPERATION, 1); + OUT_RING(NV04_IMAGE_BLIT_OPERATION_SRCCOPY); + + FIRE_RING(); +} + +void imageblit_copy(int sx,int sy, int dx,int dy, int w,int h) +{ + SetSubchannel(NvSubImageBlit, NvImageBlit); + + BEGIN_RING(NvSubImageBlit, NV04_IMAGE_BLIT_SURFACE, 1); + OUT_RING (NvCtxSurf2D); + + BEGIN_RING(NvSubImageBlit, NV04_IMAGE_BLIT_OPERATION, 1); + OUT_RING (NV04_IMAGE_BLIT_OPERATION_SRCCOPY); + + BEGIN_RING(NvSubImageBlit, NV01_IMAGE_BLIT_POINT_IN, 3); + OUT_RING ((sy<<16)|sx); + OUT_RING ((dy<<16)|dx); + OUT_RING ((h<<16)|w); + + FIRE_RING(); +} diff --git a/imageblit.h b/imageblit.h new file mode 100644 index 0000000..9f1c471 --- /dev/null +++ b/imageblit.h @@ -0,0 +1,7 @@ +#ifndef IMAGEBLIT_H +#define IMAGEBLIT_H + +void imageblit_init(void); +void imageblit_copy(int sx,int sy, int dx,int dy, int w,int h); + +#endif diff --git a/main.c b/main.c index 5ce53c6..b843482 100644 --- a/main.c +++ b/main.c @@ -7,6 +7,7 @@ #include "nouveau_class.h" #include "test_nops.h" +#include "imageblit.h" #include "tcl_init.h" #include "tcl_triangle.h" @@ -20,33 +21,27 @@ int main(int argc, char **argv) if (screen_open(2960, 1050, 32)!=0) { return -1; } - fflush(stdout); if (fifo_open()!=0) { screen_close(); return -1; } - fflush(stdout); if (object_list_create(CLASS_3D)!=0) { screen_close(); return -1; } - fflush(stdout); - /*test_nops(); - fflush(stdout);*/ + /*test_nops();*/ + + imageblit_init(); + /*imageblit_copy(16,16, 100,100, 64, 64);*/ tcl_init(); - fflush(stdout); - tcl_clear(); - fflush(stdout); + /*tcl_clear();*/ tcl_triangle_fixed(); - fflush(stdout); - - /*tcl_triangle_vtxattr(); - fflush(stdout);*/ + /*tcl_triangle_vtxattr();*/ printf("coincoin\n"); diff --git a/object.c b/object.c index 63e4f3c..c47096a 100644 --- a/object.c +++ b/object.c @@ -29,11 +29,20 @@ int object_list_create(int class_3d) if (object_create(Nv3D, class_3d)!=0) { return 1; } - if (object_create(NvCtxSurf2D, NV10_CONTEXT_SURFACES_2D)!=0) { + if (object_create(NvCtxSurf2D, NV30_CONTEXT_SURFACES_2D)!=0) { return 1; } if (object_create(NvImageBlit, NV12_IMAGE_BLIT)!=0) { return 1; } + if (object_create(NvImagePattern, NV04_IMAGE_PATTERN)!=0) { + return 1; + } + if (object_create(NvRasterOp, NV03_CONTEXT_ROP)!=0) { + return 1; + } + if (object_create(NvClipRect, NV01_CONTEXT_CLIP_RECTANGLE)!=0) { + return 1; + } return 0; } diff --git a/object.h b/object.h index 55747e8..e92867d 100644 --- a/object.h +++ b/object.h @@ -1,4 +1,5 @@ #ifndef OBJECT_H +#define OBJECT_H /* Defines */ @@ -7,13 +8,19 @@ enum Objects { NvDmaTT = 0xD0AA0001, Nv3D = 0x80970001, NvImageBlit = 0x809F0001, - NvCtxSurf2D = 0x80620001 + NvCtxSurf2D = 0x80620001, + NvRasterOp = 0x80430001, + NvClipRect = 0x80190001, + NvImagePattern = 0x80440001 }; enum Subchannels { NvSubCtxSurf2D = 0, NvSubImageBlit = 1, - NvSub3D = 2 + NvSub3D = 2, + NvSubRasterOp = 3, + NvSubClipRect = 4, + NvSubImagePattern = 5 }; /* Functions */ -- cgit v1.2.3