Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Слинковать содержимое файла в строку, вкомпилировать glsl код 
:(
    Опции темы
dershokus
Дата 30.7.2014, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 7.8.2011

Репутация: нет
Всего: 1



 Здравствуйте.
Хочу вкопилить исходник glsl шейдеров в программу, для дальнейшей компиляции в рантайме. Есть ли такая возможность в gcc? 
PM MAIL   Вверх
leniviy
Дата 30.7.2014, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Если исходник не очень большой - чтобы уместился в строковой переменной, можно через внешнюю тулу сгенерить C код. Я когда-то писал такую.
chardump.c:

Код

#ifdef HAVE_TCHAR_H
#include <tchar.h>
#else
typedef char _TCHAR;
#define _tmain main
#define _T
#define _tfopen fopen
#define _ftprintf fprintf
#endif

#include <io.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

#define MAXLEN 80

static int convert_char(char buf[10], int c, int col) {
    char *p = buf;
    switch(c) {
    case '\n': c = 'n';
               col = MAXLEN;
               break;
    /*case '\t': c = 't'; break;*/
    case '\t': goto noescape;

    case '\a': c = 'a'; break;
    case '\b': c = 'b'; break;
    case '\f': c = 'f'; break;
    case '\r': c = 'r'; break;
    case '\v': c = 'v'; break;
    case '\"':
    case '\\':          break;
    default:
        if ((unsigned char)c < 32) {
            p += sprintf(p, "\\%03o", (unsigned char)c);
            goto checklen;
        }
        goto noescape;
    }
    *p++ = '\\';
noescape:
    *p++ = c;
checklen:
    col += (int)(p - buf);
    if ( col >= MAXLEN)
    {
        strcpy(p, "\"\n\"");
        return 0;
    }
    *p = '\0';
    return col;
}

static void convert(FILE *fin, FILE *fout) {
    char buf[10];
    int col, c;
    fputc('\"', fout);
    for(col = 0;;) {
        c = fgetc(fin);
        if (c == EOF) {
            if (feof(fin))
                break;
            if (errno != EINTR) {
                perror("read error");
                break;
            }
            continue;
        }
        col = convert_char(buf, c, col);
        fputs(buf, fout);
    }
    fputc('\"', fout);
}

char outbuf[BUFSIZ];

int _tmain(int argc, _TCHAR* argv[])
{
    int i;
    setbuf( stdout, outbuf );

    if (argc < 2) {
        if (-1 == setmode(0, O_BINARY)) {
            perror("failed to reopen stdin in binary mode");
            return 1;
        }
        convert(stdin, stdout);
    }
    for (i = 1; i < argc; i++) {
        FILE *f = _tfopen(argv[i], _T("rb"));
        if (!f) {
            _ftprintf(stderr, _T("failed to open '%s': "), argv[i]);
            perror(NULL);
            return 1;
        }
        convert(f, stdout);
        fclose(f);
    }
    fflush(stdout);
    return 0;
}


Подаешь ей в stdin бинарные данные, а на выходе C строка в кавычках

Это сообщение отредактировал(а) leniviy - 30.7.2014, 17:35
PM MAIL   Вверх
dershokus
Дата 30.7.2014, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 7.8.2011

Репутация: нет
Всего: 1



Конечно это действенно, но нет ли какой-нить штатной возможности? Без сторонних программ...
Я пишу на ndk android, может быть что-то специфичное для него?
PM MAIL   Вверх
leniviy
Дата 30.7.2014, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



В ndk есть *objcopy.exe . Можно попробовать ей
Код

arm-linux-androideabi-objcopy.exe -I binary -O elf32-little in.txt out.o


Правда не знаю, как потом размер данных узнать

Это сообщение отредактировал(а) leniviy - 30.7.2014, 18:16
PM MAIL   Вверх
dershokus
Дата 31.7.2014, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 7.8.2011

Репутация: нет
Всего: 1



leniviy, большое спасибо. Попробую - отпишусь smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | GNU toolchain | Следующая тема »


 




[ Время генерации скрипта: 0.1243 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.