The SDL forums have moved to discourse.libsdl.org.
This is just a read-only archive of the previous forums, to keep old links working.


SDL Forum Index
SDL
Simple Directmedia Layer Forums
SDL-OpenCL code working 70% of the time
zweifel


Joined: 17 Nov 2016
Posts: 3
Hi,

I programmed a code to do convolution in SDL- OpenCL, however it is working only 70% of the time.

Code :
Quote:
#include"SDL2/SDL.h"
#include"SDL2/SDL_image.h"
#include"CL_Interface.h"
 
void printFilter(const float* filter, int filter_size)
{
printf("filter:\n");
int i, j;
for(i=0;i<filter_size;++i)
{
for(j=0;j<filter_size;++j)
{
printf("%.2f ", filter[i*filter_size + j]);
}
printf("\n");
}
 
}
 
 
int main(int argc, char** argv)
{
bool quit= false;
int filter_size=4;
 
SDL_Event event;
 
SDL_Init(SDL_INIT_VIDEO);
 
//ATTENTION: 24bit RGB is not supported by OpenCL!
SDL_Surface* image= IMG_Load("out.png");
int image_height=image->h;
int image_width=image->w;
int bpp = (int) image->format->BytesPerPixel;
std::cout << "Bpp " << bpp << "Size "<< image->w << image->h << std::endl;
 
 
SDL_Window* window= SDL_CreateWindow("Convolution", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1024, 720, 0);
 
SDL_Renderer* renderer= SDL_CreateRenderer(window, -1, 0);
 
SDL_Texture* texture= SDL_CreateTextureFromSurface(renderer, image);
 
printf("Initializing OpenCL...\n");
//opencl
CL_Interface* ocl= new CL_Interface();
ocl->buildProgram("1_test.cl");
Kernel* kernel= new Kernel("convolute", ocl->program);
 
//input image (OpenCL have few supported formats!!! No 24bit RGB!)
const cl::ImageFormat format(CL_RGBA, CL_UNSIGNED_INT8);
 
cl::Image2D in(ocl->context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, format, image_width, image_height, 0, image->pixels);
 
//float* filter= (float*)malloc(sizeof(float)*filter_size*filter_size);
float filter[]=
{ -1, 0, 1,0,
-2, 0, 2,0,
-1, 0, 1,0,
0, 0, 0,0};
printFilter(filter, 4);
cl::Buffer filter_buffer= cl::Buffer(ocl->context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, filter_size*filter_size*sizeof(float), filter);
 
//cl::Image2D out(ocl->context, CL_MEM_WRITE_ONLY, format, image_width, image_height, 0, data2);
cl::Image2D out(ocl->context, CL_MEM_WRITE_ONLY, format, image_width, image_height, 0, NULL);
//cl::Image2D out(ocl->context, CL_MEM_WRITE_ONLY, format, image_width, image_height, 0, image2->pixels);
kernel->kernel.setArg(0, in);
kernel->kernel.setArg(1, out);
kernel->kernel.setArg(2, filter_buffer);
kernel->kernel.setArg(3, filter_size/2);
 
ocl->queue.enqueueNDRangeKernel(kernel->kernel, cl::NullRange, cl::NDRange(image_width, image_height), cl::NullRange);
 
ocl->queue.finish();
 
//start and end coordinates for reading our image
cl::size_t<3> origin;
cl::size_t<3> size;
origin[0] = 0;
origin[1] = 0;
origin[2] = 0;
size[0] = image_width;
size[1] = image_height;
 
size[2] = 1;
 
 
while(!quit)
{
ocl->queue.enqueueReadImage(out, CL_TRUE, origin, size, 0, 0, image->pixels);
 
//SDL_Texture* texture2= SDL_CreateTextureFromSurface(renderer, image);
SDL_UpdateTexture(texture, NULL, image->pixels, image->pitch);
 
SDL_WaitEvent(&event);
 
switch(event.type)
{
case SDL_QUIT:
{
quit=true;
}
break;
}
 
//SDL_RenderCopy(renderer, texture2, NULL, NULL);
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
}
 
SDL_DestroyTexture(texture);
SDL_FreeSurface(image);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
 
SDL_Quit();
 
return 0;
}Both creating an texture and updating a texture give the same results. In other words, inside the code, the four lines below can be toggled without any improvement://SDL_Texture* texture2= SDL_CreateTextureFromSurface(renderer, image);SDL_UpdateTexture(texture, NULL, image->pixels, image->pitch);//SDL_RenderCopy(renderer, texture2, NULL, NULL);
SDL_RenderCopy(renderer, texture, NULL, NULL);Any ideas where the problem may be?








