aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/winsys
diff options
context:
space:
mode:
authorCorbin Simpson <[email protected]>2009-01-22 13:34:21 -0800
committerCorbin Simpson <[email protected]>2009-02-01 23:30:25 -0800
commitecb7f29f74c8f7456302267fe31b1de4bcc103c5 (patch)
tree1f86aac7d7a005755dc7e9a00796e43a3ea9919b /src/gallium/winsys
parent90a96cb2addf48b3b48c039a8dc6de9e53bfb6df (diff)
amd/r300: Wire up GETPARAM ioctls.
Whoo, stuff is starting to look cleaner and cleaner.
Diffstat (limited to 'src/gallium/winsys')
-rw-r--r--src/gallium/winsys/drm/amd/amd_context.c9
-rw-r--r--src/gallium/winsys/drm/amd/amd_r300.c38
-rw-r--r--src/gallium/winsys/drm/amd/amd_r300.h7
3 files changed, 45 insertions, 9 deletions
diff --git a/src/gallium/winsys/drm/amd/amd_context.c b/src/gallium/winsys/drm/amd/amd_context.c
index 53311684ded..7a486c93a59 100644
--- a/src/gallium/winsys/drm/amd/amd_context.c
+++ b/src/gallium/winsys/drm/amd/amd_context.c
@@ -244,11 +244,10 @@ GLboolean amd_context_create(const __GLcontextModes *visual,
if (GL_TRUE) {
fprintf(stderr, "Creating r300 context...");
- /* XXX today we pretend to be a very lame R300 vvvvvv */
- pipe = r300_create_context(NULL,
- amd_context->pipe_winsys,
- amd_create_r300_winsys(amd_context->drm_fd,
- 0x4144));
+ pipe =
+ r300_create_context(NULL,
+ amd_context->pipe_winsys,
+ amd_create_r300_winsys(amd_context->drm_fd));
} else {
pipe = amd_create_softpipe(amd_context);
}
diff --git a/src/gallium/winsys/drm/amd/amd_r300.c b/src/gallium/winsys/drm/amd/amd_r300.c
index a7a70fdd7ff..04295e8281b 100644
--- a/src/gallium/winsys/drm/amd/amd_r300.c
+++ b/src/gallium/winsys/drm/amd/amd_r300.c
@@ -43,13 +43,45 @@ static void amd_r300_flush_cs(struct radeon_cs* cs)
radeon_cs_erase(cs);
}
-struct r300_winsys* amd_create_r300_winsys(int fd, uint32_t pci_id)
+/* Helper function to do the ioctls needed for setup and init. */
+static void do_ioctls(struct r300_winsys* winsys, int fd)
+{
+ drm_radeon_getparam_t gp;
+ uint32_t target;
+ int retval;
+
+ /* XXX is this cast safe? */
+ gp.value = (int*)&target;
+
+ /* First, get PCI ID */
+ gp.param = RADEON_PARAM_DEVICE_ID;
+ retval = drmCommandWriteRead(fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp));
+ if (retval) {
+ fprintf(stderr, "%s: Failed to get PCI ID, error number %d",
+ __FUNCTION__, retval);
+ exit(1);
+ }
+ winsys->pci_id = target;
+
+ /* Then, get the number of pixel pipes */
+ gp.param = RADEON_PARAM_NUM_GB_PIPES;
+ retval = drmCommandWriteRead(fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp));
+ if (retval) {
+ fprintf(stderr, "%s: Failed to get GB pipe count, error number %d",
+ __FUNCTION__, retval);
+ exit(1);
+ }
+ winsys->gb_pipes = target;
+
+}
+
+struct r300_winsys* amd_create_r300_winsys(int fd)
{
struct r300_winsys* winsys = calloc(1, sizeof(struct r300_winsys));
- struct radeon_cs_manager* csm = radeon_cs_manager_gem_ctor(fd);
+ do_ioctls(winsys, fd);
- winsys->pci_id = pci_id;
+ struct radeon_cs_manager* csm = radeon_cs_manager_gem_ctor(fd);
winsys->cs = radeon_cs_create(csm, 1024 * 64 / 4);
diff --git a/src/gallium/winsys/drm/amd/amd_r300.h b/src/gallium/winsys/drm/amd/amd_r300.h
index 0d229fe0c4c..d80c23594cd 100644
--- a/src/gallium/winsys/drm/amd/amd_r300.h
+++ b/src/gallium/winsys/drm/amd/amd_r300.h
@@ -20,10 +20,15 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/* XXX WTF is this! I shouldn't have to include those first three! FUCK! */
+#include <stdint.h>
+#include <stdlib.h>
+#include "drm.h"
+#include "radeon_drm.h"
#include "radeon_cs.h"
#include "r300_winsys.h"
#include "amd_buffer.h"
-struct r300_winsys* amd_create_r300_winsys(int fd, uint32_t pci_id);
+struct r300_winsys* amd_create_r300_winsys(int fd);