Lines 57-62
Link Here
|
57 |
#ifdef DEBUG |
57 |
#ifdef DEBUG |
58 |
void __glXDumpDrawBuffer(__GLXcontext *ctx); |
58 |
void __glXDumpDrawBuffer(__GLXcontext *ctx); |
59 |
#endif |
59 |
#endif |
|
|
60 |
#ifdef USE_SPARC_ASM |
61 |
/* |
62 |
* This is where our dispatch table's bounds are. |
63 |
* And the static mesa_init is taken directly from |
64 |
* Mesa's 'sparc.c' initializer. |
65 |
* |
66 |
* We need something like this here, because this version |
67 |
* of openGL/glx never initializes a Mesa context, and so |
68 |
* the address of the dispatch table pointer never gets stuffed |
69 |
* into the dispatch jump table otherwise. |
70 |
* |
71 |
* It matters only on SPARC, and only if you are using assembler |
72 |
* code instead of C-code indirect dispatch. |
73 |
* |
74 |
* -- FEM, 04.xii.03 |
75 |
*/ |
76 |
extern unsigned int _mesa_sparc_glapi_begin; |
77 |
extern unsigned int _mesa_sparc_glapi_end; |
78 |
extern void __glapi_sparc_icache_flush(unsigned int *); |
79 |
static void _glx_mesa_init_sparc_glapi_relocs(void); |
80 |
static int _mesa_sparc_needs_init = 1; |
81 |
#define INIT_MESA_SPARC { \ |
82 |
if(_mesa_sparc_needs_init) { \ |
83 |
_glx_mesa_init_sparc_glapi_relocs(); \ |
84 |
_mesa_sparc_needs_init = 0; \ |
85 |
} \ |
86 |
} |
87 |
#else |
88 |
#define INIT_MESA_SPARC |
89 |
#endif |
60 |
|
90 |
|
61 |
/* |
91 |
/* |
62 |
** We setup some dummy structures here so that the API can be used |
92 |
** We setup some dummy structures here so that the API can be used |
Lines 488-493
Link Here
|
488 |
} |
518 |
} |
489 |
} |
519 |
} |
490 |
#endif |
520 |
#endif |
|
|
521 |
INIT_MESA_SPARC |
491 |
|
522 |
|
492 |
/* The one and only long long lock */ |
523 |
/* The one and only long long lock */ |
493 |
__glXLock(); |
524 |
__glXLock(); |
Lines 603-608
Link Here
|
603 |
|
634 |
|
604 |
if (gc->currentDpy == dpy) { |
635 |
if (gc->currentDpy == dpy) { |
605 |
/* Use opcode from gc because its right */ |
636 |
/* Use opcode from gc because its right */ |
|
|
637 |
INIT_MESA_SPARC |
606 |
return gc->majorOpcode; |
638 |
return gc->majorOpcode; |
607 |
} else { |
639 |
} else { |
608 |
/* |
640 |
/* |
Lines 1029-1031
Link Here
|
1029 |
} |
1061 |
} |
1030 |
} |
1062 |
} |
1031 |
#endif |
1063 |
#endif |
|
|
1064 |
|
1065 |
/* |
1066 |
* Used only when we are sparc, using sparc assembler. |
1067 |
* |
1068 |
*/ |
1069 |
|
1070 |
static void |
1071 |
_glx_mesa_init_sparc_glapi_relocs(void) |
1072 |
{ |
1073 |
#ifdef USE_SPARC_ASM |
1074 |
unsigned int *insn_ptr, *end_ptr; |
1075 |
unsigned long disp_addr; |
1076 |
|
1077 |
insn_ptr = &_mesa_sparc_glapi_begin; |
1078 |
end_ptr = &_mesa_sparc_glapi_end; |
1079 |
disp_addr = (unsigned long) &_glapi_Dispatch; |
1080 |
|
1081 |
/* |
1082 |
* Verbatim from Mesa sparc.c. It's needed because there doesn't |
1083 |
* seem to be a better way to do this: |
1084 |
* |
1085 |
* UNCONDITIONAL_JUMP ( (*_glapi_Dispatch) + entry_offset ) |
1086 |
* |
1087 |
* This code is patching in the ADDRESS of the pointer to the |
1088 |
* dispatch table. Hence, it must be called exactly once, because |
1089 |
* that address is not going to change. |
1090 |
* |
1091 |
* What it points to can change, but Mesa (and hence, we) assume |
1092 |
* that there is only one pointer. |
1093 |
* |
1094 |
*/ |
1095 |
while (insn_ptr < end_ptr) { |
1096 |
#if ( defined(__sparc_v9__) && ( !defined(__linux__) || defined(__linux_64__) ) ) |
1097 |
/* |
1098 |
This code patches for 64-bit addresses. This had better |
1099 |
not happen for Sparc/Linux, no matter what architecture we |
1100 |
are building for. So, don't do this. |
1101 |
|
1102 |
The 'defined(__linux_64__)' is used here as a placeholder for |
1103 |
when we do do 64-bit usermode on sparc linux. |
1104 |
*/ |
1105 |
insn_ptr[0] |= (disp_addr >> (32 + 10)); |
1106 |
insn_ptr[1] |= ((disp_addr & 0xffffffff) >> 10); |
1107 |
__glapi_sparc_icache_flush(&insn_ptr[0]); |
1108 |
insn_ptr[2] |= ((disp_addr >> 32) & ((1 << 10) - 1)); |
1109 |
insn_ptr[3] |= (disp_addr & ((1 << 10) - 1)); |
1110 |
__glapi_sparc_icache_flush(&insn_ptr[2]); |
1111 |
insn_ptr += 11; |
1112 |
#else |
1113 |
insn_ptr[0] |= (disp_addr >> 10); |
1114 |
insn_ptr[1] |= (disp_addr & ((1 << 10) - 1)); |
1115 |
__glapi_sparc_icache_flush(&insn_ptr[0]); |
1116 |
insn_ptr += 5; |
1117 |
#endif |
1118 |
} |
1119 |
#else |
1120 |
/* Just no-op |
1121 |
* |
1122 |
*/ |
1123 |
#endif /* sparc ASM in use */ |
1124 |
} |