Subversion Repositories Kolibri OS

Rev

Rev 6115 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5371 serge 1
#include 
2
#include 
3
#include 
4
#include 
5
 
6
#include "pixlib3.h"
7
#include "pixdriver.h"
8
 
9
#define DISPLAY_VERSION         0x0200  /*      2.00     */
10
 
11
#define SRV_GETVERSION              0
12
#define SRV_GET_CAPS                3
13
 
14
 
15
#define BUFFER_SIZE(n) ((n)*sizeof(uint32_t))
16
#define __ALIGN_MASK(x,mask)  (((x)+(mask))&~(mask))
17
#define ALIGN(x,a)            __ALIGN_MASK(x,(typeof(x))(a)-1)
18
 
19
struct bitmap
20
{
21
    uint32_t    width;
22
    uint32_t    height;
23
    uint32_t    pitch;
24
    void       *buffer;
25
    uint32_t    size;
26
};
27
 
28
static uint32_t fd;
29
static struct pix_driver *driver;
30
 
31
 
32
static bitmap_t *sw_create_bitmap(uint32_t width, uint32_t height)
33
{
34
    bitmap_t *bitmap;
35
 
36
    bitmap = malloc(sizeof(bitmap_t));
37
    if(bitmap == NULL)
38
        goto err_0;
39
 
40
    bitmap->width  = width;
41
    bitmap->height = height;
42
 
43
    bitmap->pitch = ALIGN(width * 4, 16);
44
    bitmap->size = ALIGN(bitmap->pitch * height, 4096);
45
 
46
    bitmap->buffer = user_alloc(bitmap->size);
47
    if (bitmap->buffer == NULL)
48
        goto err_1;
49
 
50
    return bitmap;
51
 
52
err_1:
53
    free(bitmap);
54
err_0:
55
    return NULL;
56
};
57
 
58
static int sw_destroy_bitmap(bitmap_t * bitmap)
59
{
60
    user_free(bitmap->buffer);
61
    free(bitmap);
62
    return 0;
63
};
64
 
65
static void *sw_lock_bitmap(bitmap_t *bitmap, uint32_t *pitch)
66
{
67
    *pitch = bitmap->pitch;
68
 
69
    return bitmap->buffer;
70
};
71
 
72
static int sw_resize_bitmap(bitmap_t * bitmap, uint32_t width, uint32_t height)
73
{
74
    uint32_t size;
75
    uint32_t pitch;
76
 
77
    pitch = ALIGN(width * 4, 16);
78
    size = ALIGN(pitch * height, 4096);
79
 
80
    if (size > bitmap->size)
81
    {
82
        bitmap->buffer = user_realloc(bitmap->buffer, size);    /* grow buffer */
83
        if (bitmap->buffer == NULL)
84
            return -1;
85
 
86
        bitmap->size = size;
87
    }
88
    else if (size < bitmap->size)
89
        user_unmap(bitmap->buffer, size, bitmap->size - size); /* unmap unused pages */
90
 
91
    bitmap->width  = width;
92
    bitmap->height = height;
93
    bitmap->pitch  = pitch;
94
 
95
    return 0;
96
};
97
 
98
static int sw_blit(bitmap_t * bitmap, int dst_x, int dst_y,
99
                   uint32_t w, uint32_t h, int src_x, int src_y)
100
{
101
    struct blit_call bc;
102
    int ret;
103
 
104
    bc.dstx     = dst_x;
105
    bc.dsty     = dst_y;
106
    bc.w        = w;
107
    bc.h        = h;
108
    bc.srcx     = src_x;
109
    bc.srcy     = src_y;
110
    bc.srcw     = bitmap->width;
111
    bc.srch     = bitmap->height;
112
    bc.stride   = bitmap->pitch;
113
    bc.bitmap   = bitmap->buffer;
114
 
115
    __asm__ __volatile__(
116
    "int $0x40":"=a"(ret):"a"(73), "b"(0x00),
117
    "c"(&bc):"memory");
118
 
119
    return ret;
120
};
121
 
122
static int sw_create_client(int x, int y, uint32_t width, uint32_t height)
123
{
124
    return 0;
125
};
126
 
127
static int sw_resize_client(int x, int y, uint32_t width, uint32_t height)
128
{
129
    return 0;
130
};
131
 
132
bitmap_t *pxCreateBitmap(uint32_t width, uint32_t height)
133
{
134
    return driver->create_bitmap(width, height);
135
};
136
 
137
int pxDestroyBitmap(bitmap_t *bitmap)
138
{
139
    return driver->destroy_bitmap(bitmap);
140
};
141
 
142
void *pxLockBitmap(bitmap_t *bitmap, uint32_t *pitch)
143
{
144
    return driver->lock_bitmap(bitmap, pitch);
145
};
146
 