Best,
zweifel


Joined: 17 Nov 2016
Posts: 3
The previous message was sent by email and the formatting makes it terrible to read.
So I am fixing it below.

I programmed a code to do convolution in OpenCL, however it is working only 70% of the time.

Code:

#include"SDL2/SDL.h"
#include"SDL2/SDL_image.h"
#include"CL_Interface.h"
 
void printFilter(const float* filter, int filter_size)
{
   printf("filter:\n");
   int i, j;
   for(i=0;i<filter_size;++i)
   {
      for(j=0;j<filter_size;++j)
      {
         printf("%.2f ", filter[i*filter_size + j]);
      }
      printf("\n");
   }
 
}
 
 
int main(int argc, char** argv)
{
   bool quit= false;
   int filter_size=4;
 
   SDL_Event event;
 
   SDL_Init(SDL_INIT_VIDEO);
 
   //ATTENTION: 24bit RGB is not supported by OpenCL!   
   SDL_Surface* image= IMG_Load("out.png");
   int image_height=image->h;
   int image_width=image->w;
   int bpp = (int) image->format->BytesPerPixel;
   std::cout << "Bpp " << bpp << "Size "<< image->w << image->h << std::endl;
 
 
   SDL_Window* window= SDL_CreateWindow("Convolution", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1024, 720, 0);
 
   SDL_Renderer* renderer= SDL_CreateRenderer(window, -1, 0);
 
   SDL_Texture* texture= SDL_CreateTextureFromSurface(renderer, image);
 
   printf("Initializing OpenCL...\n");
   //opencl
   CL_Interface* ocl= new CL_Interface();
   ocl->buildProgram("1_test.cl");
   Kernel* kernel= new Kernel("convolute", ocl->program);
 
        //input image (OpenCL have few supported formats!!! No 24bit RGB!)
   const cl::ImageFormat format(CL_RGBA, CL_UNSIGNED_INT8);
 
   cl::Image2D in(ocl->context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, format, image_width, image_height, 0, image->pixels);
 
   //float* filter= (float*)malloc(sizeof(float)*filter_size*filter_size);
   float filter[]=
   { -1, 0, 1,0,
     -2, 0, 2,0,
     -1, 0, 1,0,
     0, 0, 0,0};
   printFilter(filter, 4);
   cl::Buffer filter_buffer= cl::Buffer(ocl->context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, filter_size*filter_size*sizeof(float), filter);
 
   //cl::Image2D out(ocl->context, CL_MEM_WRITE_ONLY, format, image_width, image_height, 0, data2);
   cl::Image2D out(ocl->context, CL_MEM_WRITE_ONLY, format, image_width, image_height, 0, NULL);
   //cl::Image2D out(ocl->context, CL_MEM_WRITE_ONLY, format, image_width, image_height, 0, image2->pixels);
   kernel->kernel.setArg(0, in);
   kernel->kernel.setArg(1, out);
   kernel->kernel.setArg(2, filter_buffer);
   kernel->kernel.setArg(3, filter_size/2);
 
   ocl->queue.enqueueNDRangeKernel(kernel->kernel, cl::NullRange, cl::NDRange(image_width, image_height), cl::NullRange);
 
   ocl->queue.finish();
 
   //start and end coordinates for reading our image
   cl::size_t<3> origin;
   cl::size_t<3> size;
   origin[0] = 0;
   origin[1] = 0;
   origin[2] = 0;
   size[0] = image_width;
   size[1] = image_height;
 
   size[2] = 1;
 
 
   while(!quit)
   {
      ocl->queue.enqueueReadImage(out, CL_TRUE, origin, size, 0, 0, image->pixels);
 
      //SDL_Texture* texture2= SDL_CreateTextureFromSurface(renderer, image);
      SDL_UpdateTexture(texture, NULL, image->pixels, image->pitch);
 
      SDL_WaitEvent(&event);
 
      switch(event.type)
      {
         case SDL_QUIT:
         {
            quit=true;
         }
         break;
      }
 
      //SDL_RenderCopy(renderer, texture2, NULL, NULL);
      SDL_RenderCopy(renderer, texture, NULL, NULL);
      SDL_RenderPresent(renderer);
   }
 
   SDL_DestroyTexture(texture);
   SDL_FreeSurface(image);
   SDL_DestroyRenderer(renderer);
   SDL_DestroyWindow(window);
 
   SDL_Quit();
 
   return 0;
}


Any ideas why sometimes I get a nearly blank screen and sometimes I get the filtered image?