r300g, radeong: De-specialize r300_winsys into radeon_winsys.

There's like five good reasons for this, I swear.
This commit is contained in:
Corbin Simpson 2009-12-02 12:16:19 -08:00
parent dad193d516
commit 4f77b0103d
13 changed files with 189 additions and 186 deletions

View file

@ -23,7 +23,8 @@ C_SOURCES = \
r300_tgsi_to_rc.c
LIBRARY_INCLUDES = \
-I$(TOP)/src/mesa/drivers/dri/r300/compiler
-I$(TOP)/src/mesa/drivers/dri/r300/compiler \
-I$(TOP)/src/gallium/winsys/drm/radeon/core
COMPILER_ARCHIVE = $(TOP)/src/mesa/drivers/dri/r300/compiler/libr300compiler.a

View file

@ -36,7 +36,8 @@
#include "r300_screen.h"
#include "r300_state_derived.h"
#include "r300_state_invariant.h"
#include "r300_winsys.h"
#include "radeon_winsys.h"
static enum pipe_error r300_clear_hash_table(void* key, void* value,
void* data)
@ -105,7 +106,7 @@ static void r300_flush_cb(void *data)
}
struct pipe_context* r300_create_context(struct pipe_screen* screen,
struct r300_winsys* r300_winsys)
struct radeon_winsys* radeon_winsys)
{
struct r300_context* r300 = CALLOC_STRUCT(r300_context);
struct r300_screen* r300screen = r300_screen(screen);
@ -113,9 +114,9 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
if (!r300)
return NULL;
r300->winsys = r300_winsys;
r300->winsys = radeon_winsys;
r300->context.winsys = (struct pipe_winsys*)r300_winsys;
r300->context.winsys = (struct pipe_winsys*)radeon_winsys;
r300->context.screen = screen;
r300_init_debug(r300);

View file

@ -237,7 +237,7 @@ struct r300_context {
struct pipe_context context;
/* The interface to the windowing system, etc. */
struct r300_winsys* winsys;
struct radeon_winsys* winsys;
/* Draw module. Used mostly for SW TCL. */
struct draw_context* draw;

View file

@ -26,7 +26,8 @@
#include "util/u_math.h"
#include "r300_reg.h"
#include "r300_winsys.h"
#include "radeon_winsys.h"
/* Yes, I know macros are ugly. However, they are much prettier than the code
* that they neatly hide away, and don't have the cost of function setup,so
@ -50,7 +51,7 @@
#define CS_LOCALS(context) \
struct r300_context* const cs_context_copy = (context); \
struct r300_winsys* cs_winsys = cs_context_copy->winsys; \
struct radeon_winsys* cs_winsys = cs_context_copy->winsys; \
int cs_count = 0;
#define CHECK_CS(size) \

View file

@ -27,7 +27,8 @@
#include "r300_context.h"
#include "r300_screen.h"
#include "r300_texture.h"
#include "r300_winsys.h"
#include "radeon_winsys.h"
/* Return the identifier behind whom the brave coders responsible for this
* amalgamation of code, sweat, and duct tape, routinely obscure their names.
@ -372,7 +373,7 @@ static void r300_destroy_screen(struct pipe_screen* pscreen)
FREE(r300screen);
}
struct pipe_screen* r300_create_screen(struct r300_winsys* r300_winsys)
struct pipe_screen* r300_create_screen(struct radeon_winsys* radeon_winsys)
{
struct r300_screen* r300screen = CALLOC_STRUCT(r300_screen);
struct r300_capabilities* caps = CALLOC_STRUCT(r300_capabilities);
@ -380,14 +381,14 @@ struct pipe_screen* r300_create_screen(struct r300_winsys* r300_winsys)
if (!r300screen || !caps)
return NULL;
caps->pci_id = r300_winsys->pci_id;
caps->num_frag_pipes = r300_winsys->gb_pipes;
caps->num_z_pipes = r300_winsys->z_pipes;
caps->pci_id = radeon_winsys->pci_id;
caps->num_frag_pipes = radeon_winsys->gb_pipes;
caps->num_z_pipes = radeon_winsys->z_pipes;
r300_parse_chipset(caps);
r300screen->caps = caps;
r300screen->screen.winsys = (struct pipe_winsys*)r300_winsys;
r300screen->screen.winsys = (struct pipe_winsys*)radeon_winsys;
r300screen->screen.destroy = r300_destroy_screen;
r300screen->screen.get_name = r300_get_name;
r300screen->screen.get_vendor = r300_get_vendor;

View file

@ -27,7 +27,7 @@
#include "r300_chipset.h"
struct r300_winsys;
struct radeon_winsys;
struct r300_screen {
/* Parent class */
@ -58,6 +58,6 @@ r300_transfer(struct pipe_transfer* transfer)
}
/* Creates a new r300 screen. */
struct pipe_screen* r300_create_screen(struct r300_winsys* r300_winsys);
struct pipe_screen* r300_create_screen(struct radeon_winsys* radeon_winsys);
#endif /* R300_SCREEN_H */

View file

@ -32,7 +32,8 @@
#include "r300_context.h"
#include "r300_state_inlines.h"
#include "r300_reg.h"
#include "r300_winsys.h"
#include "radeon_winsys.h"
static INLINE int get_buffer_offset(struct r300_context *r300,
unsigned int buf_nr,

View file

@ -35,76 +35,8 @@ extern "C" {
#include "pipe/p_state.h"
#include "pipe/internal/p_winsys_screen.h"
struct r300_winsys {
/* Parent class */
struct pipe_winsys base;
/* Opaque Radeon-specific winsys object. */
void* radeon_winsys;
/* PCI ID */
uint32_t pci_id;
/* GB pipe count */
uint32_t gb_pipes;
/* Z pipe count (rv530 only) */
uint32_t z_pipes;
/* GART size. */
uint32_t gart_size;
/* VRAM size. */
uint32_t vram_size;
/* Add a pipe_buffer to the list of buffer objects to validate. */
boolean (*add_buffer)(struct r300_winsys* winsys,
struct pipe_buffer* pbuffer,
uint32_t rd,
uint32_t wd);
/* Revalidate all currently setup pipe_buffers.
* Returns TRUE if a flush is required. */
boolean (*validate)(struct r300_winsys* winsys);
/* Check to see if there's room for commands. */
boolean (*check_cs)(struct r300_winsys* winsys, int size);
/* Start a command emit. */
void (*begin_cs)(struct r300_winsys* winsys,
int size,
const char* file,
const char* function,
int line);
/* Write a dword to the command buffer. */
void (*write_cs_dword)(struct r300_winsys* winsys, uint32_t dword);
/* Write a relocated dword to the command buffer. */
void (*write_cs_reloc)(struct r300_winsys* winsys,
struct pipe_buffer* bo,
uint32_t rd,
uint32_t wd,
uint32_t flags);
/* Finish a command emit. */
void (*end_cs)(struct r300_winsys* winsys,
const char* file,
const char* function,
int line);
/* Flush the CS. */
void (*flush_cs)(struct r300_winsys* winsys);
/* winsys flush - callback from winsys when flush required */
void (*set_flush_cb)(struct r300_winsys *winsys,
void (*flush_cb)(void *), void *data);
void (*reset_bos)(struct r300_winsys *winsys);
};
struct pipe_context* r300_create_context(struct pipe_screen* screen,
struct r300_winsys* r300_winsys);
struct radeon_winsys* radeon_winsys);
boolean r300_get_texture_buffer(struct pipe_texture* texture,
struct pipe_buffer** buffer,

View file

@ -45,6 +45,8 @@
#include "radeon_drm.h"
#include "radeon_winsys.h"
struct radeon_pipe_buffer {
struct pipe_buffer base;
struct radeon_bo *bo;
@ -68,14 +70,6 @@ struct radeon_winsys_priv {
struct radeon_cs* cs;
};
struct radeon_winsys {
/* Parent class. */
struct pipe_winsys base;
/* This corresponds to void* radeon_winsys in r300_winsys. */
struct radeon_winsys_priv* priv;
};
struct radeon_winsys* radeon_pipe_winsys(int fb);
#if 0
struct pipe_surface *radeon_surface_from_handle(struct radeon_context *radeon_context,

View file

@ -41,9 +41,8 @@ struct pipe_screen* radeon_create_screen(struct drm_api* api,
if (debug_get_bool_option("RADEON_SOFTPIPE", FALSE)) {
return softpipe_create_screen((struct pipe_winsys*)winsys);
} else {
struct r300_winsys* r300 = radeon_create_r300_winsys(drmFB, winsys);
FREE(winsys);
return r300_create_screen(r300);
radeon_setup_winsys(drmFB, winsys);
return r300_create_screen(winsys);
}
}
@ -55,7 +54,7 @@ struct pipe_context* radeon_create_context(struct drm_api* api,
return radeon_create_softpipe(screen->winsys);
} else {
return r300_create_context(screen,
(struct r300_winsys*)screen->winsys);
(struct radeon_winsys*)screen->winsys);
}
}

View file

@ -22,36 +22,27 @@
#include "radeon_r300.h"
static void radeon_r300_set_flush_cb(struct r300_winsys *winsys,
void (*flush_cb)(void *),
void *data)
static void radeon_set_flush_cb(struct radeon_winsys *winsys,
void (*flush_cb)(void *),
void *data)
{
struct radeon_winsys_priv* priv =
(struct radeon_winsys_priv*)winsys->radeon_winsys;
radeon_cs_space_set_flush(priv->cs, flush_cb,
data);
radeon_cs_space_set_flush(winsys->priv->cs, flush_cb, data);
}
static boolean radeon_r300_add_buffer(struct r300_winsys* winsys,
struct pipe_buffer* pbuffer,
uint32_t rd,
uint32_t wd)
static boolean radeon_add_buffer(struct radeon_winsys* winsys,
struct pipe_buffer* pbuffer,
uint32_t rd,
uint32_t wd)
{
struct radeon_winsys_priv* priv =
(struct radeon_winsys_priv*)winsys->radeon_winsys;
struct radeon_bo* bo = ((struct radeon_pipe_buffer*)pbuffer)->bo;
radeon_cs_space_add_persistent_bo(priv->cs, bo, rd, wd);
radeon_cs_space_add_persistent_bo(winsys->priv->cs, bo, rd, wd);
return TRUE;
}
static boolean radeon_r300_validate(struct r300_winsys* winsys)
static boolean radeon_validate(struct radeon_winsys* winsys)
{
struct radeon_winsys_priv* priv =
(struct radeon_winsys_priv*)winsys->radeon_winsys;
if (radeon_cs_space_check(priv->cs) < 0) {
if (radeon_cs_space_check(winsys->priv->cs) < 0) {
return FALSE;
}
@ -59,45 +50,37 @@ static boolean radeon_r300_validate(struct r300_winsys* winsys)
return TRUE;
}
static boolean radeon_r300_check_cs(struct r300_winsys* winsys, int size)
static boolean radeon_check_cs(struct radeon_winsys* winsys, int size)
{
/* XXX check size here, lazy ass! */
/* XXX also validate buffers */
return TRUE;
}
static void radeon_r300_begin_cs(struct r300_winsys* winsys,
int size,
const char* file,
const char* function,
int line)
static void radeon_begin_cs(struct radeon_winsys* winsys,
int size,
const char* file,
const char* function,
int line)
{
struct radeon_winsys_priv* priv =
(struct radeon_winsys_priv*)winsys->radeon_winsys;
radeon_cs_begin(priv->cs, size, file, function, line);
radeon_cs_begin(winsys->priv->cs, size, file, function, line);
}
static void radeon_r300_write_cs_dword(struct r300_winsys* winsys,
uint32_t dword)
static void radeon_write_cs_dword(struct radeon_winsys* winsys,
uint32_t dword)
{
struct radeon_winsys_priv* priv =
(struct radeon_winsys_priv*)winsys->radeon_winsys;
radeon_cs_write_dword(priv->cs, dword);
radeon_cs_write_dword(winsys->priv->cs, dword);
}
static void radeon_r300_write_cs_reloc(struct r300_winsys* winsys,
struct pipe_buffer* pbuffer,
uint32_t rd,
uint32_t wd,
uint32_t flags)
static void radeon_write_cs_reloc(struct radeon_winsys* winsys,
struct pipe_buffer* pbuffer,
uint32_t rd,
uint32_t wd,
uint32_t flags)
{
struct radeon_winsys_priv* priv =
(struct radeon_winsys_priv*)winsys->radeon_winsys;
int retval = 0;
retval = radeon_cs_write_reloc(priv->cs,
retval = radeon_cs_write_reloc(winsys->priv->cs,
((struct radeon_pipe_buffer*)pbuffer)->bo, rd, wd, flags);
if (retval) {
@ -106,46 +89,39 @@ static void radeon_r300_write_cs_reloc(struct r300_winsys* winsys,
}
}
static void radeon_r300_reset_bos(struct r300_winsys *winsys)
static void radeon_reset_bos(struct radeon_winsys *winsys)
{
struct radeon_winsys_priv* priv =
(struct radeon_winsys_priv*)winsys->radeon_winsys;
radeon_cs_space_reset_bos(priv->cs);
radeon_cs_space_reset_bos(winsys->priv->cs);
}
static void radeon_r300_end_cs(struct r300_winsys* winsys,
const char* file,
const char* function,
int line)
static void radeon_end_cs(struct radeon_winsys* winsys,
const char* file,
const char* function,
int line)
{
struct radeon_winsys_priv* priv =
(struct radeon_winsys_priv*)winsys->radeon_winsys;
radeon_cs_end(priv->cs, file, function, line);
radeon_cs_end(winsys->priv->cs, file, function, line);
}
static void radeon_r300_flush_cs(struct r300_winsys* winsys)
static void radeon_flush_cs(struct radeon_winsys* winsys)
{
struct radeon_winsys_priv* priv =
(struct radeon_winsys_priv*)winsys->radeon_winsys;
int retval;
/* Emit the CS. */
retval = radeon_cs_emit(priv->cs);
retval = radeon_cs_emit(winsys->priv->cs);
if (retval) {
debug_printf("radeon: Bad CS, dumping...\n");
radeon_cs_print(priv->cs, stderr);
radeon_cs_print(winsys->priv->cs, stderr);
}
/* Reset CS.
* Someday, when we care about performance, we should really find a way
* to rotate between two or three CS objects so that the GPU can be
* spinning through one CS while another one is being filled. */
radeon_cs_erase(priv->cs);
radeon_cs_erase(winsys->priv->cs);
}
/* Helper function to do the ioctls needed for setup and init. */
static void do_ioctls(struct r300_winsys* winsys, int fd)
static void do_ioctls(struct radeon_winsys* winsys, int fd)
{
struct drm_radeon_gem_info gem_info = {0};
struct drm_radeon_info info = {0};
@ -207,18 +183,17 @@ static void do_ioctls(struct r300_winsys* winsys, int fd)
winsys->vram_size = gem_info.vram_visible;
}
struct r300_winsys*
radeon_create_r300_winsys(int fd, struct radeon_winsys* old_winsys)
void
radeon_setup_winsys(int fd, struct radeon_winsys* winsys)
{
struct r300_winsys* winsys = CALLOC_STRUCT(r300_winsys);
struct radeon_winsys_priv* priv;
/* XXX is this check needed now? */
if (winsys == NULL) {
return NULL;
return;
}
priv = old_winsys->priv;
struct radeon_winsys_priv* priv = winsys->priv;
/* XXX backwards is bad precedent */
do_ioctls(winsys, fd);
priv->csm = radeon_cs_manager_gem_ctor(fd);
@ -229,19 +204,15 @@ radeon_create_r300_winsys(int fd, struct radeon_winsys* old_winsys)
radeon_cs_set_limit(priv->cs,
RADEON_GEM_DOMAIN_VRAM, winsys->vram_size);
winsys->add_buffer = radeon_r300_add_buffer;
winsys->validate = radeon_r300_validate;
winsys->add_buffer = radeon_add_buffer;
winsys->validate = radeon_validate;
winsys->check_cs = radeon_r300_check_cs;
winsys->begin_cs = radeon_r300_begin_cs;
winsys->write_cs_dword = radeon_r300_write_cs_dword;
winsys->write_cs_reloc = radeon_r300_write_cs_reloc;
winsys->end_cs = radeon_r300_end_cs;
winsys->flush_cs = radeon_r300_flush_cs;
winsys->reset_bos = radeon_r300_reset_bos;
winsys->set_flush_cb = radeon_r300_set_flush_cb;
memcpy(winsys, old_winsys, sizeof(struct radeon_winsys));
return winsys;
winsys->check_cs = radeon_check_cs;
winsys->begin_cs = radeon_begin_cs;
winsys->write_cs_dword = radeon_write_cs_dword;
winsys->write_cs_reloc = radeon_write_cs_reloc;
winsys->end_cs = radeon_end_cs;
winsys->flush_cs = radeon_flush_cs;
winsys->reset_bos = radeon_reset_bos;
winsys->set_flush_cb = radeon_set_flush_cb;
}

View file

@ -34,9 +34,6 @@
#include "radeon_buffer.h"
struct radeon_winsys;
struct r300_winsys*
radeon_create_r300_winsys(int fd, struct radeon_winsys* old_winsys);
void radeon_setup_winsys(int fd, struct radeon_winsys* winsys);
#endif /* RADEON_R300_H */

View file

@ -0,0 +1,105 @@
/*
* Copyright © 2009 Corbin Simpson
* 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 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 THE COPYRIGHT HOLDERS, AUTHORS
* 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.
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial portions
* of the Software.
*/
/*
* Authors:
* Corbin Simpson <MostAwesomeDude@gmail.com>
*/
#ifndef RADEON_WINSYS_H
#define RADEON_WINSYS_H
#include "pipe/internal/p_winsys_screen.h"
struct radeon_winsys_priv;
struct radeon_winsys {
/* Parent class. */
struct pipe_winsys base;
/* Winsys private */
struct radeon_winsys_priv* priv;
/* PCI ID */
uint32_t pci_id;
/* GB pipe count */
uint32_t gb_pipes;
/* Z pipe count (rv530 only) */
uint32_t z_pipes;
/* GART size. */
uint32_t gart_size;
/* VRAM size. */
uint32_t vram_size;
/* Add a pipe_buffer to the list of buffer objects to validate. */
boolean (*add_buffer)(struct radeon_winsys* winsys,
struct pipe_buffer* pbuffer,
uint32_t rd,
uint32_t wd);
/* Revalidate all currently setup pipe_buffers.
* Returns TRUE if a flush is required. */
boolean (*validate)(struct radeon_winsys* winsys);
/* Check to see if there's room for commands. */
boolean (*check_cs)(struct radeon_winsys* winsys, int size);
/* Start a command emit. */
void (*begin_cs)(struct radeon_winsys* winsys,
int size,
const char* file,
const char* function,
int line);
/* Write a dword to the command buffer. */
void (*write_cs_dword)(struct radeon_winsys* winsys, uint32_t dword);
/* Write a relocated dword to the command buffer. */
void (*write_cs_reloc)(struct radeon_winsys* winsys,
struct pipe_buffer* bo,
uint32_t rd,
uint32_t wd,
uint32_t flags);
/* Finish a command emit. */
void (*end_cs)(struct radeon_winsys* winsys,
const char* file,
const char* function,
int line);
/* Flush the CS. */
void (*flush_cs)(struct radeon_winsys* winsys);
/* winsys flush - callback from winsys when flush required */
void (*set_flush_cb)(struct radeon_winsys *winsys,
void (*flush_cb)(void *), void *data);
void (*reset_bos)(struct radeon_winsys *winsys);
};
#endif