147
int pxResizeBitmap(bitmap_t *bitmap, uint32_t width, uint32_t height)
148
{
149
    return driver->resize_bitmap(bitmap, width, height);
150
};
151
 
152
int pxBlitBitmap(bitmap_t *bitmap, int dst_x, int dst_y,
153
                uint32_t w, uint32_t h, int src_x, int src_y)
154
{
155
    return driver->blit_bitmap(bitmap, dst_x, dst_y,
156
                               w, h, src_x, src_y);
157
};
158
 
159
int pxCreateClient(int x, int y, uint32_t width, uint32_t height)
160
{
161
    return driver->create_client(x, y, width, height);
162
}
163
 
164
int pxResizeClient(int x, int y, uint32_t width, uint32_t height)
165
{
166
    return driver->resize_client(x, y, width, height);
167
}
168
 
169
static struct pix_driver sw_driver =
170
{
171
    0,
172
    sw_create_bitmap,
173
    sw_destroy_bitmap,
174
    sw_lock_bitmap,
175
    sw_resize_bitmap,
176
    sw_blit,
177
    sw_create_client,
178
    sw_resize_client,
6115 serge 179
    NULL,
6137 serge 180
    NULL,
5371 serge 181
    NULL
182
};
183
 
184
 
185
uint32_t pxInit(int hw)
186
{
187
    void *lib;
188
    struct pix_driver *(*drventry)(uint32_t service);
189
 
190
    uint32_t api_version;
191
    ioctl_t io;
192
 
6137 serge 193
    if(driver != NULL)
194
        return driver->driver_caps;
195
 
5371 serge 196
    driver = &sw_driver;
197
 
198
    if(hw == 0)
199
        return 0;
200
 
201
    if (fd != 0)
202
        return driver->driver_caps;
203
 
204
    fd = get_service("DISPLAY");
205
    if (fd == 0)
206
        goto fail;
207
 
208
    io.handle = fd;
209
    io.io_code = SRV_GETVERSION;
210
    io.input = NULL;
211
    io.inp_size = 0;
212
    io.output = &api_version;
213
    io.out_size = BUFFER_SIZE(1);
214
 
215
    if (call_service(&io) != 0)
216
        goto fail;
217
 
218
    if ((DISPLAY_VERSION > (api_version & 0xFFFF)) ||
219
        (DISPLAY_VERSION < (api_version >> 16)))
220
        goto fail;
221
 
222
    lib = load_library("pixlib-gl.dll");
223
    if(lib == 0)
224
        goto fail;
225
 
226
    drventry = get_proc_address(lib, "DrvInit");
227
 
228
    if( drventry == NULL)
229
        goto fail;
230
 
231
    driver = drventry(fd);
232
    if(driver == NULL)
233
    {
234
        driver = &sw_driver;
235
        goto fail;
236
    };
237
 
238
    if (driver->driver_caps)
239
        printf("2D caps %s%s%s\n",
240
               (driver->driver_caps & HW_BIT_BLIT) != 0 ? "HW_BIT_BLIT " : "",
241
               (driver->driver_caps & HW_TEX_BLIT) != 0 ? "HW_TEX_BLIT " : "",
242
               (driver->driver_caps & HW_VID_BLIT) != 0 ? "HW_VID_BLIT " : "");
243
 
244
    return driver->driver_caps;
245
 
246
fail:
247
    printf("Warning! Hardware initialization failed.\n"
248
           "fallback to software rendering.\n");
249
    fd = 0;
250
    return 0;
251
};
252
 
253
void pxFini()
254
{
255
    if (driver->fini)
256
        driver->fini();
257
};
258
 
259
 
6115 serge 260
planar_t* pxCreatePlanar(int name, int format,
261
                         uint32_t width, uint32_t height,
262
                         uint32_t offset0, uint32_t pitch0,
263
                         uint32_t offset1, uint32_t pitch1,
264
                         uint32_t offset2, uint32_t pitch2)
265
{
266
    if(driver->create_planar)
267
        return driver->create_planar(name, format, width, height,
268
                                     offset0, pitch0, offset1, pitch1,
269
                                     offset2, pitch2);
270
    else
271
        return NULL;
272
}
5371 serge 273
 
274
 
6137 serge 275
int pxBlitPlanar(planar_t *planar, int dst_x, int dst_y,
276
                 uint32_t w, uint32_t h, int src_x, int src_y)
277
{
278
    if(driver->blit_planar)
279
        return driver->blit_planar(planar, dst_x, dst_y,
280
                                   w, h, src_x, src_y);
281
    else
282
        return 0;
283
};
5371 serge 284