nouveau: Use bufferobj interface for fragment program uploads

This commit is contained in:
Ben Skeggs
2006-12-27 23:52:40 +11:00
parent 9a20ae70ec
commit 8c180c72d5
2 changed files with 20 additions and 21 deletions
@@ -2,7 +2,7 @@
#define __SHADER_COMMON_H__
#include "mtypes.h"
#include "nouveau_buffers.h"
#include "bufferobj.h"
typedef struct _nvsFunc nvsFunc;
@@ -41,7 +41,7 @@ typedef struct _nouveauShader {
unsigned int program_alloc_size;
unsigned int program_start_id;
unsigned int program_current;
nouveau_mem *program_buffer;
struct gl_buffer_object *program_buffer;
unsigned int inputs_read;
unsigned int outputs_written;
int inst_count;
+18 -19
View File
@@ -10,7 +10,7 @@
#include "nouveau_shader.h"
#include "nouveau_object.h"
#include "nouveau_msg.h"
#include "nouveau_buffers.h"
#include "nouveau_bufferobj.h"
#include "nv30_shader.h"
unsigned int NVFP_TX_AOP_COUNT = 64;
@@ -24,29 +24,28 @@ static void
NV30FPUploadToHW(GLcontext *ctx, nouveauShader *nvs)
{
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
uint32_t offset;
if (!nvs->program_buffer) {
nouveau_mem *fpbuf;
if (!nvs->program_buffer)
nvs->program_buffer = ctx->Driver.NewBufferObject(ctx, 0,
GL_ARRAY_BUFFER_ARB);
fpbuf = nouveau_mem_alloc(ctx, NOUVEAU_MEM_FB|NOUVEAU_MEM_MAPPED,
nvs->program_size * sizeof(uint32_t), 0);
if (!fpbuf) {
fprintf(stderr, "fragprog vram alloc fail!\n");
return;
}
nvs->program_buffer = fpbuf;
}
/* Should use STATIC_DRAW_ARB if shader doesn't use changable params */
ctx->Driver.BufferData(ctx, GL_ARRAY_BUFFER_ARB,
nvs->program_size * sizeof(uint32_t),
(const GLvoid *)nvs->program,
GL_DYNAMIC_DRAW_ARB,
nvs->program_buffer);
/*XXX: should do a DMA.. and not copy over a possibly in-use program.. */
/* not using state cache here, updated programs at the same address
* seem to not take effect unless ACTIVE_PROGRAM is called again. hw
* caches the program somewhere? so, maybe not so bad to just clobber the
* old program in vram..
offset = nouveau_bufferobj_gpu_ref(ctx, GL_READ_ONLY_ARB,
nvs->program_buffer);
/* Not using state cache here, updated programs at the same address don't
* seem to take effect unless the ACTIVE_PROGRAM method is called again.
* HW caches the program somewhere?
*/
memcpy(nvs->program_buffer->map, nvs->program,
nvs->program_size * sizeof(uint32_t));
BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FP_ACTIVE_PROGRAM, 1);
OUT_RING(nouveau_mem_gpu_offset_get(ctx, nvs->program_buffer) | 1);
OUT_RING (offset | 1);
}
static void