Skip to content

Commit c73fda9

Browse files
author
powertomato
committed
added scale2x shader and testcase
1 parent 0295be9 commit c73fda9

12 files changed

+511
-16
lines changed

linux.mk

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ TEST_CASES=color_mode \
66
context_switch \
77
all_the_shaders \
88
vertex_buffer \
9-
normal_map
9+
normal_map \
10+
scale2x
1011

1112
GCC=gcc
1213
GPP=g++

src/d3d/SDL_D3D_shader.c

+13-7
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ void SDL_D3D_getVertex( SDL_Vertex* vertices, unsigned num,
7070
if( g ) (*g) = (uint8_t) ((color & 0x0000FF00)>> 8);
7171
if( b ) (*b) = (uint8_t) (color & 0x000000FF);
7272

73-
if( x ) (*x) = (vbuff[num].x );
74-
if( y ) (*y) = (vbuff[num].y );
75-
if( z ) (*z) = (vbuff[num].z );
73+
if( x ) (*x) = (vbuff[num].x - 0.5);
74+
if( y ) (*y) = (vbuff[num].y - 0.5);
75+
if( z ) (*z) = (vbuff[num].z - 0.5);
7676

7777
if( tex_s ) (*tex_s) = (vbuff[num].u );
7878
if( tex_t ) (*tex_t) = (vbuff[num].v );
@@ -93,9 +93,9 @@ void SDL_D3D_setVertexPosition(SDL_Vertex* vertices, unsigned from,
9393
SDL_D3D_Vertex_t* vbuff = (SDL_D3D_Vertex_t*) vertices->vertexBuffer;
9494
unsigned i;
9595
for ( i=from; i<from+num; i++ ) {
96-
vbuff[i].x = x;
97-
vbuff[i].y = y;
98-
vbuff[i].z = z;
96+
vbuff[i].x = x+0.5;
97+
vbuff[i].y = y+0.5;
98+
vbuff[i].z = z+0.5;
9999
}
100100
}
101101
void SDL_D3D_setVertexTexCoord(SDL_Vertex* vertices, unsigned from,
@@ -230,11 +230,17 @@ SDL_Shader* SDL_D3D_createShader( SDL_Renderer* renderer,
230230
shader->createVertexBuffer = SDL_D3D_createVertexBuffer;
231231
shader->destroyVertexBuffer = SDL_D3D_destroyVertexBuffer;
232232

233+
shader_data->pixl_shader = NULL;
234+
shader_data->vert_shader = NULL;
235+
shader_data->pixl_symtable = NULL;
236+
shader_data->vert_symtable = NULL;
237+
233238
HRESULT result;
234239

235240
LPD3DXBUFFER code,error;
236241
char shader_version[8] = "vs_x_x";
237242

243+
238244
char* buff = SDL_Shader_readRW( shdstream->vshader );
239245
if( !buff ){
240246
SDL_OutOfMemory();
@@ -259,12 +265,12 @@ SDL_Shader* SDL_D3D_createShader( SDL_Renderer* renderer,
259265
SDL_SetError("SDL_Shader: D3D CreateVertexShader() failed, errno %d\n", result);
260266
return NULL;
261267
}
262-
263268
shader_version[0] = 'p';
264269
shader_version[3] = '0'+ps_version_major;
265270
shader_version[5] = '0'+ps_version_minor;
266271
result = D3DXCompileShader(buff, strlen(buff), NULL, NULL, "PixelShaderMain",
267272
shader_version, 0, &code, &error, &(shader_data->pixl_symtable));
273+
printf("result %d\n", result);
268274
if ( FAILED(result)){
269275
shader->destroyShader(shader);
270276
SDL_SetError("SDL_Shader: D3D CompilelShader() failed: \n--\n%s--\n", ID3DXBuffer_GetBufferPointer( error ));

src/opengl/SDL_GL_shader.c

+12-3
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ typedef struct {
7676

7777
SDL_Uniform* vport;
7878
SDL_Uniform* color_mode;
79+
Uint32 is_target;
7980
} SDL_GL_ShaderData;
8081

8182
typedef struct {
@@ -274,6 +275,7 @@ static void SDL_GL_updateViewport( SDL_Shader* shader ) {
274275
projection[0][1] = 0.0f;
275276
projection[0][2] = 0.0f;
276277
projection[0][3] = 0.0f;
278+
277279
projection[1][0] = 0.0f;
278280
if (renderer->target) {
279281
projection[1][1] = 2.0f / h;
@@ -282,10 +284,12 @@ static void SDL_GL_updateViewport( SDL_Shader* shader ) {
282284
}
283285
projection[1][2] = 0.0f;
284286
projection[1][3] = 0.0f;
287+
285288
projection[2][0] = 0.0f;
286289
projection[2][1] = 0.0f;
287290
projection[2][2] = 0.0f;
288291
projection[2][3] = 0.0f;
292+
289293
projection[3][0] = -1.0f;
290294
if (renderer->target) {
291295
projection[3][1] = -1.0f;
@@ -374,6 +378,7 @@ SDL_Shader* SDL_GL_createShader( SDL_Renderer* renderer,
374378

375379
v = glCreateShader( GL_VERTEX_SHADER );
376380
f = glCreateShader( GL_FRAGMENT_SHADER );
381+
shader_data->is_target = renderer->target != NULL;
377382
shader_data->vport = NULL;
378383
shader_data->color_mode = NULL;
379384

@@ -525,15 +530,20 @@ int SDL_GL_renderCopyShd(SDL_Shader* shader, SDL_Texture** textures,
525530
&tex_s, &tex_t);
526531
vertices->setVertexTexCoord( vertices, i, 1,
527532
tex_s * texturedata->texw, tex_t * texturedata->texh );
528-
529533
}
530534

531-
532535
data = (GL_RenderData *) shader->renderer->driverdata;
533536
shader_data = (SDL_GL_ShaderData *) shader->driver_data;
534537

535538
SDL_GL_MakeCurrent(shader->renderer->window, data->context);
536539

540+
shader->bindShader(shader);
541+
if ( (shader->renderer->target == NULL && shader_data->is_target) ||
542+
(shader->renderer->target != NULL && !shader_data->is_target) ) {
543+
SDL_GL_updateViewport(shader);
544+
shader_data->is_target = shader->renderer->target != NULL;
545+
}
546+
537547
for ( i=num_of_tex; i<8; i++ ) {
538548
glActiveTextureARB( GL_TEXTURE0_ARB + i );
539549
glDisable(GL_TEXTURE_2D);
@@ -545,7 +555,6 @@ int SDL_GL_renderCopyShd(SDL_Shader* shader, SDL_Texture** textures,
545555
}
546556
glActiveTextureARB( GL_TEXTURE0_ARB );
547557

548-
shader->bindShader(shader);
549558
/* invalidate SDLs intern shader */
550559
data->current.shader = SHADER_NONE;
551560

src/opengles2/SDL_GLES2_shader.c

+17-4
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ typedef struct {
3535

3636
SDL_Uniform* vport;
3737
SDL_Uniform* color_mode;
38+
Uint32 is_target;
3839
} SDL_GLES2_ShaderData;
3940
extern char* SDL_Shader_readRW( SDL_RWops* rwop );
4041

@@ -301,6 +302,7 @@ SDL_Shader* SDL_GLES2_createShader( SDL_Renderer* renderer,
301302
shader_data->p = 0;
302303
v = glCreateShader( GL_VERTEX_SHADER );
303304
f = glCreateShader( GL_FRAGMENT_SHADER );
305+
shader_data->is_target = renderer->target != NULL;
304306
shader_data->vport = NULL;
305307
shader_data->color_mode = NULL;
306308

@@ -438,6 +440,13 @@ int SDL_GLES2_renderCopyShd(SDL_Shader* shader, SDL_Texture** textures,
438440

439441
SDL_GL_MakeCurrent(shader->renderer->window, data->context);
440442

443+
shader->bindShader(shader);
444+
if ( (shader->renderer->target == NULL && shader_data->is_target) ||
445+
(shader->renderer->target != NULL && !shader_data->is_target) ) {
446+
SDL_GLES2_updateViewport(shader);
447+
shader_data->is_target = shader->renderer->target != NULL;
448+
}
449+
441450
for ( i=num_of_tex; i<8; i++ ) {
442451
data->glActiveTexture( GL_TEXTURE0 + i );
443452
glDisable(GL_TEXTURE_2D);
@@ -449,10 +458,14 @@ int SDL_GLES2_renderCopyShd(SDL_Shader* shader, SDL_Texture** textures,
449458
glEnable(GL_TEXTURE_2D);
450459
}
451460

452-
shader->bindShader(shader);
453-
454-
if ( shader_data->color_mode ) {
455-
SDL_GLES2_setUniform_i( shader_data->color_mode, textures[0]->format);
461+
if ( shader_data->is_target ) {
462+
if ( shader_data->color_mode ) {
463+
SDL_GLES2_setUniform_i( shader_data->color_mode, shader->renderer->target->format);
464+
}
465+
} else {
466+
if ( shader_data->color_mode ) {
467+
SDL_GLES2_setUniform_i( shader_data->color_mode, textures[0]->format);
468+
}
456469
}
457470

458471
if (textures[0]->blendMode != data->current.blendMode) {

test/pixel_art.png

48.8 KB
Loading

test/scale2x/main.c

+191
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
2+
#include <stdlib.h>
3+
#include <stdio.h>
4+
#include <SDL2/SDL.h>
5+
#include <SDL2/SDL_test_font.h>
6+
#include <SDL2/SDL_image.h>
7+
#include "../src/SDL_shader.h"
8+
#include "../src/SDL_SYS_RenderStructs.h"
9+
#include <math.h>
10+
#ifndef M_PI
11+
#define M_PI 3.14159265358979323846
12+
#endif /*M_PI*/
13+
14+
char* scaler_names[] = {
15+
"No scaler",
16+
"scale2x/MAME2x"
17+
};
18+
19+
int mod(int a, int b)
20+
{
21+
int r = a % b;
22+
return r < 0 ? r + b : r;
23+
}
24+
25+
#ifdef _WIN32
26+
//prevents displaying the black console window
27+
//on windows systems
28+
//depending on the toolchain (settings) this is also required
29+
#include <windows.h>
30+
int WINAPI WinMain (HINSTANCE hThisInstance,
31+
HINSTANCE hPrevInstance,
32+
LPSTR lpszArgument,
33+
int nCmdShow)
34+
#else
35+
int main(int argc, char** argv)
36+
#endif
37+
{
38+
#ifdef _WIN32
39+
LPSTR *argv = __argv;
40+
int argc = __argc;
41+
(void) argv;
42+
(void) argc;
43+
#endif
44+
SDL_Window *screen;
45+
SDL_Renderer *renderer;
46+
47+
if ( SDL_Init(SDL_INIT_VIDEO) < 0 ){
48+
fprintf(stderr, "Error: %s \n", SDL_GetError());
49+
return 1;
50+
}
51+
52+
SDL_SetHint( SDL_HINT_RENDER_DRIVER, getenv("RENDER_DRIVER") );
53+
54+
int width = 800;
55+
int height = 600;
56+
screen = SDL_CreateWindow("Caption",
57+
SDL_WINDOWPOS_CENTERED,
58+
SDL_WINDOWPOS_CENTERED,
59+
width, height,
60+
SDL_WINDOW_RESIZABLE);
61+
// SDL_WINDOW_FULLSCREEN_DESKTOP );
62+
if ( screen == NULL ) {
63+
fprintf(stderr, "Error: %s \n", SDL_GetError());
64+
return 2;
65+
}
66+
renderer = SDL_CreateRenderer( screen, -1, SDL_RENDERER_ACCELERATED|SDL_RENDERER_TARGETTEXTURE );
67+
//renderer = SDL_CreateRenderer( screen, -1, SDL_RENDERER_SOFTWARE|SDL_RENDERER_TARGETTEXTURE );
68+
if ( renderer == NULL ) {
69+
fprintf(stderr, "Error: %s \n", SDL_GetError());
70+
return 3;
71+
}
72+
73+
SDL_RenderSetLogicalSize(renderer, width, height);
74+
75+
SDL_SetWindowTitle( screen, renderer->info.name );
76+
77+
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
78+
SDL_RenderClear(renderer);
79+
80+
81+
int val = 3;
82+
SDL_shader_hint( SDL_D3D_PS_MAJOR_VERSION, &val );
83+
val = 0;
84+
SDL_shader_hint( SDL_D3D_VS_MINOR_VERSION, &val );
85+
86+
SDL_Shader* shader = SDL_createShader( renderer, "../shaders/scale2x/scale2x" );
87+
if ( shader == NULL ) {
88+
fprintf( stderr, "Error: %s \n", SDL_GetError() );
89+
}
90+
SDL_assert(shader != NULL);
91+
92+
SDL_Uniform* scaler = SDL_createUniform( shader, "scaler" );
93+
SDL_assert(scaler);
94+
SDL_setUniform_i( scaler, 0 );
95+
96+
SDL_Texture *image;
97+
SDL_Texture *target_ld, *target_hd;
98+
SDL_Surface *srf;
99+
100+
srf = IMG_Load( "../pixel_art.png" );
101+
102+
SDL_PixelFormat* fmt = SDL_AllocFormat( SDL_PIXELFORMAT_ARGB8888 );
103+
SDL_assert(fmt != NULL);
104+
SDL_Surface* srf2 = SDL_ConvertSurface(srf, fmt, 0);
105+
SDL_assert(srf2 != NULL);
106+
107+
if ( !srf ) {
108+
fprintf(stderr, "Error: %s \n", SDL_GetError());
109+
return 5;
110+
}
111+
image = SDL_CreateTextureFromSurface(renderer, srf2 );
112+
113+
SDL_FreeSurface(srf);
114+
SDL_FreeSurface(srf2);
115+
116+
117+
target_ld = SDL_CreateTexture( renderer, SDL_PIXELFORMAT_ARGB8888,
118+
SDL_TEXTUREACCESS_TARGET, 400, 300 );
119+
target_hd = SDL_CreateTexture( renderer, SDL_PIXELFORMAT_ARGB8888,
120+
SDL_TEXTUREACCESS_TARGET, 800, 600 );
121+
122+
SDL_SetRenderTarget( renderer, NULL );
123+
SDL_Event e;
124+
SDL_SetRenderDrawColor(renderer, 0,0,0,255);
125+
int ret = 0;
126+
int quit = 0;
127+
while ( !quit ) {
128+
static int scaler_num=0;
129+
// Step 1:
130+
// Render something to the low-res texture
131+
SDL_SetRenderTarget( renderer, target_ld );
132+
SDL_RenderCopy( renderer, image, NULL, NULL );
133+
SDLTest_DrawString( renderer, 8, 8, scaler_names[scaler_num] );
134+
// Step 2:
135+
// Copy low-res texture to the high-res texture, using scale shader
136+
SDL_SetRenderTarget( renderer, target_hd );
137+
SDL_Rect dst = {0,0,800,600};
138+
ret = SDL_renderCopyShd( shader, target_ld ,NULL,&dst);
139+
//ret = SDL_RenderCopy( renderer, target_ld, NULL, NULL );
140+
if ( ret!=0 ){
141+
fprintf(stderr,"Err: %s\n", SDL_GetError());
142+
}
143+
// Step 3:
144+
// Render something to high-res texture
145+
146+
// Step 4:
147+
// Copy the high-res texture to the screen
148+
SDL_SetRenderTarget( renderer, NULL );
149+
//SDL_renderCopyShd( shader, target_hd, NULL, &dst );
150+
SDL_RenderCopy( renderer, target_hd, NULL, NULL );
151+
152+
while (SDL_PollEvent(&e)){
153+
switch ( e.type ) {
154+
case SDL_QUIT:
155+
quit = 1;
156+
break;
157+
case SDL_KEYDOWN:
158+
switch ( e.key.keysym.sym ) {
159+
case SDLK_SPACE:
160+
scaler_num = mod(scaler_num+1, 2);
161+
SDL_bindShader( shader );
162+
SDL_setUniform_i( scaler, scaler_num );
163+
break;
164+
case SDLK_TAB:
165+
scaler_num = mod(scaler_num-1, 2);
166+
SDL_bindShader( shader );
167+
SDL_setUniform_i( scaler, scaler_num );
168+
break;
169+
}
170+
break;
171+
//case SDL_WINDOWEVENT:
172+
// SDL_updateViewport( shader );
173+
}
174+
}
175+
176+
SDL_RenderPresent(renderer);
177+
178+
SDL_SetRenderDrawColor(renderer, 160, 160, 160, 255);
179+
SDL_RenderClear(renderer);
180+
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
181+
182+
}
183+
184+
185+
SDL_destroyShader( shader );
186+
SDL_DestroyTexture( image );
187+
SDL_DestroyRenderer( renderer );
188+
SDL_DestroyWindow( screen );
189+
SDL_Quit();
190+
return 0;
191+
}

0 commit comments

Comments
 (0)