};
-
#ifndef FX
/****************************************************************************
* Read/Write pixels
/****************************************************************************
* RGB[A]
***************************************************************************/
-static void write_rgba_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
- const GLubyte rgba[][4], const GLubyte mask[])
+static void
+write_rgba_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
+ const GLubyte rgba[][4], const GLubyte mask[])
{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
- offset = DSTRIDE * FLIP(y) + x;
- if (mask) {
- /* draw some pixels */
- for (i=0; i<n; i++, offset++) {
- if (mask[i]) {
- vl_putpixel(offset, vl_mixrgba(rgba[i]));
- }
- }
- } else {
- /* draw all pixels */
- for (i=0; i<n; i++, offset++) {
- vl_putpixel(offset, vl_mixrgba(rgba[i]));
- }
- }
+ const DMesaContext dmesa = (DMesaContext)ctx;
+ GLuint i, offset;
+
+ offset = DSTRIDE * FLIP(y) + x;
+ if (mask) {
+ /* draw some pixels */
+ for (i = 0; i < n; i++, offset++) {
+ if (mask[i]) {
+ vl_putpixel(offset, vl_mixrgba(rgba[i]));
+ }
+ }
+ } else {
+ /* draw all pixels */
+ for (i = 0; i < n; i++, offset++) {
+ vl_putpixel(offset, vl_mixrgba(rgba[i]));
+ }
+ }
}
-
-static void write_rgb_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
- const GLubyte rgb[][3], const GLubyte mask[])
+static void
+write_rgb_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
+ const GLubyte rgb[][3], const GLubyte mask[])
{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
- offset = DSTRIDE * FLIP(y) + x;
- if (mask) {
- /* draw some pixels */
- for (i=0; i<n; i++, offset++) {
- if (mask[i]) {
- vl_putpixel(offset, vl_mixrgb(rgb[i]));
- }
- }
- } else {
- /* draw all pixels */
- for (i=0; i<n; i++, offset++) {
- vl_putpixel(offset, vl_mixrgb(rgb[i]));
- }
- }
+ const DMesaContext dmesa = (DMesaContext)ctx;
+ GLuint i, offset;
+
+ offset = DSTRIDE * FLIP(y) + x;
+ if (mask) {
+ /* draw some pixels */
+ for (i = 0; i < n; i++, offset++) {
+ if (mask[i]) {
+ vl_putpixel(offset, vl_mixrgb(rgb[i]));
+ }
+ }
+ } else {
+ /* draw all pixels */
+ for (i = 0; i < n; i++, offset++) {
+ vl_putpixel(offset, vl_mixrgb(rgb[i]));
+ }
+ }
}
-
-static void write_mono_rgba_span (const GLcontext *ctx,
- GLuint n, GLint x, GLint y,
- const GLchan color[4], const GLubyte mask[])
+static void
+write_mono_rgba_span (const GLcontext *ctx,
+ GLuint n, GLint x, GLint y,
+ const GLchan color[4], const GLubyte mask[])
{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset, rgba = vl_mixrgba(color);
-
- offset = DSTRIDE * FLIP(y) + x;
- if (mask) {
- /* draw some pixels */
- for (i=0; i<n; i++, offset++) {
- if (mask[i]) {
- vl_putpixel(offset, rgba);
- }
- }
- } else {
- /* draw all pixels */
- for (i=0; i<n; i++, offset++) {
- vl_putpixel(offset, rgba);
- }
- }
+ const DMesaContext dmesa = (DMesaContext)ctx;
+ GLuint i, offset, rgba = vl_mixrgba(color);
+
+ offset = DSTRIDE * FLIP(y) + x;
+ if (mask) {
+ /* draw some pixels */
+ for (i = 0; i < n; i++, offset++) {
+ if (mask[i]) {
+ vl_putpixel(offset, rgba);
+ }
+ }
+ } else {
+ /* draw all pixels */
+ for (i = 0; i < n; i++, offset++) {
+ vl_putpixel(offset, rgba);
+ }
+ }
}
-
-static void read_rgba_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
- GLubyte rgba[][4])
+static void
+read_rgba_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
+ GLubyte rgba[][4])
{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
- offset = DSTRIDE * FLIP(y) + x;
- /* read all pixels */
- for (i=0; i<n; i++, offset++) {
- vl_getrgba(offset, rgba[i]);
- }
-}
+ const DMesaContext dmesa = (DMesaContext)ctx;
+ GLuint i, offset;
+ offset = DSTRIDE * FLIP(y) + x;
+ /* read all pixels */
+ for (i = 0; i < n; i++, offset++) {
+ vl_getrgba(offset, rgba[i]);
+ }
+}
-static void write_rgba_pixels (const GLcontext *ctx,
- GLuint n, const GLint x[], const GLint y[],
- const GLubyte rgba[][4], const GLubyte mask[])
+static void
+write_rgba_pixels (const GLcontext *ctx,
+ GLuint n, const GLint x[], const GLint y[],
+ const GLubyte rgba[][4], const GLubyte mask[])
{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
-
- if (mask) {
- /* draw some pixels */
- for (i=0; i<n; i++) {
- if (mask[i]) {
- vl_putpixel(FLIP2(y[i])*_w_ + x[i], vl_mixrgba(rgba[i]));
- }
- }
- } else {
- /* draw all pixels */
- for (i=0; i<n; i++) {
- vl_putpixel(FLIP2(y[i])*_w_ + x[i], vl_mixrgba(rgba[i]));
- }
- }
+ const DMesaContext dmesa = (DMesaContext)ctx;
+ GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
+
+ if (mask) {
+ /* draw some pixels */
+ for (i = 0; i < n; i++) {
+ if (mask[i]) {
+ vl_putpixel(FLIP2(y[i])*_w_ + x[i], vl_mixrgba(rgba[i]));
+ }
+ }
+ } else {
+ /* draw all pixels */
+ for (i = 0; i < n; i++) {
+ vl_putpixel(FLIP2(y[i])*_w_ + x[i], vl_mixrgba(rgba[i]));
+ }
+ }
}
-
-static void write_mono_rgba_pixels (const GLcontext *ctx,
- GLuint n, const GLint x[], const GLint y[],
+static void
+write_mono_rgba_pixels (const GLcontext *ctx,
+ GLuint n, const GLint x[], const GLint y[],
const GLchan color[4], const GLubyte mask[])
{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1, rgba = vl_mixrgba(color);
-
- if (mask) {
- /* draw some pixels */
- for (i=0; i<n; i++) {
- if (mask[i]) {
- vl_putpixel(FLIP2(y[i])*_w_ + x[i], rgba);
- }
- }
- } else {
- /* draw all pixels */
- for (i=0; i<n; i++) {
- vl_putpixel(FLIP2(y[i])*_w_ + x[i], rgba);
- }
- }
+ const DMesaContext dmesa = (DMesaContext)ctx;
+ GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1, rgba = vl_mixrgba(color);
+
+ if (mask) {
+ /* draw some pixels */
+ for (i = 0; i < n; i++) {
+ if (mask[i]) {
+ vl_putpixel(FLIP2(y[i])*_w_ + x[i], rgba);
+ }
+ }
+ } else {
+ /* draw all pixels */
+ for (i = 0; i < n; i++) {
+ vl_putpixel(FLIP2(y[i])*_w_ + x[i], rgba);
+ }
+ }
}
-
-static void read_rgba_pixels (const GLcontext *ctx,
- GLuint n, const GLint x[], const GLint y[],
- GLubyte rgba[][4], const GLubyte mask[])
+static void
+read_rgba_pixels (const GLcontext *ctx,
+ GLuint n, const GLint x[], const GLint y[],
+ GLubyte rgba[][4], const GLubyte mask[])
{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
-
- if (mask) {
- /* read some pixels */
- for (i=0; i<n; i++) {
- if (mask[i]) {
- vl_getrgba(FLIP2(y[i])*_w_ + x[i], rgba[i]);
- }
- }
- } else {
- /* read all pixels */
- for (i=0; i<n; i++) {
- vl_getrgba(FLIP2(y[i])*_w_ + x[i], rgba[i]);
- }
- }
+ const DMesaContext dmesa = (DMesaContext)ctx;
+ GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
+
+ if (mask) {
+ /* read some pixels */
+ for (i = 0; i < n; i++) {
+ if (mask[i]) {
+ vl_getrgba(FLIP2(y[i])*_w_ + x[i], rgba[i]);
+ }
+ }
+ } else {
+ /* read all pixels */
+ for (i = 0; i < n; i++) {
+ vl_getrgba(FLIP2(y[i])*_w_ + x[i], rgba[i]);
+ }
+ }
}
-
/****************************************************************************
* Index
***************************************************************************/
-static void write_index_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
- const GLuint index[], const GLubyte mask[])
+static void
+write_index_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
+ const GLuint index[], const GLubyte mask[])
{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
- offset = DSTRIDE * FLIP(y) + x;
- if (mask) {
- /* draw some pixels */
- for (i=0; i<n; i++, offset++) {
- if (mask[i]) {
- vl_putpixel(offset, index[i]);
- }
- }
- } else {
- /* draw all pixels */
- for (i=0; i<n; i++, offset++) {
- vl_putpixel(offset, index[i]);
- }
- }
+ const DMesaContext dmesa = (DMesaContext)ctx;
+ GLuint i, offset;
+
+ offset = DSTRIDE * FLIP(y) + x;
+ if (mask) {
+ /* draw some pixels */
+ for (i = 0; i < n; i++, offset++) {
+ if (mask[i]) {
+ vl_putpixel(offset, index[i]);
+ }
+ }
+ } else {
+ /* draw all pixels */
+ for (i = 0; i < n; i++, offset++) {
+ vl_putpixel(offset, index[i]);
+ }
+ }
}
-
-static void write_index8_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
- const GLubyte index[], const GLubyte mask[])
+static void
+write_index8_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
+ const GLubyte index[], const GLubyte mask[])
{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
- offset = DSTRIDE * FLIP(y) + x;
- if (mask) {
- /* draw some pixels */
- for (i=0; i<n; i++, offset++) {
- if (mask[i]) {
- vl_putpixel(offset, index[i]);
- }
- }
- } else {
- /* draw all pixels */
- for (i=0; i<n; i++, offset++) {
- vl_putpixel(offset, index[i]);
- }
- }
+ const DMesaContext dmesa = (DMesaContext)ctx;
+ GLuint i, offset;
+
+ offset = DSTRIDE * FLIP(y) + x;
+ if (mask) {
+ /* draw some pixels */
+ for (i = 0; i < n; i++, offset++) {
+ if (mask[i]) {
+ vl_putpixel(offset, index[i]);
+ }
+ }
+ } else {
+ /* draw all pixels */
+ for (i = 0; i < n; i++, offset++) {
+ vl_putpixel(offset, index[i]);
+ }
+ }
}
-
-static void write_mono_index_span (const GLcontext *ctx,
- GLuint n, GLint x, GLint y,
- GLuint colorIndex, const GLubyte mask[])
+static void
+write_mono_index_span (const GLcontext *ctx,
+ GLuint n, GLint x, GLint y,
+ GLuint colorIndex, const GLubyte mask[])
{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
- offset = DSTRIDE * FLIP(y) + x;
- if (mask) {
- /* draw some pixels */
- for (i=0; i<n; i++, offset++) {
- if (mask[i]) {
- vl_putpixel(offset, colorIndex);
- }
- }
- } else {
- /* draw all pixels */
- for (i=0; i<n; i++, offset++) {
- vl_putpixel(offset, colorIndex);
- }
- }
+ const DMesaContext dmesa = (DMesaContext)ctx;
+ GLuint i, offset;
+
+ offset = DSTRIDE * FLIP(y) + x;
+ if (mask) {
+ /* draw some pixels */
+ for (i = 0; i < n; i++, offset++) {
+ if (mask[i]) {
+ vl_putpixel(offset, colorIndex);
+ }
+ }
+ } else {
+ /* draw all pixels */
+ for (i = 0; i < n; i++, offset++) {
+ vl_putpixel(offset, colorIndex);
+ }
+ }
}
-
-static void read_index_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
- GLuint index[])
+static void
+read_index_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
+ GLuint index[])
{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
- offset = DSTRIDE * FLIP(y) + x;
- /* read all pixels */
- for (i=0; i<n; i++, offset++) {
- index[i] = vl_getpixel(offset);
- }
-}
+ const DMesaContext dmesa = (DMesaContext)ctx;
+ GLuint i, offset;
+ offset = DSTRIDE * FLIP(y) + x;
+ /* read all pixels */
+ for (i = 0; i < n; i++, offset++) {
+ index[i] = vl_getpixel(offset);
+ }
+}
-static void write_index_pixels (const GLcontext *ctx,
- GLuint n, const GLint x[], const GLint y[],
- const GLuint index[], const GLubyte mask[])
+static void
+write_index_pixels (const GLcontext *ctx,
+ GLuint n, const GLint x[], const GLint y[],
+ const GLuint index[], const GLubyte mask[])
{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
-
- if (mask) {
- /* draw some pixels */
- for (i=0; i<n; i++) {
- if (mask[i]) {
- vl_putpixel(FLIP2(y[i])*_w_ + x[i], index[i]);
- }
- }
- } else {
- /* draw all pixels */
- for (i=0; i<n; i++) {
- vl_putpixel(FLIP2(y[i])*_w_ + x[i], index[i]);
- }
- }
+ const DMesaContext dmesa = (DMesaContext)ctx;
+ GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
+
+ if (mask) {
+ /* draw some pixels */
+ for (i = 0; i < n; i++) {
+ if (mask[i]) {
+ vl_putpixel(FLIP2(y[i])*_w_ + x[i], index[i]);
+ }
+ }
+ } else {
+ /* draw all pixels */
+ for (i = 0; i < n; i++) {
+ vl_putpixel(FLIP2(y[i])*_w_ + x[i], index[i]);
+ }
+ }
}
-
-static void write_mono_index_pixels (const GLcontext *ctx,
- GLuint n, const GLint x[], const GLint y[],
- GLuint colorIndex, const GLubyte mask[])
+static void
+write_mono_index_pixels (const GLcontext *ctx,
+ GLuint n, const GLint x[], const GLint y[],
+ GLuint colorIndex, const GLubyte mask[])
{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
-
- if (mask) {
- /* draw some pixels */
- for (i=0; i<n; i++) {
- if (mask[i]) {
- vl_putpixel(FLIP2(y[i])*_w_ + x[i], colorIndex);
- }
- }
- } else {
- /* draw all pixels */
- for (i=0; i<n; i++) {
- vl_putpixel(FLIP2(y[i])*_w_ + x[i], colorIndex);
- }
- }
+ const DMesaContext dmesa = (DMesaContext)ctx;
+ GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
+
+ if (mask) {
+ /* draw some pixels */
+ for (i = 0; i < n; i++) {
+ if (mask[i]) {
+ vl_putpixel(FLIP2(y[i])*_w_ + x[i], colorIndex);
+ }
+ }
+ } else {
+ /* draw all pixels */
+ for (i = 0; i < n; i++) {
+ vl_putpixel(FLIP2(y[i])*_w_ + x[i], colorIndex);
+ }
+ }
}
-
-static void read_index_pixels (const GLcontext *ctx,
- GLuint n, const GLint x[], const GLint y[],
+static void
+read_index_pixels (const GLcontext *ctx,
+ GLuint n, const GLint x[], const GLint y[],
GLuint index[], const GLubyte mask[])
{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
-
- if (mask) {
- /* read some pixels */
- for (i=0; i<n; i++) {
- if (mask[i]) {
- index[i] = vl_getpixel(FLIP2(y[i])*_w_ + x[i]);
- }
- }
- } else {
- /* read all pixels */
- for (i=0; i<n; i++) {
- index[i] = vl_getpixel(FLIP2(y[i])*_w_ + x[i]);
- }
- }
+ const DMesaContext dmesa = (DMesaContext)ctx;
+ GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
+
+ if (mask) {
+ /* read some pixels */
+ for (i = 0; i < n; i++) {
+ if (mask[i]) {
+ index[i] = vl_getpixel(FLIP2(y[i])*_w_ + x[i]);
+ }
+ }
+ } else {
+ /* read all pixels */
+ for (i = 0; i < n; i++) {
+ index[i] = vl_getpixel(FLIP2(y[i])*_w_ + x[i]);
+ }
+ }
}
-
/****************************************************************************
* Z-buffer
***************************************************************************/
-
/****************************************************************************
* Optimized triangle rendering
***************************************************************************/
#define NAME tri_rgb_flat
#define SETUP_CODE \
- const DMesaContext dmesa = (DMesaContext)ctx; \
- GLuint _b_ = dmesa->buffer->height - 1; \
- GLuint _w_ = dmesa->buffer->width; \
- GLuint rgb = vl_mixrgb(v2->color);
+ const DMesaContext dmesa = (DMesaContext)ctx;\
+ GLuint _b_ = dmesa->buffer->height - 1; \
+ GLuint _w_ = dmesa->buffer->width; \
+ GLuint rgb = vl_mixrgb(v2->color);
#define RENDER_SPAN(span) \
- GLuint i, offset = FLIP2(span.y)*_w_ + span.x; \
- for (i = 0; i < span.end; i++, offset++) { \
- vl_putpixel(offset, rgb); \
- }
+ GLuint i, offset = FLIP2(span.y)*_w_ + span.x;\
+ for (i = 0; i < span.end; i++, offset++) { \
+ vl_putpixel(offset, rgb); \
+ }
#include "swrast/s_tritemp.h"
-
/*
* Z-less flat triangle.
*/
#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
#define SETUP_CODE \
- const DMesaContext dmesa = (DMesaContext)ctx; \
- GLuint _b_ = dmesa->buffer->height - 1; \
- GLuint _w_ = dmesa->buffer->width; \
- GLuint rgb = vl_mixrgb(v2->color);
+ const DMesaContext dmesa = (DMesaContext)ctx; \
+ GLuint _b_ = dmesa->buffer->height - 1; \
+ GLuint _w_ = dmesa->buffer->width; \
+ GLuint rgb = vl_mixrgb(v2->color);
#define RENDER_SPAN(span) \
- GLuint i, offset = FLIP2(span.y)*_w_ + span.x; \
- for (i = 0; i < span.end; i++, offset++) { \
- const DEPTH_TYPE z = FixedToDepth(span.z); \
- if (z < zRow[i]) { \
- vl_putpixel(offset, rgb); \
- zRow[i] = z; \
- } \
- span.z += span.zStep; \
- }
+ GLuint i, offset = FLIP2(span.y)*_w_ + span.x;\
+ for (i = 0; i < span.end; i++, offset++) { \
+ const DEPTH_TYPE z = FixedToDepth(span.z);\
+ if (z < zRow[i]) { \
+ vl_putpixel(offset, rgb); \
+ zRow[i] = z; \
+ } \
+ span.z += span.zStep; \
+ }
#include "swrast/s_tritemp.h"
-
/*
* NON-depth-buffered iterated triangle.
*/
#define INTERP_RGB 1
#define SETUP_CODE \
- const DMesaContext dmesa = (DMesaContext)ctx; \
- GLuint _b_ = dmesa->buffer->height - 1; \
- GLuint _w_ = dmesa->buffer->width;
+ const DMesaContext dmesa = (DMesaContext)ctx;\
+ GLuint _b_ = dmesa->buffer->height - 1; \
+ GLuint _w_ = dmesa->buffer->width;
#define RENDER_SPAN(span) \
- GLuint i, offset = FLIP2(span.y)*_w_ + span.x; \
- for (i = 0; i < span.end; i++, offset++) { \
- vl_putpixel(offset, vl_mixfix(span.red, span.green, span.blue)); \
- span.red += span.redStep; \
- span.green += span.greenStep; \
- span.blue += span.blueStep; \
- }
+ GLuint i, offset = FLIP2(span.y)*_w_ + span.x; \
+ for (i = 0; i < span.end; i++, offset++) { \
+ vl_putpixel(offset, vl_mixfix(span.red, span.green, span.blue)); \
+ span.red += span.redStep; \
+ span.green += span.greenStep; \
+ span.blue += span.blueStep; \
+ }
#include "swrast/s_tritemp.h"
-
/*
* Z-less iterated triangle.
*/
#define INTERP_RGB 1
#define SETUP_CODE \
- const DMesaContext dmesa = (DMesaContext)ctx; \
- GLuint _b_ = dmesa->buffer->height - 1; \
- GLuint _w_ = dmesa->buffer->width;
+ const DMesaContext dmesa = (DMesaContext)ctx;\
+ GLuint _b_ = dmesa->buffer->height - 1; \
+ GLuint _w_ = dmesa->buffer->width;
#define RENDER_SPAN(span) \
- GLuint i, offset = FLIP2(span.y)*_w_ + span.x; \
- for (i = 0; i < span.end; i++, offset++) { \
- const DEPTH_TYPE z = FixedToDepth(span.z); \
- if (z < zRow[i]) { \
- vl_putpixel(offset, vl_mixfix(span.red, span.green, span.blue));\
- zRow[i] = z; \
- } \
- span.red += span.redStep; \
- span.green += span.greenStep; \
- span.blue += span.blueStep; \
- span.z += span.zStep; \
- }
+ GLuint i, offset = FLIP2(span.y)*_w_ + span.x; \
+ for (i = 0; i < span.end; i++, offset++) { \
+ const DEPTH_TYPE z = FixedToDepth(span.z); \
+ if (z < zRow[i]) { \
+ vl_putpixel(offset, vl_mixfix(span.red, span.green, span.blue));\
+ zRow[i] = z; \
+ } \
+ span.red += span.redStep; \
+ span.green += span.greenStep; \
+ span.blue += span.blueStep; \
+ span.z += span.zStep; \
+ }
#include "swrast/s_tritemp.h"
-
/*
* Analyze context state to see if we can provide a fast triangle function
* Otherwise, return NULL.
*/
-static swrast_tri_func dmesa_choose_tri_function (GLcontext *ctx)
+static swrast_tri_func
+dmesa_choose_tri_function (GLcontext *ctx)
{
- const SWcontext *swrast = SWRAST_CONTEXT(ctx);
-
- if ((ctx->RenderMode != GL_RENDER)
- || (ctx->Polygon.SmoothFlag)
- || (ctx->Polygon.StippleFlag)
- || (ctx->Texture._EnabledUnits)
- || (swrast->_RasterMask & MULTI_DRAW_BIT)
- || (ctx->Polygon.CullFlag && ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)) {
- return (swrast_tri_func)NULL;
- }
-
- if (swrast->_RasterMask==DEPTH_BIT
- && ctx->Depth.Func==GL_LESS
- && ctx->Depth.Mask==GL_TRUE
- && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
- return (ctx->Light.ShadeModel==GL_SMOOTH) ? tri_rgb_iter_zless : tri_rgb_flat_zless;
- }
-
- if (swrast->_RasterMask==0) { /* no depth test */
- return (ctx->Light.ShadeModel==GL_SMOOTH) ? tri_rgb_iter : tri_rgb_flat;
- }
-
- return (swrast_tri_func)NULL;
-}
+ const SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
+ if ((ctx->RenderMode != GL_RENDER)
+ || (ctx->Polygon.SmoothFlag)
+ || (ctx->Polygon.StippleFlag)
+ || (ctx->Texture._EnabledUnits)
+ || (swrast->_RasterMask & MULTI_DRAW_BIT)
+ || (ctx->Polygon.CullFlag && ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)) {
+ return (swrast_tri_func)NULL;
+ }
+
+ if (swrast->_RasterMask==DEPTH_BIT
+ && ctx->Depth.Func==GL_LESS
+ && ctx->Depth.Mask==GL_TRUE
+ && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
+ return (ctx->Light.ShadeModel==GL_SMOOTH) ? tri_rgb_iter_zless : tri_rgb_flat_zless;
+ }
+
+ if (swrast->_RasterMask==0) { /* no depth test */
+ return (ctx->Light.ShadeModel==GL_SMOOTH) ? tri_rgb_iter : tri_rgb_flat;
+ }
+ return (swrast_tri_func)NULL;
+}
/* Override for the swrast triangle-selection function. Try to use one
* of our internal triangle functions, otherwise fall back to the
* standard swrast functions.
*/
-static void dmesa_choose_tri (GLcontext *ctx)
+static void
+dmesa_choose_tri (GLcontext *ctx)
{
- SWcontext *swrast = SWRAST_CONTEXT(ctx);
+ SWcontext *swrast = SWRAST_CONTEXT(ctx);
- if (!(swrast->Triangle=dmesa_choose_tri_function(ctx)))
- _swrast_choose_triangle(ctx);
+ if (!(swrast->Triangle=dmesa_choose_tri_function(ctx))) {
+ _swrast_choose_triangle(ctx);
+ }
}
-
/****************************************************************************
* Optimized line rendering
***************************************************************************/
#define CLIP_HACK 1
#define SETUP_CODE \
- const DMesaContext dmesa = (DMesaContext)ctx; \
- GLuint _b_ = dmesa->buffer->height - 1; \
- GLuint _w_ = dmesa->buffer->width; \
- GLuint rgb = vl_mixrgb(vert1->color);
+ const DMesaContext dmesa = (DMesaContext)ctx;\
+ GLuint _b_ = dmesa->buffer->height - 1; \
+ GLuint _w_ = dmesa->buffer->width; \
+ GLuint rgb = vl_mixrgb(vert1->color);
#define PLOT(X,Y) vl_putpixel(FLIP2(Y) * _w_ + X, rgb);
#include "swrast/s_linetemp.h"
-
/*
* Z-less flat line.
*/
#define CLIP_HACK 1
#define SETUP_CODE \
- const DMesaContext dmesa = (DMesaContext)ctx; \
- GLuint _b_ = dmesa->buffer->height - 1; \
- GLuint _w_ = dmesa->buffer->width; \
- GLuint rgb = vl_mixrgb(vert1->color);
+ const DMesaContext dmesa = (DMesaContext)ctx;\
+ GLuint _b_ = dmesa->buffer->height - 1; \
+ GLuint _w_ = dmesa->buffer->width; \
+ GLuint rgb = vl_mixrgb(vert1->color);
#define PLOT(X,Y) \
- if (Z < *zPtr) { \
- *zPtr = Z; \
- vl_putpixel(FLIP2(Y) * _w_ + X, rgb); \
- }
+ if (Z < *zPtr) { \
+ *zPtr = Z; \
+ vl_putpixel(FLIP2(Y) * _w_ + X, rgb); \
+ }
#include "swrast/s_linetemp.h"
-
/*
* NON-depth-buffered iterated line.
*/
#define line_rgb_iter NULL
-
/*
* Z-less iterated line.
*/
#define line_rgb_iter_zless NULL
-
/*
* Analyze context state to see if we can provide a fast line function
* Otherwise, return NULL.
*/
-static swrast_line_func dmesa_choose_line_function (GLcontext *ctx)
+static swrast_line_func
+dmesa_choose_line_function (GLcontext *ctx)
{
- const SWcontext *swrast = SWRAST_CONTEXT(ctx);
-
- if ((ctx->RenderMode != GL_RENDER)
- || (ctx->Line.SmoothFlag)
- || (ctx->Texture._EnabledUnits)
- || (ctx->Line.StippleFlag)
- || (swrast->_RasterMask & MULTI_DRAW_BIT)
- || (ctx->Line.Width!=1.0F)) {
- return (swrast_line_func)NULL;
- }
-
- if (swrast->_RasterMask==DEPTH_BIT
- && ctx->Depth.Func==GL_LESS
- && ctx->Depth.Mask==GL_TRUE
- && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
- return (ctx->Light.ShadeModel==GL_SMOOTH) ? line_rgb_iter_zless : line_rgb_flat_zless;
- }
-
- if (swrast->_RasterMask==0) { /* no depth test */
- return (ctx->Light.ShadeModel==GL_SMOOTH) ? line_rgb_iter : line_rgb_flat;
- }
-
- return (swrast_line_func)NULL;
-}
+ const SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
+ if ((ctx->RenderMode != GL_RENDER)
+ || (ctx->Line.SmoothFlag)
+ || (ctx->Texture._EnabledUnits)
+ || (ctx->Line.StippleFlag)
+ || (swrast->_RasterMask & MULTI_DRAW_BIT)
+ || (ctx->Line.Width!=1.0F)) {
+ return (swrast_line_func)NULL;
+ }
+
+ if (swrast->_RasterMask==DEPTH_BIT
+ && ctx->Depth.Func==GL_LESS
+ && ctx->Depth.Mask==GL_TRUE
+ && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
+ return (ctx->Light.ShadeModel==GL_SMOOTH) ? line_rgb_iter_zless : line_rgb_flat_zless;
+ }
+ if (swrast->_RasterMask==0) { /* no depth test */
+ return (ctx->Light.ShadeModel==GL_SMOOTH) ? line_rgb_iter : line_rgb_flat;
+ }
+
+ return (swrast_line_func)NULL;
+}
/* Override for the swrast line-selection function. Try to use one
* of our internal line functions, otherwise fall back to the
* standard swrast functions.
*/
-static void dmesa_choose_line (GLcontext *ctx)
+static void
+dmesa_choose_line (GLcontext *ctx)
{
- SWcontext *swrast = SWRAST_CONTEXT(ctx);
+ SWcontext *swrast = SWRAST_CONTEXT(ctx);
- if (!(swrast->Line=dmesa_choose_line_function(ctx)))
- _swrast_choose_line(ctx);
+ if (!(swrast->Line=dmesa_choose_line_function(ctx))) {
+ _swrast_choose_line(ctx);
+ }
}
-
/****************************************************************************
* Miscellaneous device driver funcs
***************************************************************************/
static const struct gl_texture_format *
-choose_tex_format( GLcontext *ctx, GLint internalFormat,
- GLenum format, GLenum type )
+choose_tex_format (GLcontext *ctx, GLint internalFormat,
+ GLenum format, GLenum type)
{
switch (internalFormat) {
case GL_COMPRESSED_RGB_ARB:
}
-
-static void clear_index (GLcontext *ctx, GLuint index)
+static void
+clear_index (GLcontext *ctx, GLuint index)
{
- ((DMesaContext)ctx)->ClearIndex = index;
+ ((DMesaContext)ctx)->ClearIndex = index;
}
-static void clear_color (GLcontext *ctx, const GLfloat color[4])
+
+static void
+clear_color (GLcontext *ctx, const GLfloat color[4])
{
- GLubyte col[4];
- CLAMPED_FLOAT_TO_UBYTE(col[0], color[0]);
- CLAMPED_FLOAT_TO_UBYTE(col[1], color[1]);
- CLAMPED_FLOAT_TO_UBYTE(col[2], color[2]);
- CLAMPED_FLOAT_TO_UBYTE(col[3], color[3]);
- ((DMesaContext)ctx)->ClearColor = vl_mixrgba(col);
+ GLubyte col[4];
+ CLAMPED_FLOAT_TO_UBYTE(col[0], color[0]);
+ CLAMPED_FLOAT_TO_UBYTE(col[1], color[1]);
+ CLAMPED_FLOAT_TO_UBYTE(col[2], color[2]);
+ CLAMPED_FLOAT_TO_UBYTE(col[3], color[3]);
+ ((DMesaContext)ctx)->ClearColor = vl_mixrgba(col);
}
-
-static void clear (GLcontext *ctx, GLbitfield mask, GLboolean all,
- GLint x, GLint y, GLint width, GLint height)
+static void
+clear (GLcontext *ctx, GLbitfield mask, GLboolean all,
+ GLint x, GLint y, GLint width, GLint height)
{
- const DMesaContext c = (DMesaContext)ctx;
- const GLuint *colorMask = (GLuint *)&ctx->Color.ColorMask;
-
-/*
- * Clear the specified region of the buffers indicated by 'mask'
- * using the clear color or index as specified by one of the two
- * functions above.
- * If all==GL_TRUE, clear whole buffer, else just clear region defined
- * by x,y,width,height
- */
-
- /* we can't handle color or index masking */
- if ((*colorMask == 0xffffffff) && (ctx->Color.IndexMask == 0xffffffff)) {
- if (mask & DD_BACK_LEFT_BIT) {
- int color = ((GLvisual *)(c->visual))->rgbMode ? c->ClearColor : c->ClearIndex;
-
- if (all) {
- vl_clear(color);
- } else {
- vl_rect(x, c->buffer->height - y - height, width, height, color);
- }
-
- mask &= ~DD_BACK_LEFT_BIT;
- }
- }
+ const DMesaContext c = (DMesaContext)ctx;
+ const GLuint *colorMask = (GLuint *)&ctx->Color.ColorMask;
+
+ /*
+ * Clear the specified region of the buffers indicated by 'mask'
+ * using the clear color or index as specified by one of the two
+ * functions above.
+ * If all==GL_TRUE, clear whole buffer, else just clear region defined
+ * by x,y,width,height
+ */
+
+ /* we can't handle color or index masking */
+ if ((*colorMask == 0xffffffff) && (ctx->Color.IndexMask == 0xffffffff)) {
+ if (mask & DD_BACK_LEFT_BIT) {
+ int color = ((GLvisual *)(c->visual))->rgbMode ? c->ClearColor : c->ClearIndex;
+
+ if (all) {
+ vl_clear(color);
+ } else {
+ vl_rect(x, c->buffer->height - y - height, width, height, color);
+ }
+
+ mask &= ~DD_BACK_LEFT_BIT;
+ }
+ }
- if (mask) {
- _swrast_Clear(ctx, mask, all, x, y, width, height);
- }
+ if (mask) {
+ _swrast_Clear(ctx, mask, all, x, y, width, height);
+ }
}
-
/*
* This function is called to specify which buffer to read and write
* for software rasterization (swrast) fallbacks. This doesn't necessarily
* correspond to glDrawBuffer() or glReadBuffer() calls.
*/
-static void set_buffer (GLcontext *ctx, GLframebuffer *colorBuffer, GLuint bufferBit)
+static void
+set_buffer (GLcontext *ctx, GLframebuffer *colorBuffer, GLuint bufferBit)
{
- /*
- * XXX todo - examine bufferBit and set read/write pointers
- */
- /* Normally, we would have
- * ctx->Driver.ReadBuffer == set_read_buffer
- * ctx->Driver.DrawBuffer == set_draw_buffer
- * and make sure set_draw_buffer calls _swrast_DrawBuffer,
- * which in turn will call this routine via dd->SetBuffer.
- */
+ /*
+ * XXX todo - examine bufferBit and set read/write pointers
+ */
+ /* Normally, we would have
+ * ctx->Driver.ReadBuffer == set_read_buffer
+ * ctx->Driver.DrawBuffer == set_draw_buffer
+ * and make sure set_draw_buffer calls _swrast_DrawBuffer,
+ * which in turn will call this routine via dd->SetBuffer.
+ */
}
-
/*
* Return the width and height of the current buffer.
* If anything special has to been done when the buffer/window is
* resized, do it now.
*/
-static void get_buffer_size (GLframebuffer *buffer, GLuint *width, GLuint *height)
+static void
+get_buffer_size (GLframebuffer *buffer, GLuint *width, GLuint *height)
{
- DMesaBuffer b = (DMesaBuffer)buffer;
+ DMesaBuffer b = (DMesaBuffer)buffer;
- *width = b->width;
- *height = b->height;
+ *width = b->width;
+ *height = b->height;
}
-
-static const GLubyte* get_string (GLcontext *ctx, GLenum name)
+static const GLubyte *
+get_string (GLcontext *ctx, GLenum name)
{
- switch (name) {
- case GL_RENDERER:
- return (const GLubyte *)"Mesa DJGPP";
- default:
- return NULL;
- }
+ switch (name) {
+ case GL_RENDERER:
+ return (const GLubyte *)"Mesa DJGPP";
+ default:
+ return NULL;
+ }
}
-
-static void finish (GLcontext *ctx)
+static void
+finish (GLcontext *ctx)
{
- /*
- * XXX todo - OPTIONAL FUNCTION: implements glFinish if possible
- */
+ /*
+ * XXX todo - OPTIONAL FUNCTION: implements glFinish if possible
+ */
}
-
-static void flush (GLcontext *ctx)
+static void
+flush (GLcontext *ctx)
{
- /*
- * XXX todo - OPTIONAL FUNCTION: implements glFlush if possible
- */
+ /*
+ * XXX todo - OPTIONAL FUNCTION: implements glFlush if possible
+ */
}
-
/****************************************************************************
* State
***************************************************************************/
-#define DMESA_NEW_LINE (_NEW_LINE | \
- _NEW_TEXTURE | \
- _NEW_LIGHT | \
- _NEW_DEPTH | \
- _NEW_RENDERMODE | \
- _SWRAST_NEW_RASTERMASK)
+#define DMESA_NEW_LINE (_NEW_LINE | \
+ _NEW_TEXTURE | \
+ _NEW_LIGHT | \
+ _NEW_DEPTH | \
+ _NEW_RENDERMODE | \
+ _SWRAST_NEW_RASTERMASK)
#define DMESA_NEW_TRIANGLE (_NEW_POLYGON | \
_NEW_TEXTURE | \
/* Extend the software rasterizer with our line and triangle
* functions.
*/
-static void dmesa_register_swrast_functions (GLcontext *ctx)
+static void
+dmesa_register_swrast_functions (GLcontext *ctx)
{
- SWcontext *swrast = SWRAST_CONTEXT(ctx);
+ SWcontext *swrast = SWRAST_CONTEXT(ctx);
- swrast->choose_line = dmesa_choose_line;
- swrast->choose_triangle = dmesa_choose_tri;
+ swrast->choose_line = dmesa_choose_line;
+ swrast->choose_triangle = dmesa_choose_tri;
- swrast->invalidate_line |= DMESA_NEW_LINE;
- swrast->invalidate_triangle |= DMESA_NEW_TRIANGLE;
+ swrast->invalidate_line |= DMESA_NEW_LINE;
+ swrast->invalidate_triangle |= DMESA_NEW_TRIANGLE;
}
-
-static void dmesa_update_state (GLcontext *ctx, GLuint new_state)
+static void
+dmesa_update_state (GLcontext *ctx, GLuint new_state)
{
- /* Propagate statechange information to swrast and swrast_setup
- * modules. The DMesa driver has no internal GL-dependent state.
- */
- _swrast_InvalidateState( ctx, new_state );
- _ac_InvalidateState( ctx, new_state );
- _tnl_InvalidateState( ctx, new_state );
- _swsetup_InvalidateState( ctx, new_state );
+ /* Propagate statechange information to swrast and swrast_setup
+ * modules. The DMesa driver has no internal GL-dependent state.
+ */
+ _swrast_InvalidateState( ctx, new_state );
+ _ac_InvalidateState( ctx, new_state );
+ _tnl_InvalidateState( ctx, new_state );
+ _swsetup_InvalidateState( ctx, new_state );
}
-
/* Initialize the device driver function table with the functions
* we implement in this driver.
*/
-static void dmesa_init_driver_functions (DMesaVisual visual,
- struct dd_function_table *driver)
+static void
+dmesa_init_driver_functions (DMesaVisual visual,
+ struct dd_function_table *driver)
{
- driver->UpdateState = dmesa_update_state;
- driver->GetString = get_string;
- driver->GetBufferSize = get_buffer_size;
- driver->Flush = flush;
- driver->Finish = finish;
- driver->Clear = clear;
- driver->ClearColor = clear_color;
- driver->ClearIndex = clear_index;
+ driver->UpdateState = dmesa_update_state;
+ driver->GetString = get_string;
+ driver->GetBufferSize = get_buffer_size;
+ driver->Flush = flush;
+ driver->Finish = finish;
+ driver->Clear = clear;
+ driver->ClearColor = clear_color;
+ driver->ClearIndex = clear_index;
#if SWTC
- driver->ChooseTextureFormat = choose_tex_format;
+ driver->ChooseTextureFormat = choose_tex_format;
#endif
}
-
/* Setup pointers and other driver state that is constant for the life
* of a context.
*/
-static void dmesa_init_pointers (GLcontext *ctx)
+static void
+dmesa_init_pointers (GLcontext *ctx)
{
- struct swrast_device_driver *dd = _swrast_GetDeviceDriverReference(ctx);
-
- dd->SetBuffer = set_buffer;
-
- /* The span functions should be in `dmesa_update_state', but I'm
- * pretty sure they will never change during the life of the Visual
- */
-
- /* Index span/pixel functions */
- dd->WriteCI32Span = write_index_span;
- dd->WriteCI8Span = write_index8_span;
- dd->WriteMonoCISpan = write_mono_index_span;
- dd->WriteCI32Pixels = write_index_pixels;
- dd->WriteMonoCIPixels = write_mono_index_pixels;
- dd->ReadCI32Span = read_index_span;
- dd->ReadCI32Pixels = read_index_pixels;
-
- /* RGB(A) span/pixel functions */
- dd->WriteRGBASpan = write_rgba_span;
- dd->WriteRGBSpan = write_rgb_span;
- dd->WriteMonoRGBASpan = write_mono_rgba_span;
- dd->WriteRGBAPixels = write_rgba_pixels;
- dd->WriteMonoRGBAPixels = write_mono_rgba_pixels;
- dd->ReadRGBASpan = read_rgba_span;
- dd->ReadRGBAPixels = read_rgba_pixels;
+ struct swrast_device_driver *dd = _swrast_GetDeviceDriverReference(ctx);
+
+ dd->SetBuffer = set_buffer;
+
+ /* The span functions should be in `dmesa_update_state', but I'm
+ * pretty sure they will never change during the life of the Visual
+ */
+
+ /* Index span/pixel functions */
+ dd->WriteCI32Span = write_index_span;
+ dd->WriteCI8Span = write_index8_span;
+ dd->WriteMonoCISpan = write_mono_index_span;
+ dd->WriteCI32Pixels = write_index_pixels;
+ dd->WriteMonoCIPixels = write_mono_index_pixels;
+ dd->ReadCI32Span = read_index_span;
+ dd->ReadCI32Pixels = read_index_pixels;
+
+ /* RGB(A) span/pixel functions */
+ dd->WriteRGBASpan = write_rgba_span;
+ dd->WriteRGBSpan = write_rgb_span;
+ dd->WriteMonoRGBASpan = write_mono_rgba_span;
+ dd->WriteRGBAPixels = write_rgba_pixels;
+ dd->WriteMonoRGBAPixels = write_mono_rgba_pixels;
+ dd->ReadRGBASpan = read_rgba_span;
+ dd->ReadRGBAPixels = read_rgba_pixels;
}
#endif /* FX */
-
/****************************************************************************
* DMesa Public API Functions
***************************************************************************/
/*
* The exact arguments to this function will depend on your window system
*/
-DMesaVisual DMesaCreateVisual (GLint width,
- GLint height,
- GLint colDepth,
- GLint refresh,
- GLboolean dbFlag,
- GLboolean rgbFlag,
- GLint alphaSize,
- GLint depthSize,
- GLint stencilSize,
- GLint accumSize)
+DMesaVisual
+DMesaCreateVisual (GLint width,
+ GLint height,
+ GLint colDepth,
+ GLint refresh,
+ GLboolean dbFlag,
+ GLboolean rgbFlag,
+ GLint alphaSize,
+ GLint depthSize,
+ GLint stencilSize,
+ GLint accumSize)
{
- DMesaVisual v;
- GLint redBits, greenBits, blueBits, alphaBits, indexBits;
- GLboolean sw_alpha;
-
- alphaBits = 0;
-
- if (!rgbFlag) {
- indexBits = 8;
- redBits = 0;
- greenBits = 0;
- blueBits = 0;
- } else {
- indexBits = 0;
- switch (colDepth) {
- case 8:
- redBits = 8;
- greenBits = 8;
- blueBits = 8;
- break;
- case 15:
- alphaBits = 1;
- redBits = 5;
- greenBits = 5;
- blueBits = 5;
- break;
- case 16:
- redBits = 5;
- greenBits = 6;
- blueBits = 5;
- break;
- case 32:
- alphaBits = 8;
- case 24:
- redBits = 8;
- greenBits = 8;
- blueBits = 8;
- break;
- default:
- return NULL;
- }
- }
-
- /* Okay,
- * `alphaBits' is what we can provide
- * `alphaSize' is what app requests
- *
- * Note that alpha buffering is required only if destination alpha is used
- * in alpha blending; alpha blending modes that do not use destination alpha
- * can be used w/o alpha buffer.
- *
- * We will use whatever ALPHA app requests. Later, in `CreateBuffer' we'll
- * instruct Mesa to use its own ALPHA buffer, by passing a non-FALSE value
- * for ALPHA to `_mesa_initialize_framebuffer'.
- *
- * Basically, 32bit modes provide ALPHA storage, but can we rely on this?
- */
- alphaBits = alphaSize;
- sw_alpha = (alphaBits > 0);
+ DMesaVisual v;
+ GLint redBits, greenBits, blueBits, alphaBits, indexBits;
+ GLboolean sw_alpha;
+
+ alphaBits = 0;
+
+ if (!rgbFlag) {
+ indexBits = 8;
+ redBits = 0;
+ greenBits = 0;
+ blueBits = 0;
+ } else {
+ indexBits = 0;
+ switch (colDepth) {
+ case 8:
+ redBits = 8;
+ greenBits = 8;
+ blueBits = 8;
+ break;
+ case 15:
+ alphaBits = 1;
+ redBits = 5;
+ greenBits = 5;
+ blueBits = 5;
+ break;
+ case 16:
+ redBits = 5;
+ greenBits = 6;
+ blueBits = 5;
+ break;
+ case 32:
+ alphaBits = 8;
+ case 24:
+ redBits = 8;
+ greenBits = 8;
+ blueBits = 8;
+ break;
+ default:
+ return NULL;
+ }
+ }
+
+ /* Okay,
+ * `alphaBits' is what we can provide
+ * `alphaSize' is what app requests
+ *
+ * Note that alpha buffering is required only if destination alpha is used
+ * in alpha blending; alpha blending modes that do not use destination alpha
+ * can be used w/o alpha buffer.
+ *
+ * We will use whatever ALPHA app requests. Later, in `CreateBuffer' we'll
+ * instruct Mesa to use its own ALPHA buffer, by passing a non-FALSE value
+ * for ALPHA to `_mesa_initialize_framebuffer'.
+ *
+ * Basically, 32bit modes provide ALPHA storage, but can we rely on this?
+ */
+ alphaBits = alphaSize;
+ sw_alpha = (alphaBits > 0);
#ifndef FX
- if (!dbFlag) {
- return NULL;
- }
- if ((colDepth=vl_video_init(width, height, colDepth, rgbFlag, refresh)) <= 0) {
- return NULL;
- }
+ if (!dbFlag) {
+ return NULL;
+ }
+ if ((colDepth=vl_video_init(width, height, colDepth, rgbFlag, refresh)) <= 0) {
+ return NULL;
+ }
#else /* FX */
- if (!rgbFlag) {
- return NULL;
- } else {
- char *env;
-
- if ((env = getenv("MESA_FX_INFO")) && (env[0] == 'r')) {
- freopen("MESA.LOG", "w", stderr);
- }
-
- if (refresh && (((env = getenv("FX_GLIDE_REFRESH")) == NULL) || !atoi(env))) {
- /* if we are passed non-zero value for refresh, we need to override
- * default refresh rate. However, if FX_GLIDE_REFRESH is already set
- * to 0, we won't override it, because it has a special meaning for
- * DJGPP Glide3x (switch via VESA, using BIOS default refresh).
- */
- char tmp[32];
- sprintf(tmp, "FX_GLIDE_REFRESH=%u", refresh);
- putenv(tmp);
- }
- }
+ if (!rgbFlag) {
+ return NULL;
+ } else {
+ char *env;
+
+ if ((env = getenv("MESA_FX_INFO")) && (env[0] == 'r')) {
+ freopen("MESA.LOG", "w", stderr);
+ }
+
+ if (refresh && (((env = getenv("FX_GLIDE_REFRESH")) == NULL) || !atoi(env))) {
+ /* if we are passed non-zero value for refresh, we need to override
+ * default refresh rate. However, if FX_GLIDE_REFRESH is already set
+ * to 0, we won't override it, because it has a special meaning for
+ * DJGPP Glide3x (switch via VESA, using BIOS default refresh).
+ */
+ char tmp[32];
+ sprintf(tmp, "FX_GLIDE_REFRESH=%u", refresh);
+ putenv(tmp);
+ }
+ }
#endif /* FX */
- if ((v=(DMesaVisual)CALLOC_STRUCT(dmesa_visual)) != NULL) {
- /* Create core visual */
- _mesa_initialize_visual((GLvisual *)v,
- rgbFlag, /* rgb */
- dbFlag,
- GL_FALSE, /* stereo */
- redBits,
- greenBits,
- blueBits,
- alphaBits,
- indexBits, /* indexBits */
- depthSize,
- stencilSize,
- accumSize, /* accumRed */
- accumSize, /* accumGreen */
- accumSize, /* accumBlue */
- alphaBits?accumSize:0, /* accumAlpha */
- 1); /* numSamples */
+ if ((v=(DMesaVisual)CALLOC_STRUCT(dmesa_visual)) != NULL) {
+ /* Create core visual */
+ _mesa_initialize_visual((GLvisual *)v,
+ rgbFlag, /* rgb */
+ dbFlag,
+ GL_FALSE, /* stereo */
+ redBits,
+ greenBits,
+ blueBits,
+ alphaBits,
+ indexBits, /* indexBits */
+ depthSize,
+ stencilSize,
+ accumSize, /* accumRed */
+ accumSize, /* accumGreen */
+ accumSize, /* accumBlue */
+ alphaBits?accumSize:0, /* accumAlpha */
+ 1); /* numSamples */
#ifndef FX
- v->sw_alpha = sw_alpha;
- v->z_buffer = (depthSize > 0) ? 1 : 0;
+ v->sw_alpha = sw_alpha;
+ v->z_buffer = (depthSize > 0) ? 1 : 0;
#endif
- }
+ }
- return v;
+ return v;
}
-
-void DMesaDestroyVisual (DMesaVisual v)
+void
+DMesaDestroyVisual (DMesaVisual v)
{
#ifndef FX
- vl_video_exit();
+ vl_video_exit();
#endif
- _mesa_destroy_visual((GLvisual *)v);
+ _mesa_destroy_visual((GLvisual *)v);
}
-
-DMesaBuffer DMesaCreateBuffer (DMesaVisual visual,
- GLint xpos, GLint ypos,
- GLint width, GLint height)
+DMesaBuffer
+DMesaCreateBuffer (DMesaVisual visual,
+ GLint xpos, GLint ypos,
+ GLint width, GLint height)
{
#ifndef FX
- DMesaBuffer b;
-
- if ((b=(DMesaBuffer)CALLOC_STRUCT(dmesa_buffer)) != NULL) {
- _mesa_initialize_framebuffer((GLframebuffer *)b,
- (GLvisual *)visual,
- visual->z_buffer == 1,
- ((GLvisual *)visual)->stencilBits > 0,
- ((GLvisual *)visual)->accumRedBits > 0,
- visual->sw_alpha);
- b->xpos = xpos;
- b->ypos = ypos;
- b->width = width;
- b->height = height;
- }
-
- return b;
+ DMesaBuffer b;
+
+ if ((b=(DMesaBuffer)CALLOC_STRUCT(dmesa_buffer)) != NULL) {
+ _mesa_initialize_framebuffer((GLframebuffer *)b,
+ (GLvisual *)visual,
+ visual->z_buffer == 1,
+ ((GLvisual *)visual)->stencilBits > 0,
+ ((GLvisual *)visual)->accumRedBits > 0,
+ visual->sw_alpha);
+ b->xpos = xpos;
+ b->ypos = ypos;
+ b->width = width;
+ b->height = height;
+ }
+
+ return b;
#else /* FX */
- GLvisual *v = (GLvisual *)visual;
- int i = 0, fx_attrib[32];
+ GLvisual *v = (GLvisual *)visual;
+ int i = 0, fx_attrib[32];
- if (v->doubleBufferMode) fx_attrib[i++] = FXMESA_DOUBLEBUFFER;
- if (v->depthBits > 0) { fx_attrib[i++] = FXMESA_DEPTH_SIZE; fx_attrib[i++] = v->depthBits; }
- if (v->stencilBits > 0) { fx_attrib[i++] = FXMESA_STENCIL_SIZE; fx_attrib[i++] = v->stencilBits; }
- if (v->accumRedBits > 0) { fx_attrib[i++] = FXMESA_ACCUM_SIZE; fx_attrib[i++] = v->accumRedBits; }
- if (v->alphaBits) { fx_attrib[i++] = FXMESA_ALPHA_SIZE; fx_attrib[i++] = v->alphaBits; }
- fx_attrib[i++] = FXMESA_COLORDEPTH;
- fx_attrib[i++] = v->redBits + v->greenBits + v->blueBits;
- fx_attrib[i] = FXMESA_NONE;
+ if (v->doubleBufferMode) fx_attrib[i++] = FXMESA_DOUBLEBUFFER;
+ if (v->depthBits > 0) { fx_attrib[i++] = FXMESA_DEPTH_SIZE; fx_attrib[i++] = v->depthBits; }
+ if (v->stencilBits > 0) { fx_attrib[i++] = FXMESA_STENCIL_SIZE; fx_attrib[i++] = v->stencilBits; }
+ if (v->accumRedBits > 0) { fx_attrib[i++] = FXMESA_ACCUM_SIZE; fx_attrib[i++] = v->accumRedBits; }
+ if (v->alphaBits) { fx_attrib[i++] = FXMESA_ALPHA_SIZE; fx_attrib[i++] = v->alphaBits; }
+ fx_attrib[i++] = FXMESA_COLORDEPTH;
+ fx_attrib[i++] = v->redBits + v->greenBits + v->blueBits;
+ fx_attrib[i] = FXMESA_NONE;
- return (DMesaBuffer)fxMesaCreateBestContext(-1, width, height, fx_attrib);
+ return (DMesaBuffer)fxMesaCreateBestContext(-1, width, height, fx_attrib);
#endif /* FX */
}
-
-void DMesaDestroyBuffer (DMesaBuffer b)
+void
+DMesaDestroyBuffer (DMesaBuffer b)
{
#ifndef FX
- if (b->the_window != NULL) {
- free(b->the_window);
- }
- _mesa_destroy_framebuffer((GLframebuffer *)b);
+ if (b->the_window != NULL) {
+ free(b->the_window);
+ }
+ _mesa_destroy_framebuffer((GLframebuffer *)b);
#else
- fxMesaDestroyContext((fxMesaContext)b);
+ fxMesaDestroyContext((fxMesaContext)b);
#endif
}
-
-DMesaContext DMesaCreateContext (DMesaVisual visual,
- DMesaContext share)
+DMesaContext
+DMesaCreateContext (DMesaVisual visual, DMesaContext share)
{
- GLcontext *c;
+ GLcontext *c;
#ifndef FX
- TNLcontext *tnl;
- struct dd_function_table functions;
-
- if ((c=(GLcontext *)CALLOC_STRUCT(dmesa_context)) != NULL) {
- /* Initialize device driver function table */
- _mesa_init_driver_functions(&functions);
- /* override with our functions */
- dmesa_init_driver_functions(visual, &functions);
-
- _mesa_initialize_context(c,
- (GLvisual *)visual,
- (GLcontext *)share,
- &functions,
- (void *)c);
+ TNLcontext *tnl;
+ struct dd_function_table functions;
+
+ if ((c=(GLcontext *)CALLOC_STRUCT(dmesa_context)) != NULL) {
+ /* Initialize device driver function table */
+ _mesa_init_driver_functions(&functions);
+ /* override with our functions */
+ dmesa_init_driver_functions(visual, &functions);
+
+ _mesa_initialize_context(c,
+ (GLvisual *)visual,
+ (GLcontext *)share,
+ &functions,
+ (void *)c);
- _mesa_enable_sw_extensions(c);
- _mesa_enable_1_3_extensions(c);
- _mesa_enable_1_4_extensions(c);
- _mesa_enable_1_5_extensions(c);
- _mesa_enable_2_0_extensions(c);
+ _mesa_enable_sw_extensions(c);
+ _mesa_enable_1_3_extensions(c);
+ _mesa_enable_1_4_extensions(c);
+ _mesa_enable_1_5_extensions(c);
+ _mesa_enable_2_0_extensions(c);
#if SWTC
- if (c->Mesa_DXTn) {
- _mesa_enable_extension(c, "GL_EXT_texture_compression_s3tc");
- _mesa_enable_extension(c, "GL_S3_s3tc");
- }
- _mesa_enable_extension(c, "GL_3DFX_texture_compression_FXT1");
+ if (c->Mesa_DXTn) {
+ _mesa_enable_extension(c, "GL_EXT_texture_compression_s3tc");
+ _mesa_enable_extension(c, "GL_S3_s3tc");
+ }
+ _mesa_enable_extension(c, "GL_3DFX_texture_compression_FXT1");
#endif
- /* you probably have to do a bunch of other initializations here. */
- ((DMesaContext)c)->visual = visual;
-
- /* Initialize the software rasterizer and helper modules.
- */
- _swrast_CreateContext(c);
- _ac_CreateContext(c);
- _tnl_CreateContext(c);
- _swsetup_CreateContext(c);
- /* tnl setup */
- tnl = TNL_CONTEXT(c);
- tnl->Driver.RunPipeline = _tnl_run_pipeline;
- /* swrast setup */
- if (((GLvisual *)visual)->rgbMode) dmesa_register_swrast_functions(c);
- dmesa_init_pointers(c);
- _swsetup_Wakeup(c);
- }
+ /* you probably have to do a bunch of other initializations here. */
+ ((DMesaContext)c)->visual = visual;
+
+ /* Initialize the software rasterizer and helper modules.
+ */
+ _swrast_CreateContext(c);
+ _ac_CreateContext(c);
+ _tnl_CreateContext(c);
+ _swsetup_CreateContext(c);
+ /* tnl setup */
+ tnl = TNL_CONTEXT(c);
+ tnl->Driver.RunPipeline = _tnl_run_pipeline;
+ /* swrast setup */
+ if (((GLvisual *)visual)->rgbMode) dmesa_register_swrast_functions(c);
+ dmesa_init_pointers(c);
+ _swsetup_Wakeup(c);
+ }
#else /* FX */
- c = (GLcontext *)0xdeadbeef;
+ c = (GLcontext *)0xdeadbeef;
#endif /* FX */
- return (DMesaContext)c;
+ return (DMesaContext)c;
}
-
-void DMesaDestroyContext (DMesaContext c)
+void
+DMesaDestroyContext (DMesaContext c)
{
#ifndef FX
- if (c) {
- _swsetup_DestroyContext((GLcontext *)c);
- _swrast_DestroyContext((GLcontext *)c);
- _tnl_DestroyContext((GLcontext *)c);
- _ac_DestroyContext((GLcontext *)c);
- _mesa_destroy_context((GLcontext *)c);
- }
+ if (c) {
+ _swsetup_DestroyContext((GLcontext *)c);
+ _swrast_DestroyContext((GLcontext *)c);
+ _tnl_DestroyContext((GLcontext *)c);
+ _ac_DestroyContext((GLcontext *)c);
+ _mesa_destroy_context((GLcontext *)c);
+ }
#endif
}
-
-GLboolean DMesaMoveBuffer (GLint xpos, GLint ypos)
+GLboolean
+DMesaMoveBuffer (GLint xpos, GLint ypos)
{
#ifndef FX
- GET_CURRENT_CONTEXT(ctx);
- DMesaBuffer b = ((DMesaContext)ctx)->buffer;
-
- if (vl_sync_buffer(&b->the_window, xpos, ypos, b->width, b->height) == 0) {
- b->xpos = xpos;
- b->ypos = ypos;
- return GL_TRUE;
- }
+ GET_CURRENT_CONTEXT(ctx);
+ DMesaBuffer b = ((DMesaContext)ctx)->buffer;
+
+ if (vl_sync_buffer(&b->the_window, xpos, ypos, b->width, b->height) == 0) {
+ b->xpos = xpos;
+ b->ypos = ypos;
+ return GL_TRUE;
+ }
#endif
- return GL_FALSE;
+ return GL_FALSE;
}
-
-GLboolean DMesaResizeBuffer (GLint width, GLint height)
+GLboolean
+DMesaResizeBuffer (GLint width, GLint height)
{
#ifndef FX
- GET_CURRENT_CONTEXT(ctx);
- DMesaBuffer b = ((DMesaContext)ctx)->buffer;
-
- if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, width, height) == 0) {
- b->width = width;
- b->height = height;
- return GL_TRUE;
- }
+ GET_CURRENT_CONTEXT(ctx);
+ DMesaBuffer b = ((DMesaContext)ctx)->buffer;
+
+ if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, width, height) == 0) {
+ b->width = width;
+ b->height = height;
+ return GL_TRUE;
+ }
#endif
- return GL_FALSE;
+ return GL_FALSE;
}
-
/*
* Make the specified context and buffer the current one.
*/
-GLboolean DMesaMakeCurrent (DMesaContext c, DMesaBuffer b)
+GLboolean
+DMesaMakeCurrent (DMesaContext c, DMesaBuffer b)
{
#ifndef FX
- if ((c != NULL) && (b != NULL)) {
- if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, b->width, b->height) != 0) {
- return GL_FALSE;
- }
-
- c->buffer = b;
-
- _mesa_make_current((GLcontext *)c, (GLframebuffer *)b);
- if (((GLcontext *)c)->Viewport.Width == 0) {
- /* initialize viewport to window size */
- _mesa_Viewport(0, 0, b->width, b->height);
- }
- } else {
- /* Detach */
- _mesa_make_current(NULL, NULL);
- }
+ if ((c != NULL) && (b != NULL)) {
+ if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, b->width, b->height) != 0) {
+ return GL_FALSE;
+ }
+
+ c->buffer = b;
+
+ _mesa_make_current((GLcontext *)c, (GLframebuffer *)b);
+ if (((GLcontext *)c)->Viewport.Width == 0) {
+ /* initialize viewport to window size */
+ _mesa_Viewport(0, 0, b->width, b->height);
+ }
+ } else {
+ /* Detach */
+ _mesa_make_current(NULL, NULL);
+ }
#else
- fxMesaMakeCurrent((fxMesaContext)b);
+ fxMesaMakeCurrent((fxMesaContext)b);
#endif
- return GL_TRUE;
+ return GL_TRUE;
}
-
-void DMesaSwapBuffers (DMesaBuffer b)
+void
+DMesaSwapBuffers (DMesaBuffer b)
{
- /* copy/swap back buffer to front if applicable */
+ /* copy/swap back buffer to front if applicable */
#ifndef FX
- GET_CURRENT_CONTEXT(ctx);
- _mesa_notifySwapBuffers(ctx);
- vl_flip();
+ GET_CURRENT_CONTEXT(ctx);
+ _mesa_notifySwapBuffers(ctx);
+ vl_flip();
#else
- fxMesaSwapBuffers();
+ fxMesaSwapBuffers();
#endif
}
-
-void DMesaSetCI (int ndx, GLfloat red, GLfloat green, GLfloat blue)
+void
+DMesaSetCI (int ndx, GLfloat red, GLfloat green, GLfloat blue)
{
#ifndef FX
- vl_setCI(ndx, red, green, blue);
+ vl_setCI(ndx, red, green, blue);
#endif
}
-
-DMesaContext DMesaGetCurrentContext (void)
+DMesaContext
+DMesaGetCurrentContext (void)
{
- GET_CURRENT_CONTEXT(ctx);
+ GET_CURRENT_CONTEXT(ctx);
#ifndef FX
#else
- if (ctx != NULL) {
- ctx = (GLcontext *)0xdeadbeef;
- }
+ if (ctx != NULL) {
+ ctx = (GLcontext *)0xdeadbeef;
+ }
#endif
- return (DMesaContext)ctx;
+ return (DMesaContext)ctx;
}
-
-DMesaBuffer DMesaGetCurrentBuffer (void)
+DMesaBuffer
+DMesaGetCurrentBuffer (void)
{
- const DMesaContext dmesa = DMesaGetCurrentContext();
+ const DMesaContext dmesa = DMesaGetCurrentContext();
- if (dmesa == NULL) {
- return NULL;
- }
+ if (dmesa == NULL) {
+ return NULL;
+ }
#ifndef FX
- return dmesa->buffer;
+ return dmesa->buffer;
#else
- return (DMesaBuffer)fxMesaGetCurrentContext();
+ return (DMesaBuffer)fxMesaGetCurrentContext();
#endif
}
-
-void *DMesaGetProcAddress (const char *name)
+void *
+DMesaGetProcAddress (const char *name)
{
- void *p = (void *)_glapi_get_proc_address(name);
+ void *p = (void *)_glapi_get_proc_address(name);
-/* TODO: handle DMesa* namespace
- if (p == NULL) {
- }
-*/
+ /* TODO: handle DMesa* namespace
+ if (p == NULL) {
+ }
+ */
- return p;
+ return p;
}
-
-int DMesaGetIntegerv (GLenum pname, GLint *params)
+int
+DMesaGetIntegerv (GLenum pname, GLint *params)
{
- switch (pname) {
- case DMESA_GET_SCREEN_SIZE:
- #ifndef FX
- vl_get(VL_GET_SCREEN_SIZE, params);
- #else
- fxGetScreenGeometry(¶ms[0], ¶ms[1]);
- #endif
- break;
- case DMESA_GET_DRIVER_CAPS:
- #ifndef FX
- params[0] = DMESA_DRIVER_SWDB_BIT;
- #else
- params[0] = DMESA_DRIVER_LLWO_BIT;
- #endif
- break;
- case DMESA_GET_VIDEO_MODES:
- #ifndef FX
- return vl_get(VL_GET_VIDEO_MODES, params);
- #else
- return -1; /* TODO */
- #endif
- case DMESA_GET_BUFFER_ADDR:
- #ifndef FX
- {
- DMesaContext c = (DMesaContext)DMesaGetCurrentContext();
- if (c != NULL) {
- DMesaBuffer b = c->buffer;
- if (b != NULL) {
- params[0] = (GLint)b->the_window;
- }
- }
- }
- #else
- return -1;
- #endif
- break;
- default:
- return -1;
- }
-
- return 0;
+ switch (pname) {
+ case DMESA_GET_SCREEN_SIZE:
+ #ifndef FX
+ vl_get(VL_GET_SCREEN_SIZE, params);
+ #else
+ fxGetScreenGeometry(¶ms[0], ¶ms[1]);
+ #endif
+ break;
+ case DMESA_GET_DRIVER_CAPS:
+ #ifndef FX
+ params[0] = DMESA_DRIVER_SWDB_BIT;
+ #else
+ params[0] = DMESA_DRIVER_LLWO_BIT;
+ #endif
+ break;
+ case DMESA_GET_VIDEO_MODES:
+ #ifndef FX
+ return vl_get(VL_GET_VIDEO_MODES, params);
+ #else
+ return -1; /* TODO */
+ #endif
+ case DMESA_GET_BUFFER_ADDR: {
+ #ifndef FX
+ DMesaContext c = (DMesaContext)DMesaGetCurrentContext();
+ if (c != NULL) {
+ DMesaBuffer b = c->buffer;
+ if (b != NULL) {
+ params[0] = (GLint)b->the_window;
+ }
+ }
+ break;
+ #else
+ return -1;
+ #endif
+ }
+ default:
+ return -1;
+ }
+
+ return 0;
}
extern_asm(_memset);
DXE_EXPORT_TABLE_AUTO (___dxe_eta___dxtn)
- DXE_EXPORT_ASM (___dj_assert)
- DXE_EXPORT_ASM (_free)
- DXE_EXPORT_ASM (_malloc)
- DXE_EXPORT_ASM (_memset)
+ DXE_EXPORT_ASM (___dj_assert)
+ DXE_EXPORT_ASM (_free)
+ DXE_EXPORT_ASM (_malloc)
+ DXE_EXPORT_ASM (_memset)
DXE_EXPORT_END
#endif
*/
/*
- * DOS/DJGPP device driver v1.5 for Mesa
+ * DOS/DJGPP device driver v1.6 for Mesa
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@users.sourceforge.net
#include "vesa.h"
-
static vl_mode modes[128];
static word16 vesa_ver;
unsigned int vesa_gran_mask, vesa_gran_shift;
-
/*
* VESA info
*/
* VESA 3.0 CRTC timings structure
*/
typedef struct CRTCInfoBlock {
- unsigned short HorizontalTotal;
- unsigned short HorizontalSyncStart;
- unsigned short HorizontalSyncEnd;
- unsigned short VerticalTotal;
- unsigned short VerticalSyncStart;
- unsigned short VerticalSyncEnd;
- unsigned char Flags;
- unsigned long PixelClock; /* units of Hz */
- unsigned short RefreshRate; /* units of 0.01 Hz */
- unsigned char reserved[40];
+ unsigned short HorizontalTotal;
+ unsigned short HorizontalSyncStart;
+ unsigned short HorizontalSyncEnd;
+ unsigned short VerticalTotal;
+ unsigned short VerticalSyncStart;
+ unsigned short VerticalSyncEnd;
+ unsigned char Flags;
+ unsigned long PixelClock; /* units of Hz */
+ unsigned short RefreshRate; /* units of 0.01 Hz */
+ unsigned char reserved[40];
} __PACKED__ CRTCInfoBlock;
#define HNEG (1 << 2)
#define DOUBLESCAN (1 << 0)
-
/* Desc: Attempts to detect VESA, check video modes and create selectors.
*
* In : -
*
* Note: -
*/
-static vl_mode *vesa_init (void)
+static vl_mode *
+vesa_init (void)
{
- __dpmi_regs r;
- word16 *p;
- vl_mode *q;
- char vesa_info[512], tmp[512];
- int maxsize = 0;
- word32 linearfb = 0;
-
- if (vesa_ver) {
- return modes;
- }
-
- _farpokel(_stubinfo->ds_selector, 0, 0x32454256);
- r.x.ax = 0x4f00;
- r.x.di = 0;
- r.x.es = _stubinfo->ds_segment;
- __dpmi_int(0x10, &r);
- movedata(_stubinfo->ds_selector, 0, _my_ds(), (unsigned)vesa_info, 512);
- if ((r.x.ax!=0x004f) || ((_32_ vesa_info[V_SIGN])!=0x41534556)) {
- return NULL;
- }
-
- p = (word16 *)(((_16_ vesa_info[V_MODE_SEG])<<4) + (_16_ vesa_info[V_MODE_OFS]));
- q = modes;
- do {
- if ((q->mode=_farpeekw(__djgpp_dos_sel, (unsigned long)(p++)))==0xffff) {
- break;
- }
-
- r.x.ax = 0x4f01;
- r.x.cx = q->mode;
- r.x.di = 512;
- r.x.es = _stubinfo->ds_segment;
- __dpmi_int(0x10, &r);
- movedata(_stubinfo->ds_selector, 512, _my_ds(), (unsigned)tmp, 256);
- switch (tmp[M_BPP]) {
- case 16:
- q->bpp = tmp[M_RED] + tmp[M_GREEN] + tmp[M_BLUE];
- break;
- case 8:
- case 15:
- case 24:
- case 32:
- q->bpp = tmp[M_BPP];
- break;
- default:
- q->bpp = 0;
- }
- if ((r.x.ax==0x004f) && ((tmp[M_ATTR]&0x11)==0x11) && q->bpp) {
- q->xres = _16_ tmp[M_XRES];
- q->yres = _16_ tmp[M_YRES];
- q->scanlen = _16_ tmp[M_SCANLEN];
- q->gran = (_16_ tmp[M_GRAN])<<10;
- if (tmp[M_ATTR]&0x80) {
-#if 0
- *(q+1) = *q++;
-#else
- vl_mode *q1 = q + 1;
- *q1 = *q++;
-#endif
- linearfb = _32_ tmp[M_PHYS_PTR];
- q->mode |= 0x4000;
- }
- if (maxsize<(q->scanlen*q->yres)) {
- maxsize = q->scanlen*q->yres;
- }
- q++;
- }
- } while (TRUE);
-
- if (q==modes) {
- return NULL;
- }
- if (linearfb) {
- maxsize = ((maxsize+0xfffUL)&~0xfffUL);
- if (_create_selector(&linear_selector, linearfb, maxsize)) {
- return NULL;
- }
- }
- if (_create_selector(&banked_selector, 0xa0000, modes[0].gran)) {
- _remove_selector(&linear_selector);
- return NULL;
- }
-
- for (q=modes; q->mode!=0xffff; q++) {
- q->sel = (q->mode&0x4000) ? linear_selector : banked_selector;
- }
-
- if (vesa_info[V_MAJOR] >= 2) {
- r.x.ax = 0x4f0a;
- r.x.bx = 0;
- __dpmi_int(0x10, &r);
- if (r.x.ax == 0x004f) {
- vesa_pmcode = (word16 *)malloc(r.x.cx);
- movedata(__djgpp_dos_sel, (r.x.es << 4) + r.x.di, _my_ds(), (unsigned)vesa_pmcode, r.x.cx);
- if (vesa_pmcode[3]) {
- p = (word16 *)((long)vesa_pmcode + vesa_pmcode[3]);
- while (*p++ != 0xffff) ;
- } else {
- p = NULL;
- }
- if (p && (*p != 0xffff)) {
- free(vesa_pmcode);
- vesa_pmcode = NULL;
- } else {
- vesa_swbank = (void *)((long)vesa_pmcode + vesa_pmcode[0]);
- }
- }
- }
-
- vesa_ver = _16_ vesa_info[V_MINOR];
- return modes;
+ __dpmi_regs r;
+ word16 *p;
+ vl_mode *q;
+ char vesa_info[512], tmp[512];
+ int maxsize = 0;
+ word32 linearfb = 0;
+
+ if (vesa_ver) {
+ return modes;
+ }
+
+ _farpokel(_stubinfo->ds_selector, 0, 0x32454256);
+ r.x.ax = 0x4f00;
+ r.x.di = 0;
+ r.x.es = _stubinfo->ds_segment;
+ __dpmi_int(0x10, &r);
+ movedata(_stubinfo->ds_selector, 0, _my_ds(), (unsigned)vesa_info, 512);
+ if ((r.x.ax != 0x004f) || ((_32_ vesa_info[V_SIGN]) != 0x41534556)) {
+ return NULL;
+ }
+
+ p = (word16 *)(((_16_ vesa_info[V_MODE_SEG])<<4) + (_16_ vesa_info[V_MODE_OFS]));
+ q = modes;
+ do {
+ if ((q->mode=_farpeekw(__djgpp_dos_sel, (unsigned long)(p++))) == 0xffff) {
+ break;
+ }
+
+ r.x.ax = 0x4f01;
+ r.x.cx = q->mode;
+ r.x.di = 512;
+ r.x.es = _stubinfo->ds_segment;
+ __dpmi_int(0x10, &r);
+ movedata(_stubinfo->ds_selector, 512, _my_ds(), (unsigned)tmp, 256);
+ switch (tmp[M_BPP]) {
+ case 16:
+ q->bpp = tmp[M_RED] + tmp[M_GREEN] + tmp[M_BLUE];
+ break;
+ case 8:
+ case 15:
+ case 24:
+ case 32:
+ q->bpp = tmp[M_BPP];
+ break;
+ default:
+ q->bpp = 0;
+ }
+ if ((r.x.ax == 0x004f) && ((tmp[M_ATTR] & 0x11) == 0x11) && q->bpp) {
+ q->xres = _16_ tmp[M_XRES];
+ q->yres = _16_ tmp[M_YRES];
+ q->scanlen = _16_ tmp[M_SCANLEN];
+ q->gran = (_16_ tmp[M_GRAN])<<10;
+ if (tmp[M_ATTR] & 0x80) {
+ vl_mode *q1 = q + 1;
+ *q1 = *q++;
+ linearfb = _32_ tmp[M_PHYS_PTR];
+ q->mode |= 0x4000;
+ }
+ if (maxsize < (q->scanlen * q->yres)) {
+ maxsize = q->scanlen * q->yres;
+ }
+ q++;
+ }
+ } while (TRUE);
+
+ if (q == modes) {
+ return NULL;
+ }
+ if (linearfb) {
+ maxsize = (maxsize + 0xfffUL) & ~0xfffUL;
+ if (_create_selector(&linear_selector, linearfb, maxsize)) {
+ return NULL;
+ }
+ }
+ if (_create_selector(&banked_selector, 0xa0000, modes[0].gran)) {
+ _remove_selector(&linear_selector);
+ return NULL;
+ }
+
+ for (q = modes; q->mode != 0xffff; q++) {
+ q->sel = (q->mode & 0x4000) ? linear_selector : banked_selector;
+ }
+
+ if (vesa_info[V_MAJOR] >= 2) {
+ r.x.ax = 0x4f0a;
+ r.x.bx = 0;
+ __dpmi_int(0x10, &r);
+ if (r.x.ax == 0x004f) {
+ vesa_pmcode = (word16 *)malloc(r.x.cx);
+ if (vesa_pmcode != NULL) {
+ movedata(__djgpp_dos_sel, (r.x.es << 4) + r.x.di, _my_ds(), (unsigned)vesa_pmcode, r.x.cx);
+ if (vesa_pmcode[3]) {
+ p = (word16 *)((long)vesa_pmcode + vesa_pmcode[3]);
+ while (*p++ != 0xffff) {
+ }
+ } else {
+ p = NULL;
+ }
+ if (p && (*p != 0xffff)) {
+ free(vesa_pmcode);
+ vesa_pmcode = NULL;
+ } else {
+ vesa_swbank = (void *)((long)vesa_pmcode + vesa_pmcode[0]);
+ }
+ }
+ }
+ }
+
+ vesa_ver = _16_ vesa_info[V_MINOR];
+ return modes;
}
-
/* Desc: Frees all resources allocated by VESA init code.
*
* In : -
*
* Note: -
*/
-static void vesa_fini (void)
+static void
+vesa_fini (void)
{
- if (vesa_ver) {
- _remove_selector(&linear_selector);
- _remove_selector(&banked_selector);
- if (vesa_pmcode != NULL) {
- free(vesa_pmcode);
- vesa_pmcode = NULL;
- }
- }
+ if (vesa_ver) {
+ _remove_selector(&linear_selector);
+ _remove_selector(&banked_selector);
+ if (vesa_pmcode != NULL) {
+ free(vesa_pmcode);
+ vesa_pmcode = NULL;
+ }
+ }
}
-
/* Desc: Uses VESA 3.0 function 0x4F0B to find the closest pixel clock to the requested value.
*
* In : mode, clock
*
* Note: -
*/
-static unsigned long _closest_pixclk (int mode_no, unsigned long vclk)
+static unsigned long
+_closest_pixclk (int mode_no, unsigned long vclk)
{
- __dpmi_regs r;
+ __dpmi_regs r;
- r.x.ax = 0x4F0B;
- r.h.bl = 0;
- r.d.ecx = vclk;
- r.x.dx = mode_no;
- __dpmi_int(0x10, &r);
+ r.x.ax = 0x4F0B;
+ r.h.bl = 0;
+ r.d.ecx = vclk;
+ r.x.dx = mode_no;
+ __dpmi_int(0x10, &r);
- return (r.x.ax==0x004f) ? r.d.ecx : 0;
+ return (r.x.ax == 0x004f) ? r.d.ecx : 0;
}
-
/* Desc: Calculates CRTC mode timings.
*
* In : crtc block, geometry, adjust
*
* Note:
*/
-static void _crtc_timing (CRTCInfoBlock *crtc, int xres, int yres, int xadjust, int yadjust)
+static void
+_crtc_timing (CRTCInfoBlock *crtc, int xres, int yres, int xadjust, int yadjust)
{
- int HTotal, VTotal;
- int HDisp, VDisp;
- int HSS, VSS;
- int HSE, VSE;
- int HSWidth, VSWidth;
- int SS, SE;
- int doublescan = FALSE;
-
- if (yres < 400) {
- doublescan = TRUE;
- yres *= 2;
- }
-
- HDisp = xres;
- HTotal = (int)(HDisp * 1.27) & ~0x7;
- HSWidth = (int)((HTotal - HDisp) / 5) & ~0x7;
- HSS = HDisp + 16;
- HSE = HSS + HSWidth;
- VDisp = yres;
- VTotal = VDisp * 1.07;
- VSWidth = (VTotal / 100) + 1;
- VSS = VDisp + ((int)(VTotal - VDisp) / 5) + 1;
- VSE = VSS + VSWidth;
-
- SS = HSS + xadjust;
- SE = HSE + xadjust;
-
- if (xadjust < 0) {
- if (SS < (HDisp + 8)) {
- SS = HDisp + 8;
- SE = SS + HSWidth;
- }
- } else {
- if ((HTotal - 24) < SE) {
- SE = HTotal - 24;
- SS = SE - HSWidth;
- }
- }
-
- HSS = SS;
- HSE = SE;
-
- SS = VSS + yadjust;
- SE = VSE + yadjust;
-
- if (yadjust < 0) {
- if (SS < (VDisp + 3)) {
- SS = VDisp + 3;
- SE = SS + VSWidth;
- }
- } else {
- if ((VTotal - 4) < SE) {
- SE = VTotal - 4;
- SS = SE - VSWidth;
- }
- }
-
- VSS = SS;
- VSE = SE;
-
- crtc->HorizontalTotal = HTotal;
- crtc->HorizontalSyncStart = HSS;
- crtc->HorizontalSyncEnd = HSE;
- crtc->VerticalTotal = VTotal;
- crtc->VerticalSyncStart = VSS;
- crtc->VerticalSyncEnd = VSE;
- crtc->Flags = HNEG | VNEG;
-
- if (doublescan)
- crtc->Flags |= DOUBLESCAN;
+ int HTotal, VTotal;
+ int HDisp, VDisp;
+ int HSS, VSS;
+ int HSE, VSE;
+ int HSWidth, VSWidth;
+ int SS, SE;
+ int doublescan = FALSE;
+
+ if (yres < 400) {
+ doublescan = TRUE;
+ yres *= 2;
+ }
+
+ HDisp = xres;
+ HTotal = (int)(HDisp * 1.27) & ~0x7;
+ HSWidth = (int)((HTotal - HDisp) / 5) & ~0x7;
+ HSS = HDisp + 16;
+ HSE = HSS + HSWidth;
+ VDisp = yres;
+ VTotal = VDisp * 1.07;
+ VSWidth = (VTotal / 100) + 1;
+ VSS = VDisp + ((int)(VTotal - VDisp) / 5) + 1;
+ VSE = VSS + VSWidth;
+
+ SS = HSS + xadjust;
+ SE = HSE + xadjust;
+
+ if (xadjust < 0) {
+ if (SS < (HDisp + 8)) {
+ SS = HDisp + 8;
+ SE = SS + HSWidth;
+ }
+ } else {
+ if ((HTotal - 24) < SE) {
+ SE = HTotal - 24;
+ SS = SE - HSWidth;
+ }
+ }
+
+ HSS = SS;
+ HSE = SE;
+
+ SS = VSS + yadjust;
+ SE = VSE + yadjust;
+
+ if (yadjust < 0) {
+ if (SS < (VDisp + 3)) {
+ SS = VDisp + 3;
+ SE = SS + VSWidth;
+ }
+ } else {
+ if ((VTotal - 4) < SE) {
+ SE = VTotal - 4;
+ SS = SE - VSWidth;
+ }
+ }
+
+ VSS = SS;
+ VSE = SE;
+
+ crtc->HorizontalTotal = HTotal;
+ crtc->HorizontalSyncStart = HSS;
+ crtc->HorizontalSyncEnd = HSE;
+ crtc->VerticalTotal = VTotal;
+ crtc->VerticalSyncStart = VSS;
+ crtc->VerticalSyncEnd = VSE;
+ crtc->Flags = HNEG | VNEG;
+
+ if (doublescan) {
+ crtc->Flags |= DOUBLESCAN;
+ }
}
-
/* Desc: Attempts to enter specified video mode.
*
* In : ptr to mode structure, refresh rate
*
* Note: -
*/
-static int vesa_entermode (vl_mode *p, int refresh)
+static int
+vesa_entermode (vl_mode *p, int refresh)
{
- __dpmi_regs r;
-
- if (p->mode & 0x4000) {
- VESA.blit = _can_mmx() ? vesa_l_dump_virtual_mmx : vesa_l_dump_virtual;
- } else {
- VESA.blit = vesa_b_dump_virtual;
- { int n; for (vesa_gran_shift=0, n=p->gran; n; vesa_gran_shift++, n>>=1) ; }
- vesa_gran_mask = (1<<(--vesa_gran_shift)) - 1;
- if ((unsigned)p->gran != (vesa_gran_mask+1)) {
- return !0;
- }
- }
-
- if (oldmode == -1) {
- r.x.ax = 0x4f03;
- __dpmi_int(0x10, &r);
- oldmode = r.x.bx;
- }
-
- r.x.ax = 0x4f02;
- r.x.bx = p->mode;
-
- if (refresh && ((vesa_ver>>8) >= 3)) {
- /* VESA 3.0 stuff for controlling the refresh rate */
- CRTCInfoBlock crtc;
- unsigned long vclk;
- double f0;
-
- _crtc_timing(&crtc, p->xres, p->yres, 0, 0);
-
- vclk = (double)crtc.HorizontalTotal * crtc.VerticalTotal * refresh;
- vclk = _closest_pixclk(p->mode, vclk);
-
- if (vclk != 0) {
- f0 = (double)vclk / (crtc.HorizontalTotal * crtc.VerticalTotal);
- /*_current_refresh_rate = (int)(f0 + 0.5);*/
-
- crtc.PixelClock = vclk;
- crtc.RefreshRate = refresh * 100;
-
- movedata(_my_ds(), (unsigned)&crtc, _stubinfo->ds_selector, 0, sizeof(crtc));
-
- r.x.di = 0;
- r.x.es = _stubinfo->ds_segment;
- r.x.bx |= 0x0800;
- }
- }
-
- __dpmi_int(0x10, &r);
- if (r.x.ax != 0x004f) {
- return !0;
- }
-
- if (p->bpp == 8) {
- r.x.ax = 0x4f08;
- r.x.bx = 0x0800;
- __dpmi_int(0x10, &r);
- if (r.x.ax == 0x004f) {
- r.x.ax = 0x4f08;
- r.h.bl = 0x01;
- __dpmi_int(0x10, &r);
- vesa_color_precision = r.h.bh;
- }
- }
-
- return 0;
+ __dpmi_regs r;
+
+ if (p->mode & 0x4000) {
+ VESA.blit = _can_mmx() ? vesa_l_dump_virtual_mmx : vesa_l_dump_virtual;
+ } else {
+ VESA.blit = vesa_b_dump_virtual;
+ { int n; for (vesa_gran_shift=0, n=p->gran; n; vesa_gran_shift++, n>>=1) ; }
+ vesa_gran_mask = (1 << (--vesa_gran_shift)) - 1;
+ if ((unsigned)p->gran != (vesa_gran_mask+1)) {
+ return !0;
+ }
+ }
+
+ if (oldmode == -1) {
+ r.x.ax = 0x4f03;
+ __dpmi_int(0x10, &r);
+ oldmode = r.x.bx;
+ }
+
+ r.x.ax = 0x4f02;
+ r.x.bx = p->mode;
+
+ if (refresh && ((vesa_ver>>8) >= 3)) {
+ /* VESA 3.0 stuff for controlling the refresh rate */
+ CRTCInfoBlock crtc;
+ unsigned long vclk;
+ double f0;
+
+ _crtc_timing(&crtc, p->xres, p->yres, 0, 0);
+
+ vclk = (double)crtc.HorizontalTotal * crtc.VerticalTotal * refresh;
+ vclk = _closest_pixclk(p->mode, vclk);
+
+ if (vclk != 0) {
+ f0 = (double)vclk / (crtc.HorizontalTotal * crtc.VerticalTotal);
+ /*_current_refresh_rate = (int)(f0 + 0.5);*/
+
+ crtc.PixelClock = vclk;
+ crtc.RefreshRate = refresh * 100;
+
+ movedata(_my_ds(), (unsigned)&crtc, _stubinfo->ds_selector, 0, sizeof(crtc));
+
+ r.x.di = 0;
+ r.x.es = _stubinfo->ds_segment;
+ r.x.bx |= 0x0800;
+ }
+ }
+
+ __dpmi_int(0x10, &r);
+ if (r.x.ax != 0x004f) {
+ return !0;
+ }
+
+ if (p->bpp == 8) {
+ r.x.ax = 0x4f08;
+ r.x.bx = 0x0800;
+ __dpmi_int(0x10, &r);
+ if (r.x.ax == 0x004f) {
+ r.x.ax = 0x4f08;
+ r.h.bl = 0x01;
+ __dpmi_int(0x10, &r);
+ vesa_color_precision = r.h.bh;
+ }
+ }
+
+ return 0;
}
-
/* Desc: Restores to the mode prior to first call to vesa_entermode.
*
* In : -
*
* Note: -
*/
-static void vesa_restore (void)
+static void
+vesa_restore (void)
{
- __dpmi_regs r;
-
- if (oldmode != -1) {
- r.x.ax = 0x4f02;
- r.x.bx = oldmode;
- __dpmi_int(0x10, &r);
- oldmode = -1;
- }
+ __dpmi_regs r;
+
+ if (oldmode != -1) {
+ r.x.ax = 0x4f02;
+ r.x.bx = oldmode;
+ __dpmi_int(0x10, &r);
+ oldmode = -1;
+ }
}
-
/* Desc: set one palette entry
*
* In : color index, R, G, B
*
* Note: uses integer values
*/
-static void vesa_setCI_i (int index, int red, int green, int blue)
+static void
+vesa_setCI_i (int index, int red, int green, int blue)
{
#if 0
- __asm("\n\
- movw $0x1010, %%ax \n\
- movb %1, %%dh \n\
- movb %2, %%ch \n\
- int $0x10 \n\
- "::"b"(index), "m"(red), "m"(green), "c"(blue):"%eax", "%edx");
+ __asm("\n\
+ movw $0x1010, %%ax \n\
+ movb %1, %%dh \n\
+ movb %2, %%ch \n\
+ int $0x10 \n\
+ "::"b"(index), "m"(red), "m"(green), "c"(blue):"%eax", "%edx");
#else
- outportb(0x03C8, index);
- outportb(0x03C9, red);
- outportb(0x03C9, green);
- outportb(0x03C9, blue);
+ outportb(0x03C8, index);
+ outportb(0x03C9, red);
+ outportb(0x03C9, green);
+ outportb(0x03C9, blue);
#endif
}
-
/* Desc: set one palette entry
*
* In : color index, R, G, B
*
* Note: uses normalized values
*/
-static void vesa_setCI_f (int index, float red, float green, float blue)
+static void
+vesa_setCI_f (int index, float red, float green, float blue)
{
float max = (1 << vesa_color_precision) - 1;
}
-
/* Desc: state retrieval
*
* In : parameter name, ptr to storage
*
* Note: -
*/
-static int vesa_get (int pname, int *params)
+static int
+vesa_get (int pname, int *params)
{
- switch (pname) {
- case VL_GET_CI_PREC:
- params[0] = vesa_color_precision;
- break;
- default:
- return -1;
- }
- return 0;
+ switch (pname) {
+ case VL_GET_CI_PREC:
+ params[0] = vesa_color_precision;
+ break;
+ default:
+ return -1;
+ }
+ return 0;
}
-
/*
* the driver
*/
vl_driver VESA = {
- vesa_init,
- vesa_entermode,
- NULL,
- vesa_setCI_f,
- vesa_setCI_i,
- vesa_get,
- vesa_restore,
- vesa_fini
+ vesa_init,
+ vesa_entermode,
+ NULL,
+ vesa_setCI_f,
+ vesa_setCI_i,
+ vesa_get,
+ vesa_restore,
+ vesa_fini
};
*/
/*
- * DOS/DJGPP device driver v1.5 for Mesa
+ * DOS/DJGPP device driver v1.6 for Mesa
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@users.sourceforge.net
#include "video.h"
-
static vl_driver *drv;
/* based upon mode specific data: valid entire session */
int vl_video_selector;
int vl_current_offset, vl_current_delta;
-
#if HUGE_LOOKUP
/* These lookup tables are used to extract RGB values in [0,255]
* from 15/16-bit pixel values.
static word8 array_b[256];
-
int (*vl_mixfix) (fixed r, fixed g, fixed b);
int (*vl_mixrgb) (const unsigned char rgb[]);
int (*vl_mixrgba) (const unsigned char rgba[]);
void (*vl_putpixel) (unsigned int offset, int color);
-
/* Desc: color composition (w/o ALPHA)
*
* In : R, G, B
*
* Note: -
*/
-static int vl_mixfix8fake (fixed r, fixed g, fixed b)
+static int
+vl_mixfix8fake (fixed r, fixed g, fixed b)
{
- return array_b[b>>FIXED_SHIFT]*G_CNT*R_CNT
- + array_g[g>>FIXED_SHIFT]*R_CNT
- + array_r[r>>FIXED_SHIFT];
+ return array_b[b>>FIXED_SHIFT]*G_CNT*R_CNT
+ + array_g[g>>FIXED_SHIFT]*R_CNT
+ + array_r[r>>FIXED_SHIFT];
}
#define vl_mixfix8 vl_mixfix8fake
-static int vl_mixfix15 (fixed r, fixed g, fixed b)
+static int
+vl_mixfix15 (fixed r, fixed g, fixed b)
{
- return ((r>>(3+FIXED_SHIFT))<<10)
- |((g>>(3+FIXED_SHIFT))<<5)
- |(b>>(3+FIXED_SHIFT));
+ return ((r>>(3+FIXED_SHIFT))<<10)
+ |((g>>(3+FIXED_SHIFT))<<5)
+ | (b>>(3+FIXED_SHIFT));
}
-static int vl_mixfix16 (fixed r, fixed g, fixed b)
+static int
+vl_mixfix16 (fixed r, fixed g, fixed b)
{
- return ((r>>(3+FIXED_SHIFT))<<11)
- |((g>>(2+FIXED_SHIFT))<<5)
- |(b>>(3+FIXED_SHIFT));
+ return ((r>>(3+FIXED_SHIFT))<<11)
+ |((g>>(2+FIXED_SHIFT))<<5)
+ | (b>>(3+FIXED_SHIFT));
}
#define vl_mixfix24 vl_mixfix32
-static int vl_mixfix32 (fixed r, fixed g, fixed b)
+static int
+vl_mixfix32 (fixed r, fixed g, fixed b)
{
- return ((r>>FIXED_SHIFT)<<16)
- |((g>>FIXED_SHIFT)<<8)
- |(b>>FIXED_SHIFT);
+ return ((r>>FIXED_SHIFT)<<16)
+ |((g>>FIXED_SHIFT)<<8)
+ | (b>>FIXED_SHIFT);
}
-
/* Desc: color composition (w/ ALPHA)
*
* In : array of integers (R, G, B, A)
#define vl_mixrgba15 vl_mixrgb15
#define vl_mixrgba16 vl_mixrgb16
#define vl_mixrgba24 vl_mixrgb24
-static int vl_mixrgba32 (const unsigned char rgba[])
+static int
+vl_mixrgba32 (const unsigned char rgba[])
{
- /* Hack alert:
- * currently, DMesa uses Mesa's alpha buffer;
- * so we don't really care about alpha value here...
- */
- return /*(rgba[3]<<24)|*/(rgba[0]<<16)|(rgba[1]<<8)|(rgba[2]);
+ /* Hack alert:
+ * currently, DMesa uses Mesa's alpha buffer;
+ * so we don't really care about alpha value here...
+ */
+ return /*(rgba[3]<<24) | */(rgba[0]<<16) | (rgba[1]<<8) | (rgba[2]);
}
-
/* Desc: color composition (w/o ALPHA)
*
* In : array of integers (R, G, B)
*
* Note: -
*/
-static int vl_mixrgb8fake (const unsigned char rgb[])
+static int
+vl_mixrgb8fake (const unsigned char rgb[])
{
- return array_b[rgb[2]]*G_CNT*R_CNT
- + array_g[rgb[1]]*R_CNT
- + array_r[rgb[0]];
+ return array_b[rgb[2]]*G_CNT*R_CNT
+ + array_g[rgb[1]]*R_CNT
+ + array_r[rgb[0]];
}
#define vl_mixrgb8 vl_mixrgb8fake
-static int vl_mixrgb15 (const unsigned char rgb[])
+static int
+vl_mixrgb15 (const unsigned char rgb[])
{
- return ((rgb[0]>>3)<<10)|((rgb[1]>>3)<<5)|(rgb[2]>>3);
+ return ((rgb[0]>>3)<<10) | ((rgb[1]>>3)<<5) | (rgb[2]>>3);
}
-static int vl_mixrgb16 (const unsigned char rgb[])
+static int
+vl_mixrgb16 (const unsigned char rgb[])
{
- return ((rgb[0]>>3)<<11)|((rgb[1]>>2)<<5)|(rgb[2]>>3);
+ return ((rgb[0]>>3)<<11) | ((rgb[1]>>2)<<5) | (rgb[2]>>3);
}
#define vl_mixrgb24 vl_mixrgb32
-static int vl_mixrgb32 (const unsigned char rgb[])
+static int
+vl_mixrgb32 (const unsigned char rgb[])
{
- return (rgb[0]<<16)|(rgb[1]<<8)|(rgb[2]);
+ return (rgb[0]<<16) | (rgb[1]<<8) | (rgb[2]);
}
-
/* Desc: color decomposition
*
* In : pixel offset, array of integers to hold color components (R, G, B, A)
*
* Note: uses current read buffer
*/
-static void v_getrgba8fake6 (unsigned int offset, unsigned char rgba[4])
+static void
+v_getrgba8fake6 (unsigned int offset, unsigned char rgba[4])
{
- word32 c = VGAPalette[((word8 *)vl_current_read_buffer)[offset]];
- rgba[0] = _rgb_scale_6[(c >> 16) & 0x3F];
- rgba[1] = _rgb_scale_6[(c >> 8) & 0x3F];
- rgba[2] = _rgb_scale_6[c & 0x3F];
- /*rgba[3] = c >> 24;*/ /* dummy alpha; we have separate SW alpha, so ignore */
+ word32 c = VGAPalette[((word8 *)vl_current_read_buffer)[offset]];
+ rgba[0] = _rgb_scale_6[(c >> 16) & 0x3F];
+ rgba[1] = _rgb_scale_6[(c >> 8) & 0x3F];
+ rgba[2] = _rgb_scale_6[ c & 0x3F];
+ /*rgba[3] = c >> 24;*/ /* dummy alpha; we have separate SW alpha, so ignore */
}
-static void v_getrgba8fake8 (unsigned int offset, unsigned char rgba[4])
+static void
+v_getrgba8fake8 (unsigned int offset, unsigned char rgba[4])
{
- word32 c = VGAPalette[((word8 *)vl_current_read_buffer)[offset]];
- rgba[0] = c >> 16;
- rgba[1] = c >> 8;
- rgba[2] = c;
- /*rgba[3] = c >> 24;*/ /* dummy alpha; we have separate SW alpha, so ignore */
+ word32 c = VGAPalette[((word8 *)vl_current_read_buffer)[offset]];
+ rgba[0] = c >> 16;
+ rgba[1] = c >> 8;
+ rgba[2] = c;
+ /*rgba[3] = c >> 24;*/ /* dummy alpha; we have separate SW alpha, so ignore */
}
#define v_getrgba8 v_getrgba8fake6
-static void v_getrgba15 (unsigned int offset, unsigned char rgba[4])
+static void
+v_getrgba15 (unsigned int offset, unsigned char rgba[4])
{
- word32 c = ((word16 *)vl_current_read_buffer)[offset];
+ word32 c = ((word16 *)vl_current_read_buffer)[offset];
#if HUGE_LOOKUP
- c &= 0x7fff;
- rgba[0] = pix15r[c];
- rgba[1] = pix15g[c];
- rgba[2] = pix15b[c];
+ c &= 0x7fff;
+ rgba[0] = pix15r[c];
+ rgba[1] = pix15g[c];
+ rgba[2] = pix15b[c];
#else
- rgba[0] = _rgb_scale_5[(c >> 10) & 0x1F];
- rgba[1] = _rgb_scale_5[(c >> 5) & 0x1F];
- rgba[2] = _rgb_scale_5[c & 0x1F];
+ rgba[0] = _rgb_scale_5[(c >> 10) & 0x1F];
+ rgba[1] = _rgb_scale_5[(c >> 5) & 0x1F];
+ rgba[2] = _rgb_scale_5[ c & 0x1F];
#endif
- /*rgba[3] = 255;*/ /* dummy alpha; we have separate SW alpha, so ignore */
+ /*rgba[3] = 255;*/ /* dummy alpha; we have separate SW alpha, so ignore */
}
-static void v_getrgba16 (unsigned int offset, unsigned char rgba[4])
+static void
+v_getrgba16 (unsigned int offset, unsigned char rgba[4])
{
- word32 c = ((word16 *)vl_current_read_buffer)[offset];
+ word32 c = ((word16 *)vl_current_read_buffer)[offset];
#if HUGE_LOOKUP
- rgba[0] = pix16r[c];
- rgba[1] = pix16g[c];
- rgba[2] = pix16b[c];
+ rgba[0] = pix16r[c];
+ rgba[1] = pix16g[c];
+ rgba[2] = pix16b[c];
#else
- rgba[0] = _rgb_scale_5[(c >> 11) & 0x1F];
- rgba[1] = _rgb_scale_6[(c >> 5) & 0x3F];
- rgba[2] = _rgb_scale_5[c & 0x1F];
+ rgba[0] = _rgb_scale_5[(c >> 11) & 0x1F];
+ rgba[1] = _rgb_scale_6[(c >> 5) & 0x3F];
+ rgba[2] = _rgb_scale_5[ c & 0x1F];
#endif
- /*rgba[3] = 255;*/ /* dummy alpha; we have separate SW alpha, so ignore */
+ /*rgba[3] = 255;*/ /* dummy alpha; we have separate SW alpha, so ignore */
}
-static void v_getrgba24 (unsigned int offset, unsigned char rgba[4])
+static void
+v_getrgba24 (unsigned int offset, unsigned char rgba[4])
{
- word32 c = *(word32 *)((long)vl_current_read_buffer+offset*3);
- rgba[0] = c >> 16;
- rgba[1] = c >> 8;
- rgba[2] = c;
- /*rgba[3] = 255;*/ /* dummy alpha; we have separate SW alpha, so ignore */
+ word32 c = *(word32 *)((long)vl_current_read_buffer+offset*3);
+ rgba[0] = c >> 16;
+ rgba[1] = c >> 8;
+ rgba[2] = c;
+ /*rgba[3] = 255;*/ /* dummy alpha; we have separate SW alpha, so ignore */
}
-static void v_getrgba32 (unsigned int offset, unsigned char rgba[4])
+static void
+v_getrgba32 (unsigned int offset, unsigned char rgba[4])
{
- word32 c = ((word32 *)vl_current_read_buffer)[offset];
- rgba[0] = c >> 16;
- rgba[1] = c >> 8;
- rgba[2] = c;
- /*rgba[3] = c >> 24;*/ /* dummy alpha; we have separate SW alpha, so ignore */
+ word32 c = ((word32 *)vl_current_read_buffer)[offset];
+ rgba[0] = c >> 16;
+ rgba[1] = c >> 8;
+ rgba[2] = c;
+ /*rgba[3] = c >> 24;*/ /* dummy alpha; we have separate SW alpha, so ignore */
}
-
/* Desc: pixel retrieval
*
* In : pixel offset
*
* Note: uses current read buffer
*/
-static int v_getpixel8 (unsigned int offset)
+static int
+v_getpixel8 (unsigned int offset)
{
- return ((word8 *)vl_current_read_buffer)[offset];
+ return ((word8 *)vl_current_read_buffer)[offset];
}
#define v_getpixel15 v_getpixel16
-static int v_getpixel16 (unsigned int offset)
+static int
+v_getpixel16 (unsigned int offset)
{
- return ((word16 *)vl_current_read_buffer)[offset];
+ return ((word16 *)vl_current_read_buffer)[offset];
}
-static int v_getpixel24 (unsigned int offset)
+static int
+v_getpixel24 (unsigned int offset)
{
- return *(word32 *)((long)vl_current_read_buffer+offset*3);
+ return *(word32 *)((long)vl_current_read_buffer+offset*3);
}
-static int v_getpixel32 (unsigned int offset)
+static int
+v_getpixel32 (unsigned int offset)
{
- return ((word32 *)vl_current_read_buffer)[offset];
+ return ((word32 *)vl_current_read_buffer)[offset];
}
-
/* Desc: set one palette entry
*
* In : index, R, G, B
*
* Note: color components are in range [0.0 .. 1.0]
*/
-void vl_setCI (int index, float red, float green, float blue)
+void
+vl_setCI (int index, float red, float green, float blue)
{
- drv->setCI_f(index, red, green, blue);
+ drv->setCI_f(index, red, green, blue);
}
-
/* Desc: set one palette entry
*
* In : color, R, G, B
*
* Note: -
*/
-static void fake_setcolor (int c, int r, int g, int b)
+static void
+fake_setcolor (int c, int r, int g, int b)
{
- VGAPalette[c] = 0xff000000 | (r<<16) | (g<<8) | b;
+ VGAPalette[c] = 0xff000000 | (r<<16) | (g<<8) | b;
- drv->setCI_i(c, r, g, b);
+ drv->setCI_i(c, r, g, b);
}
-
/* Desc: build FakeColor palette
*
* In : CI precision in bits
*
* Note: -
*/
-static void fake_buildpalette (int bits)
+static void
+fake_buildpalette (int bits)
{
- double c_r, c_g, c_b;
- int r, g, b, color = 0;
-
- double max = (1 << bits) - 1;
-
- for (b=0; b<B_CNT; ++b) {
- for (g=0; g<G_CNT; ++g) {
- for (r=0; r<R_CNT; ++r) {
- c_r = 0.5 + (double)r*(max-R_BIAS)/(R_CNT-1.) + R_BIAS;
- c_g = 0.5 + (double)g*(max-G_BIAS)/(G_CNT-1.) + G_BIAS;
- c_b = 0.5 + (double)b*(max-B_BIAS)/(B_CNT-1.) + B_BIAS;
- fake_setcolor(color++, (int)c_r, (int)c_g, (int)c_b);
+ double c_r, c_g, c_b;
+ int r, g, b, color = 0;
+
+ double max = (1 << bits) - 1;
+
+ for (b = 0; b < B_CNT; ++b) {
+ for (g = 0; g < G_CNT; ++g) {
+ for (r = 0; r < R_CNT; ++r) {
+ c_r = 0.5 + (double)r * (max-R_BIAS) / (R_CNT-1.) + R_BIAS;
+ c_g = 0.5 + (double)g * (max-G_BIAS) / (G_CNT-1.) + G_BIAS;
+ c_b = 0.5 + (double)b * (max-B_BIAS) / (B_CNT-1.) + B_BIAS;
+ fake_setcolor(color++, (int)c_r, (int)c_g, (int)c_b);
}
- }
- }
-
- for (color=0; color<256; color++) {
- c_r = (double)color*R_CNT/256.;
- c_g = (double)color*G_CNT/256.;
- c_b = (double)color*B_CNT/256.;
- array_r[color] = (int)c_r;
- array_g[color] = (int)c_g;
- array_b[color] = (int)c_b;
- }
+ }
+ }
+
+ for (color = 0; color < 256; color++) {
+ c_r = (double)color * R_CNT / 256.;
+ c_g = (double)color * G_CNT / 256.;
+ c_b = (double)color * B_CNT / 256.;
+ array_r[color] = (int)c_r;
+ array_g[color] = (int)c_g;
+ array_b[color] = (int)c_b;
+ }
}
-
#if HUGE_LOOKUP
/* Desc: initialize lookup arrays
*
*
* Note: -
*/
-void v_init_pixeltables (void)
+void
+v_init_pixeltables (void)
{
- unsigned int pixel;
-
- for (pixel = 0; pixel <= 0xffff; pixel++) {
- unsigned int r, g, b;
-
- if (pixel <= 0x7fff) {
- /* 15bit */
- r = (pixel & 0x7c00) >> 8;
- g = (pixel & 0x03E0) >> 3;
- b = (pixel & 0x001F) << 2;
-
- r = (unsigned int)(((double)r * 255. / 0x7c) + 0.5);
- g = (unsigned int)(((double)g * 255. / 0x7c) + 0.5);
- b = (unsigned int)(((double)b * 255. / 0x7c) + 0.5);
-
- pix15r[pixel] = r;
- pix15g[pixel] = g;
- pix15b[pixel] = b;
- }
-
- /* 16bit */
- r = (pixel & 0xF800) >> 8;
- g = (pixel & 0x07E0) >> 3;
- b = (pixel & 0x001F) << 3;
-
- r = (unsigned int)(((double)r * 255. / 0xF8) + 0.5);
- g = (unsigned int)(((double)g * 255. / 0xFC) + 0.5);
- b = (unsigned int)(((double)b * 255. / 0xF8) + 0.5);
-
- pix16r[pixel] = r;
- pix16g[pixel] = g;
- pix16b[pixel] = b;
- }
+ unsigned int pixel;
+
+ for (pixel = 0; pixel <= 0xffff; pixel++) {
+ unsigned int r, g, b;
+
+ if (pixel <= 0x7fff) {
+ /* 15bit */
+ r = (pixel & 0x7c00) >> 8;
+ g = (pixel & 0x03E0) >> 3;
+ b = (pixel & 0x001F) << 2;
+
+ r = (unsigned int)(((double)r * 255. / 0x7c) + 0.5);
+ g = (unsigned int)(((double)g * 255. / 0x7c) + 0.5);
+ b = (unsigned int)(((double)b * 255. / 0x7c) + 0.5);
+
+ pix15r[pixel] = r;
+ pix15g[pixel] = g;
+ pix15b[pixel] = b;
+ }
+
+ /* 16bit */
+ r = (pixel & 0xF800) >> 8;
+ g = (pixel & 0x07E0) >> 3;
+ b = (pixel & 0x001F) << 3;
+
+ r = (unsigned int)(((double)r * 255. / 0xF8) + 0.5);
+ g = (unsigned int)(((double)g * 255. / 0xFC) + 0.5);
+ b = (unsigned int)(((double)b * 255. / 0xF8) + 0.5);
+
+ pix16r[pixel] = r;
+ pix16g[pixel] = g;
+ pix16b[pixel] = b;
+ }
}
#endif
-
/* Desc: initialize hardware
*
* In : -
*
* Note: when returning non-NULL, global variable `drv' is guaranteed to be ok
*/
-static vl_mode *v_init_hw (void)
+static vl_mode *
+v_init_hw (void)
{
- static vl_mode *q = NULL;
-
- if (q == NULL) {
- /* are we forced to NUL driver? */
- if (getenv("DMESA_NULDRV")) {
- if ((q = NUL.init()) != NULL) {
- drv = &NUL;
- }
- return q;
- }
- /* initialize hardware */
- if ((q = VESA.init()) != NULL) {
- drv = &VESA;
- } else if ((q = VGA.init()) != NULL) {
- drv = &VGA;
- } else {
- drv = NULL;
- }
- }
-
- return q;
-}
+ static vl_mode *q = NULL;
+ if (q == NULL) {
+ /* are we forced to NUL driver? */
+ if (getenv("DMESA_NULDRV")) {
+ if ((q = NUL.init()) != NULL) {
+ drv = &NUL;
+ }
+ return q;
+ }
+ /* initialize hardware */
+ if ((q = VESA.init()) != NULL) {
+ drv = &VESA;
+ } else if ((q = VGA.init()) != NULL) {
+ drv = &VGA;
+ } else {
+ drv = NULL;
+ }
+ }
+
+ return q;
+}
/* Desc: sync buffer with video hardware
*
* Note: -
*/
-int vl_sync_buffer (void **buffer, int x, int y, int width, int height)
+int
+vl_sync_buffer (void **buffer, int x, int y, int width, int height)
{
- if ((width & 7) || (x < 0) || (y < 0) || (x+width > video_mode->xres) || (y+height > video_mode->yres)) {
- return -1;
- } else {
- void *newbuf = *buffer;
-
- if ((newbuf == NULL) || (vl_current_width != width) || (vl_current_height != height)) {
- newbuf = realloc(newbuf, width * height * video_bypp);
- }
-
- if (newbuf == NULL) {
- return -2;
- }
-
- vl_current_width = width;
- vl_current_height = height;
- vl_current_stride = vl_current_width * video_bypp;
- vl_current_bytes = vl_current_stride * height;
-
- vl_current_offset = video_scanlen * y + video_bypp * x;
- vl_current_delta = video_scanlen - vl_current_stride;
-
- vl_current_draw_buffer = vl_current_read_buffer = *buffer = newbuf;
- return 0;
- }
+ if ((width & 7) || (x < 0) || (y < 0) || (x+width > video_mode->xres) || (y+height > video_mode->yres)) {
+ return -1;
+ } else {
+ void *newbuf = *buffer;
+
+ if ((newbuf == NULL) || (vl_current_width != width) || (vl_current_height != height)) {
+ newbuf = realloc(newbuf, width * height * video_bypp);
+ }
+
+ if (newbuf == NULL) {
+ return -2;
+ }
+
+ vl_current_width = width;
+ vl_current_height = height;
+ vl_current_stride = vl_current_width * video_bypp;
+ vl_current_bytes = vl_current_stride * height;
+
+ vl_current_offset = video_scanlen * y + video_bypp * x;
+ vl_current_delta = video_scanlen - vl_current_stride;
+
+ vl_current_draw_buffer = vl_current_read_buffer = *buffer = newbuf;
+ return 0;
+ }
}
-
/* Desc: state retrieval
*
* In : name, storage
*
* Note: -
*/
-int vl_get (int pname, int *params)
+int
+vl_get (int pname, int *params)
{
- switch (pname) {
- case VL_GET_SCREEN_SIZE:
- params[0] = video_mode->xres;
- params[1] = video_mode->yres;
- break;
- case VL_GET_VIDEO_MODES:
- {
- int n;
- vl_mode *q;
- if ((q = v_init_hw()) == NULL) {
- return -1;
- }
- /* count available visuals */
- for (n = 0; q->mode != 0xffff; q++) {
- if ((q + 1)->mode == (q->mode | 0x4000)) {
- /* same mode, but linear */
- q++;
- }
- if (params) {
- params[n] = (int)q;
- }
- n++;
- }
- return n;
- }
- default:
- return (drv != NULL) ? drv->get(pname, params) : -1;
- }
- return 0;
+ switch (pname) {
+ case VL_GET_SCREEN_SIZE:
+ params[0] = video_mode->xres;
+ params[1] = video_mode->yres;
+ break;
+ case VL_GET_VIDEO_MODES: {
+ int n;
+ vl_mode *q;
+ if ((q = v_init_hw()) == NULL) {
+ return -1;
+ }
+ /* count available visuals */
+ for (n = 0; q->mode != 0xffff; q++) {
+ if ((q + 1)->mode == (q->mode | 0x4000)) {
+ /* same mode, but linear */
+ q++;
+ }
+ if (params) {
+ params[n] = (int)q;
+ }
+ n++;
+ }
+ return n;
+ }
+ default:
+ return (drv != NULL) ? drv->get(pname, params) : -1;
+ }
+ return 0;
}
-
/* Desc: setup mode
*
* In : ptr to mode definition
*
* Note: -
*/
-static int vl_setup_mode (vl_mode *p)
+static int
+vl_setup_mode (vl_mode *p)
{
- if (p == NULL) {
- return -1;
- }
+ if (p == NULL) {
+ return -1;
+ }
#define INITPTR(bpp) \
- vl_putpixel = v_putpixel##bpp; \
- vl_getrgba = v_getrgba##bpp; \
- vl_getpixel = v_getpixel##bpp; \
- vl_rect = v_rect##bpp; \
- vl_mixfix = vl_mixfix##bpp; \
- vl_mixrgb = vl_mixrgb##bpp; \
- vl_mixrgba = vl_mixrgba##bpp; \
- vl_clear = _can_mmx() ? v_clear##bpp##_mmx : v_clear##bpp
+ vl_putpixel = v_putpixel##bpp; \
+ vl_getrgba = v_getrgba##bpp; \
+ vl_getpixel = v_getpixel##bpp; \
+ vl_rect = v_rect##bpp; \
+ vl_mixfix = vl_mixfix##bpp; \
+ vl_mixrgb = vl_mixrgb##bpp; \
+ vl_mixrgba = vl_mixrgba##bpp; \
+ vl_clear = _can_mmx() ? v_clear##bpp##_mmx : v_clear##bpp
- switch (p->bpp) {
- case 8:
- INITPTR(8);
- break;
- case 15:
- INITPTR(15);
- break;
- case 16:
- INITPTR(16);
- break;
- case 24:
- INITPTR(24);
- break;
- case 32:
- INITPTR(32);
- break;
- default:
- return -1;
- }
+ switch (p->bpp) {
+ case 8:
+ INITPTR(8);
+ break;
+ case 15:
+ INITPTR(15);
+ break;
+ case 16:
+ INITPTR(16);
+ break;
+ case 24:
+ INITPTR(24);
+ break;
+ case 32:
+ INITPTR(32);
+ break;
+ default:
+ return -1;
+ }
#undef INITPTR
- video_mode = p;
- video_bypp = (p->bpp+7)/8;
- video_scanlen = p->scanlen;
- vl_video_selector = p->sel;
+ video_mode = p;
+ video_bypp = (p->bpp+7)/8;
+ video_scanlen = p->scanlen;
+ vl_video_selector = p->sel;
- return 0;
+ return 0;
}
-
/* Desc: restore to the mode prior to first call to `vl_video_init'.
*
* In : -
*
* Note: -
*/
-void vl_video_exit (void)
+void
+vl_video_exit (void)
{
- drv->restore();
- drv->fini();
- video_mode = NULL;
+ drv->restore();
+ drv->fini();
+ video_mode = NULL;
}
-
/* Desc: enter mode
*
* In : xres, yres, bits/pixel, RGB, refresh rate
*
* Note: -
*/
-int vl_video_init (int width, int height, int bpp, int rgb, int refresh)
+int
+vl_video_init (int width, int height, int bpp, int rgb, int refresh)
{
- int fake;
- vl_mode *p, *q;
- unsigned int min;
-
- fake = 0;
- if (!rgb) {
- bpp = 8;
- } else if (bpp == 8) {
- fake = 1;
- }
+ int fake;
+ vl_mode *p, *q;
+ unsigned int min;
+
+ fake = 0;
+ if (!rgb) {
+ bpp = 8;
+ } else if (bpp == 8) {
+ fake = 1;
+ }
#if HUGE_LOOKUP
- else if (bpp < 24) {
- v_init_pixeltables();
- }
+ else if (bpp < 24) {
+ v_init_pixeltables();
+ }
#endif
- /* initialize hardware */
- if ((q = v_init_hw()) == NULL) {
- return 0;
- }
-
- /* search for a mode that fits our request */
- for (min=-1, p=NULL; q->mode!=0xffff; q++) {
- if ((q->xres>=width) && (q->yres>=height) && (q->bpp==bpp)) {
- if (min>=(unsigned)(q->xres*q->yres)) {
- min = q->xres*q->yres;
- p = q;
- }
- }
- }
-
- /* setup and enter mode */
- if ((vl_setup_mode(p) == 0) && (drv->entermode(p, refresh) == 0)) {
- vl_flip = drv->blit;
- if (fake) {
- drv->get(VL_GET_CI_PREC, (int *)(&min));
- fake_buildpalette(min);
- if (min == 8) {
- vl_getrgba = v_getrgba8fake8;
- }
- }
- return bpp;
- }
-
- /* abort */
- return 0;
+ /* initialize hardware */
+ if ((q = v_init_hw()) == NULL) {
+ return 0;
+ }
+
+ /* search for a mode that fits our request */
+ for (min = -1, p = NULL; q->mode != 0xffff; q++) {
+ if ((q->xres >= width) && (q->yres >= height) && (q->bpp == bpp)) {
+ if (min >= (unsigned)(q->xres * q->yres)) {
+ min = q->xres * q->yres;
+ p = q;
+ }
+ }
+ }
+
+ /* setup and enter mode */
+ if ((vl_setup_mode(p) == 0) && (drv->entermode(p, refresh) == 0)) {
+ vl_flip = drv->blit;
+ if (fake) {
+ drv->get(VL_GET_CI_PREC, (int *)(&min));
+ fake_buildpalette(min);
+ if (min == 8) {
+ vl_getrgba = v_getrgba8fake8;
+ }
+ }
+ return bpp;
+ }
+
+ /* abort */
+ return 0;
}