mirror of https://github.com/xemu-project/xemu.git
cleanup nv2a
This commit is contained in:
parent
3ee213e59a
commit
3d33d8101b
|
@ -19,12 +19,27 @@
|
|||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "hw/display/vga_regs.h"
|
||||
#include "qemu/thread.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "nv2a.h"
|
||||
#include <assert.h>
|
||||
|
||||
#include "hw/hw.h"
|
||||
#include "hw/display/vga.h"
|
||||
#include "hw/display/vga_int.h"
|
||||
#include "hw/display/vga_regs.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "cpu.h"
|
||||
|
||||
#include "swizzle.h"
|
||||
|
||||
#include "hw/xbox/nv2a/nv2a_int.h"
|
||||
|
||||
#include "hw/xbox/nv2a/nv2a.h"
|
||||
|
||||
|
||||
#ifdef __WINNT__
|
||||
// HACK: mingw-w64 doesn't provide ffs, for now we just shove it here
|
||||
|
@ -45,7 +60,35 @@ int ffs(register int valu)
|
|||
}
|
||||
#endif
|
||||
|
||||
void update_irq(NV2AState *d)
|
||||
|
||||
#define DEFINE_PROTO(n) \
|
||||
uint64_t n##_read(void *opaque, hwaddr addr, unsigned int size); \
|
||||
void n##_write(void *opaque, hwaddr addr, uint64_t val, unsigned int size);
|
||||
|
||||
DEFINE_PROTO(pmc)
|
||||
DEFINE_PROTO(pbus)
|
||||
DEFINE_PROTO(pfifo)
|
||||
DEFINE_PROTO(prma)
|
||||
DEFINE_PROTO(pvideo)
|
||||
DEFINE_PROTO(ptimer)
|
||||
DEFINE_PROTO(pcounter)
|
||||
DEFINE_PROTO(pvpe)
|
||||
DEFINE_PROTO(ptv)
|
||||
DEFINE_PROTO(prmfb)
|
||||
DEFINE_PROTO(prmvio)
|
||||
DEFINE_PROTO(pfb)
|
||||
DEFINE_PROTO(pstraps)
|
||||
DEFINE_PROTO(pgraph)
|
||||
DEFINE_PROTO(pcrtc)
|
||||
DEFINE_PROTO(prmcio)
|
||||
DEFINE_PROTO(pramdac)
|
||||
DEFINE_PROTO(prmdio)
|
||||
// DEFINE_PROTO(pramin)
|
||||
DEFINE_PROTO(user)
|
||||
|
||||
#undef DEFINE_PROTO
|
||||
|
||||
static void update_irq(NV2AState *d)
|
||||
{
|
||||
/* PFIFO */
|
||||
if (d->pfifo.pending_interrupts & d->pfifo.enabled_interrupts) {
|
||||
|
@ -76,7 +119,7 @@ void update_irq(NV2AState *d)
|
|||
}
|
||||
}
|
||||
|
||||
DMAObject nv_dma_load(NV2AState *d, hwaddr dma_obj_address)
|
||||
static DMAObject nv_dma_load(NV2AState *d, hwaddr dma_obj_address)
|
||||
{
|
||||
assert(dma_obj_address < memory_region_size(&d->ramin));
|
||||
|
||||
|
@ -93,7 +136,7 @@ DMAObject nv_dma_load(NV2AState *d, hwaddr dma_obj_address)
|
|||
};
|
||||
}
|
||||
|
||||
void *nv_dma_map(NV2AState *d, hwaddr dma_obj_address, hwaddr *len)
|
||||
static void *nv_dma_map(NV2AState *d, hwaddr dma_obj_address, hwaddr *len)
|
||||
{
|
||||
DMAObject dma = nv_dma_load(d, dma_obj_address);
|
||||
|
||||
|
@ -113,8 +156,8 @@ void *nv_dma_map(NV2AState *d, hwaddr dma_obj_address, hwaddr *len)
|
|||
#include "nv2a_pbus.c"
|
||||
#include "nv2a_pcrtc.c"
|
||||
#include "nv2a_pfb.c"
|
||||
#include "nv2a_pfifo.c"
|
||||
#include "nv2a_pgraph.c"
|
||||
#include "nv2a_pfifo.c"
|
||||
#include "nv2a_pmc.c"
|
||||
#include "nv2a_pramdac.c"
|
||||
#include "nv2a_prmcio.c"
|
||||
|
@ -157,39 +200,36 @@ const struct NV2ABlockInfo blocktable[] = {
|
|||
|
||||
#undef ENTRY
|
||||
|
||||
const int blocktable_len = ARRAY_SIZE(blocktable);
|
||||
static const char* nv2a_reg_names[] = {};
|
||||
|
||||
// FIXME: Add nv2a_reg_names or remove this code
|
||||
// static const char* nv2a_reg_names[] = {};
|
||||
|
||||
void reg_log_read(int block, hwaddr addr, uint64_t val)
|
||||
static void reg_log_read(int block, hwaddr addr, uint64_t val)
|
||||
{
|
||||
if (blocktable[block].name) {
|
||||
// hwaddr naddr = blocktable[block].offset + addr;
|
||||
// if (naddr < ARRAY_SIZE(nv2a_reg_names) && nv2a_reg_names[naddr]) {
|
||||
// NV2A_DPRINTF("%s: read [%s] -> 0x%" PRIx64 "\n",
|
||||
// blocktable[block].name, nv2a_reg_names[naddr], val);
|
||||
// } else {
|
||||
hwaddr naddr = blocktable[block].offset + addr;
|
||||
if (naddr < ARRAY_SIZE(nv2a_reg_names) && nv2a_reg_names[naddr]) {
|
||||
NV2A_DPRINTF("%s: read [%s] -> 0x%" PRIx64 "\n",
|
||||
blocktable[block].name, nv2a_reg_names[naddr], val);
|
||||
} else {
|
||||
NV2A_DPRINTF("%s: read [%" HWADDR_PRIx "] -> 0x%" PRIx64 "\n",
|
||||
blocktable[block].name, addr, val);
|
||||
// }
|
||||
}
|
||||
} else {
|
||||
NV2A_DPRINTF("(%d?): read [%" HWADDR_PRIx "] -> 0x%" PRIx64 "\n",
|
||||
block, addr, val);
|
||||
}
|
||||
}
|
||||
|
||||
void reg_log_write(int block, hwaddr addr, uint64_t val)
|
||||
static void reg_log_write(int block, hwaddr addr, uint64_t val)
|
||||
{
|
||||
if (blocktable[block].name) {
|
||||
// hwaddr naddr = blocktable[block].offset + addr;
|
||||
// if (naddr < ARRAY_SIZE(nv2a_reg_names) && nv2a_reg_names[naddr]) {
|
||||
// NV2A_DPRINTF("%s: [%s] = 0x%" PRIx64 "\n",
|
||||
// blocktable[block].name, nv2a_reg_names[naddr], val);
|
||||
// } else {
|
||||
hwaddr naddr = blocktable[block].offset + addr;
|
||||
if (naddr < ARRAY_SIZE(nv2a_reg_names) && nv2a_reg_names[naddr]) {
|
||||
NV2A_DPRINTF("%s: [%s] = 0x%" PRIx64 "\n",
|
||||
blocktable[block].name, nv2a_reg_names[naddr], val);
|
||||
} else {
|
||||
NV2A_DPRINTF("%s: [%" HWADDR_PRIx "] = 0x%" PRIx64 "\n",
|
||||
blocktable[block].name, addr, val);
|
||||
// }
|
||||
}
|
||||
} else {
|
||||
NV2A_DPRINTF("(%d?): [%" HWADDR_PRIx "] = 0x%" PRIx64 "\n",
|
||||
block, addr, val);
|
||||
|
|
|
@ -2,8 +2,6 @@
|
|||
* QEMU Geforce NV2A implementation
|
||||
*
|
||||
* Copyright (c) 2012 espes
|
||||
* Copyright (c) 2015 Jannik Vogel
|
||||
* Copyright (c) 2018 Matt Borgerson
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
|
@ -22,369 +20,6 @@
|
|||
#ifndef HW_NV2A_H
|
||||
#define HW_NV2A_H
|
||||
|
||||
#include "hw/hw.h"
|
||||
#include "hw/display/vga.h"
|
||||
#include "hw/display/vga_int.h"
|
||||
#include "hw/i386/pc.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "qapi/qmp/qstring.h"
|
||||
#include "qemu/thread.h"
|
||||
#include "cpu.h"
|
||||
|
||||
#include "g-lru-cache.h"
|
||||
#include "nv2a_debug.h"
|
||||
#include "nv2a_int.h"
|
||||
#include "nv2a_shaders.h"
|
||||
#include "swizzle.h"
|
||||
#include "gl/gloffscreen.h"
|
||||
|
||||
#define USE_TEXTURE_CACHE
|
||||
|
||||
#define GET_MASK(v, mask) (((v) & (mask)) >> (ffs(mask) - 1))
|
||||
|
||||
#define SET_MASK(v, mask, val) \
|
||||
({ \
|
||||
const unsigned int __val = (val); \
|
||||
const unsigned int __mask = (mask); \
|
||||
(v) &= ~(__mask); \
|
||||
(v) |= ((__val) << (ffs(__mask) - 1)) & (__mask); \
|
||||
})
|
||||
|
||||
#define CASE_4(v, step) \
|
||||
case (v): \
|
||||
case ((v) + (step)): \
|
||||
case ((v) + (step) * 2): \
|
||||
case ((v) + (step) * 3)
|
||||
|
||||
|
||||
#define NV2A_DEVICE(obj) OBJECT_CHECK(NV2AState, (obj), "nv2a")
|
||||
|
||||
void reg_log_read(int block, hwaddr addr, uint64_t val);
|
||||
void reg_log_write(int block, hwaddr addr, uint64_t val);
|
||||
|
||||
enum FIFOEngine {
|
||||
ENGINE_SOFTWARE = 0,
|
||||
ENGINE_GRAPHICS = 1,
|
||||
ENGINE_DVD = 2,
|
||||
};
|
||||
|
||||
typedef struct DMAObject {
|
||||
unsigned int dma_class;
|
||||
unsigned int dma_target;
|
||||
hwaddr address;
|
||||
hwaddr limit;
|
||||
} DMAObject;
|
||||
|
||||
typedef struct VertexAttribute {
|
||||
bool dma_select;
|
||||
hwaddr offset;
|
||||
|
||||
/* inline arrays are packed in order?
|
||||
* Need to pass the offset to converted attributes */
|
||||
unsigned int inline_array_offset;
|
||||
|
||||
float inline_value[4];
|
||||
|
||||
unsigned int format;
|
||||
unsigned int size; /* size of the data type */
|
||||
unsigned int count; /* number of components */
|
||||
uint32_t stride;
|
||||
|
||||
bool needs_conversion;
|
||||
uint8_t *converted_buffer;
|
||||
unsigned int converted_elements;
|
||||
unsigned int converted_size;
|
||||
unsigned int converted_count;
|
||||
|
||||
float *inline_buffer;
|
||||
|
||||
GLint gl_count;
|
||||
GLenum gl_type;
|
||||
GLboolean gl_normalize;
|
||||
|
||||
GLuint gl_converted_buffer;
|
||||
GLuint gl_inline_buffer;
|
||||
} VertexAttribute;
|
||||
|
||||
typedef struct Surface {
|
||||
bool draw_dirty;
|
||||
bool buffer_dirty;
|
||||
bool write_enabled_cache;
|
||||
unsigned int pitch;
|
||||
|
||||
hwaddr offset;
|
||||
} Surface;
|
||||
|
||||
typedef struct SurfaceShape {
|
||||
unsigned int z_format;
|
||||
unsigned int color_format;
|
||||
unsigned int zeta_format;
|
||||
unsigned int log_width, log_height;
|
||||
unsigned int clip_x, clip_y;
|
||||
unsigned int clip_width, clip_height;
|
||||
unsigned int anti_aliasing;
|
||||
} SurfaceShape;
|
||||
|
||||
typedef struct TextureShape {
|
||||
bool cubemap;
|
||||
unsigned int dimensionality;
|
||||
unsigned int color_format;
|
||||
unsigned int levels;
|
||||
unsigned int width, height, depth;
|
||||
|
||||
unsigned int min_mipmap_level, max_mipmap_level;
|
||||
unsigned int pitch;
|
||||
} TextureShape;
|
||||
|
||||
typedef struct TextureKey {
|
||||
TextureShape state;
|
||||
uint64_t data_hash;
|
||||
uint8_t *texture_data;
|
||||
uint8_t *palette_data;
|
||||
} TextureKey;
|
||||
|
||||
typedef struct TextureBinding {
|
||||
GLenum gl_target;
|
||||
GLuint gl_texture;
|
||||
unsigned int refcnt;
|
||||
} TextureBinding;
|
||||
|
||||
typedef struct KelvinState {
|
||||
hwaddr object_instance;
|
||||
} KelvinState;
|
||||
|
||||
typedef struct ContextSurfaces2DState {
|
||||
hwaddr object_instance;
|
||||
hwaddr dma_image_source;
|
||||
hwaddr dma_image_dest;
|
||||
unsigned int color_format;
|
||||
unsigned int source_pitch, dest_pitch;
|
||||
hwaddr source_offset, dest_offset;
|
||||
} ContextSurfaces2DState;
|
||||
|
||||
typedef struct ImageBlitState {
|
||||
hwaddr object_instance;
|
||||
hwaddr context_surfaces;
|
||||
unsigned int operation;
|
||||
unsigned int in_x, in_y;
|
||||
unsigned int out_x, out_y;
|
||||
unsigned int width, height;
|
||||
} ImageBlitState;
|
||||
|
||||
typedef struct PGRAPHState {
|
||||
QemuMutex lock;
|
||||
|
||||
uint32_t pending_interrupts;
|
||||
uint32_t enabled_interrupts;
|
||||
QemuCond interrupt_cond;
|
||||
|
||||
/* subchannels state we're not sure the location of... */
|
||||
ContextSurfaces2DState context_surfaces_2d;
|
||||
ImageBlitState image_blit;
|
||||
KelvinState kelvin;
|
||||
|
||||
QemuCond fifo_access_cond;
|
||||
QemuCond flip_3d;
|
||||
|
||||
hwaddr dma_color, dma_zeta;
|
||||
Surface surface_color, surface_zeta;
|
||||
unsigned int surface_type;
|
||||
SurfaceShape surface_shape;
|
||||
SurfaceShape last_surface_shape;
|
||||
|
||||
hwaddr dma_a, dma_b;
|
||||
GLruCache *texture_cache;
|
||||
bool texture_dirty[NV2A_MAX_TEXTURES];
|
||||
TextureBinding *texture_binding[NV2A_MAX_TEXTURES];
|
||||
|
||||
GHashTable *shader_cache;
|
||||
ShaderBinding *shader_binding;
|
||||
|
||||
bool texture_matrix_enable[NV2A_MAX_TEXTURES];
|
||||
|
||||
/* FIXME: Move to NV_PGRAPH_BUMPMAT... */
|
||||
float bump_env_matrix[NV2A_MAX_TEXTURES - 1][4]; /* 3 allowed stages with 2x2 matrix each */
|
||||
|
||||
GloContext *gl_context;
|
||||
GLuint gl_framebuffer;
|
||||
GLuint gl_color_buffer, gl_zeta_buffer;
|
||||
|
||||
hwaddr dma_state;
|
||||
hwaddr dma_notifies;
|
||||
hwaddr dma_semaphore;
|
||||
|
||||
hwaddr dma_report;
|
||||
hwaddr report_offset;
|
||||
bool zpass_pixel_count_enable;
|
||||
unsigned int zpass_pixel_count_result;
|
||||
unsigned int gl_zpass_pixel_count_query_count;
|
||||
GLuint *gl_zpass_pixel_count_queries;
|
||||
|
||||
hwaddr dma_vertex_a, dma_vertex_b;
|
||||
|
||||
unsigned int primitive_mode;
|
||||
|
||||
bool enable_vertex_program_write;
|
||||
|
||||
uint32_t program_data[NV2A_MAX_TRANSFORM_PROGRAM_LENGTH][VSH_TOKEN_SIZE];
|
||||
|
||||
uint32_t vsh_constants[NV2A_VERTEXSHADER_CONSTANTS][4];
|
||||
bool vsh_constants_dirty[NV2A_VERTEXSHADER_CONSTANTS];
|
||||
|
||||
/* lighting constant arrays */
|
||||
uint32_t ltctxa[NV2A_LTCTXA_COUNT][4];
|
||||
bool ltctxa_dirty[NV2A_LTCTXA_COUNT];
|
||||
uint32_t ltctxb[NV2A_LTCTXB_COUNT][4];
|
||||
bool ltctxb_dirty[NV2A_LTCTXB_COUNT];
|
||||
uint32_t ltc1[NV2A_LTC1_COUNT][4];
|
||||
bool ltc1_dirty[NV2A_LTC1_COUNT];
|
||||
|
||||
// should figure out where these are in lighting context
|
||||
float light_infinite_half_vector[NV2A_MAX_LIGHTS][3];
|
||||
float light_infinite_direction[NV2A_MAX_LIGHTS][3];
|
||||
float light_local_position[NV2A_MAX_LIGHTS][3];
|
||||
float light_local_attenuation[NV2A_MAX_LIGHTS][3];
|
||||
|
||||
VertexAttribute vertex_attributes[NV2A_VERTEXSHADER_ATTRIBUTES];
|
||||
|
||||
unsigned int inline_array_length;
|
||||
uint32_t inline_array[NV2A_MAX_BATCH_LENGTH];
|
||||
GLuint gl_inline_array_buffer;
|
||||
|
||||
unsigned int inline_elements_length;
|
||||
uint32_t inline_elements[NV2A_MAX_BATCH_LENGTH];
|
||||
|
||||
unsigned int inline_buffer_length;
|
||||
|
||||
unsigned int draw_arrays_length;
|
||||
unsigned int draw_arrays_max_count;
|
||||
/* FIXME: Unknown size, possibly endless, 1000 will do for now */
|
||||
GLint gl_draw_arrays_start[1000];
|
||||
GLsizei gl_draw_arrays_count[1000];
|
||||
|
||||
GLuint gl_element_buffer;
|
||||
GLuint gl_memory_buffer;
|
||||
GLuint gl_vertex_array;
|
||||
|
||||
uint32_t regs[0x2000];
|
||||
} PGRAPHState;
|
||||
|
||||
typedef struct NV2AState {
|
||||
PCIDevice dev;
|
||||
qemu_irq irq;
|
||||
bool exiting;
|
||||
|
||||
VGACommonState vga;
|
||||
GraphicHwOps hw_ops;
|
||||
QEMUTimer *vblank_timer;
|
||||
|
||||
MemoryRegion *vram;
|
||||
MemoryRegion vram_pci;
|
||||
uint8_t *vram_ptr;
|
||||
MemoryRegion ramin;
|
||||
uint8_t *ramin_ptr;
|
||||
|
||||
MemoryRegion mmio;
|
||||
MemoryRegion block_mmio[NV_NUM_BLOCKS];
|
||||
|
||||
struct {
|
||||
uint32_t pending_interrupts;
|
||||
uint32_t enabled_interrupts;
|
||||
} pmc;
|
||||
|
||||
struct {
|
||||
uint32_t pending_interrupts;
|
||||
uint32_t enabled_interrupts;
|
||||
uint32_t regs[0x2000];
|
||||
QemuMutex lock;
|
||||
QemuThread puller_thread;
|
||||
QemuCond puller_cond;
|
||||
QemuThread pusher_thread;
|
||||
QemuCond pusher_cond;
|
||||
} pfifo;
|
||||
|
||||
struct {
|
||||
uint32_t regs[0x1000];
|
||||
} pvideo;
|
||||
|
||||
struct {
|
||||
uint32_t pending_interrupts;
|
||||
uint32_t enabled_interrupts;
|
||||
uint32_t numerator;
|
||||
uint32_t denominator;
|
||||
uint32_t alarm_time;
|
||||
} ptimer;
|
||||
|
||||
struct {
|
||||
uint32_t regs[0x1000];
|
||||
} pfb;
|
||||
|
||||
struct PGRAPHState pgraph;
|
||||
|
||||
struct {
|
||||
uint32_t pending_interrupts;
|
||||
uint32_t enabled_interrupts;
|
||||
hwaddr start;
|
||||
} pcrtc;
|
||||
|
||||
struct {
|
||||
uint32_t core_clock_coeff;
|
||||
uint64_t core_clock_freq;
|
||||
uint32_t memory_clock_coeff;
|
||||
uint32_t video_clock_coeff;
|
||||
} pramdac;
|
||||
|
||||
} NV2AState;
|
||||
|
||||
typedef struct NV2ABlockInfo {
|
||||
const char *name;
|
||||
hwaddr offset;
|
||||
uint64_t size;
|
||||
MemoryRegionOps ops;
|
||||
} NV2ABlockInfo;
|
||||
|
||||
extern const struct NV2ABlockInfo blocktable[];
|
||||
extern const int blocktable_len;
|
||||
|
||||
DMAObject nv_dma_load(NV2AState *d, hwaddr dma_obj_address);
|
||||
void *nv_dma_map(NV2AState *d, hwaddr dma_obj_address, hwaddr *len);
|
||||
void nv2a_init(PCIBus *bus, int devfn, MemoryRegion *ram);
|
||||
void pgraph_init(NV2AState *d);
|
||||
void *pfifo_puller_thread(void *opaque);
|
||||
void pgraph_destroy(PGRAPHState *pg);
|
||||
void update_irq(NV2AState *d);
|
||||
void pgraph_context_switch(NV2AState *d, unsigned int channel_id);
|
||||
void pgraph_wait_fifo_access(NV2AState *d);
|
||||
void pgraph_method(NV2AState *d,
|
||||
unsigned int subchannel,
|
||||
unsigned int method,
|
||||
uint32_t parameter);
|
||||
|
||||
#define DEFINE_PROTO(n) \
|
||||
uint64_t n##_read(void *opaque, hwaddr addr, unsigned int size); \
|
||||
void n##_write(void *opaque, hwaddr addr, uint64_t val, unsigned int size);
|
||||
|
||||
DEFINE_PROTO(pmc)
|
||||
DEFINE_PROTO(pbus)
|
||||
DEFINE_PROTO(pfifo)
|
||||
DEFINE_PROTO(prma)
|
||||
DEFINE_PROTO(pvideo)
|
||||
DEFINE_PROTO(ptimer)
|
||||
DEFINE_PROTO(pcounter)
|
||||
DEFINE_PROTO(pvpe)
|
||||
DEFINE_PROTO(ptv)
|
||||
DEFINE_PROTO(prmfb)
|
||||
DEFINE_PROTO(prmvio)
|
||||
DEFINE_PROTO(pfb)
|
||||
DEFINE_PROTO(pstraps)
|
||||
DEFINE_PROTO(pgraph)
|
||||
DEFINE_PROTO(pcrtc)
|
||||
DEFINE_PROTO(prmcio)
|
||||
DEFINE_PROTO(pramdac)
|
||||
DEFINE_PROTO(prmdio)
|
||||
// DEFINE_PROTO(pramin)
|
||||
DEFINE_PROTO(user)
|
||||
|
||||
#undef DEFINE_PROTO
|
||||
|
||||
#endif
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -204,7 +204,7 @@ static void pfifo_run_puller(NV2AState *d)
|
|||
}
|
||||
}
|
||||
|
||||
void* pfifo_puller_thread(void *arg)
|
||||
static void* pfifo_puller_thread(void *arg)
|
||||
{
|
||||
NV2AState *d = (NV2AState *)arg;
|
||||
|
||||
|
|
|
@ -394,7 +394,7 @@ void pgraph_write(void *opaque, hwaddr addr, uint64_t val, unsigned int size)
|
|||
qemu_mutex_unlock(&d->pgraph.lock);
|
||||
}
|
||||
|
||||
void pgraph_method(NV2AState *d,
|
||||
static void pgraph_method(NV2AState *d,
|
||||
unsigned int subchannel,
|
||||
unsigned int method,
|
||||
uint32_t parameter)
|
||||
|
@ -2509,7 +2509,7 @@ void pgraph_method(NV2AState *d,
|
|||
}
|
||||
}
|
||||
|
||||
void pgraph_context_switch(NV2AState *d, unsigned int channel_id)
|
||||
static void pgraph_context_switch(NV2AState *d, unsigned int channel_id)
|
||||
{
|
||||
bool channel_valid =
|
||||
d->pgraph.regs[NV_PGRAPH_CTX_CONTROL] & NV_PGRAPH_CTX_CONTROL_CHID;
|
||||
|
@ -2541,7 +2541,7 @@ void pgraph_context_switch(NV2AState *d, unsigned int channel_id)
|
|||
}
|
||||
}
|
||||
|
||||
void pgraph_wait_fifo_access(NV2AState *d) {
|
||||
static void pgraph_wait_fifo_access(NV2AState *d) {
|
||||
while (!(d->pgraph.regs[NV_PGRAPH_FIFO] & NV_PGRAPH_FIFO_ACCESS)) {
|
||||
qemu_cond_wait(&d->pgraph.fifo_access_cond, &d->pgraph.lock);
|
||||
}
|
||||
|
@ -2630,7 +2630,7 @@ static void pgraph_finish_inline_buffer_vertex(PGRAPHState *pg)
|
|||
pg->inline_buffer_length++;
|
||||
}
|
||||
|
||||
void pgraph_init(NV2AState *d)
|
||||
static void pgraph_init(NV2AState *d)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -2717,7 +2717,7 @@ void pgraph_init(NV2AState *d)
|
|||
glo_set_current(NULL);
|
||||
}
|
||||
|
||||
void pgraph_destroy(PGRAPHState *pg)
|
||||
static void pgraph_destroy(PGRAPHState *pg)
|
||||
{
|
||||
qemu_mutex_destroy(&pg->lock);
|
||||
qemu_cond_destroy(&pg->interrupt_cond);
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -26,8 +26,7 @@
|
|||
|
||||
#include "nv2a_vsh.h"
|
||||
#include "nv2a_psh.h"
|
||||
#include "nv2a_int.h"
|
||||
|
||||
#include "nv2a_regs.h"
|
||||
|
||||
enum ShaderPrimitiveMode {
|
||||
PRIM_TYPE_NONE,
|
||||
|
|
|
@ -49,12 +49,10 @@
|
|||
|
||||
#include "hw/xbox/xbox_pci.h"
|
||||
#include "hw/xbox/smbus.h"
|
||||
|
||||
#include "hw/xbox/nv2a/nv2a.h"
|
||||
|
||||
#include "hw/xbox/xbox.h"
|
||||
|
||||
/* FIXME: Move to header file */
|
||||
void nv2a_init(PCIBus *bus, int devfn, MemoryRegion *ram);
|
||||
|
||||
#define MAX_IDE_BUS 2
|
||||
|
||||
// XBOX_TODO: Should be passed in through configuration
|
||||
|
|
Loading…
Reference in New Issue