/*
 * Copyright 2010 Red Hat Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * on the rights to use, copy, modify, merge, publish, distribute, sub
 * license, and/or sell copies of the Software, and to permit persons to whom
 * the Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
 * USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
#include <stdio.h>
#include <errno.h>
#include "pipe/p_defines.h"
#include "pipe/p_state.h"
#include "pipe/p_context.h"
#include "pipe/p_screen.h"
#include "util/u_memory.h"
#include "util/u_inlines.h"
#include "util/u_format.h"
#include "util/u_upload_mgr.h"
#include "noop_public.h"

DEBUG_GET_ONCE_BOOL_OPTION(noop, "GALLIUM_NOOP", FALSE)

void noop_init_state_functions(struct pipe_context *ctx);

struct noop_pipe_screen {
   struct pipe_screen	pscreen;
   struct pipe_screen	*oscreen;
};

/*
 * query
 */
struct noop_query {
   unsigned	query;
};
static struct pipe_query *noop_create_query(struct pipe_context *ctx, unsigned query_type, unsigned index)
{
   struct noop_query *query = CALLOC_STRUCT(noop_query);

   return (struct pipe_query *)query;
}

static void noop_destroy_query(struct pipe_context *ctx, struct pipe_query *query)
{
   FREE(query);
}

static boolean noop_begin_query(struct pipe_context *ctx, struct pipe_query *query)
{
   return true;
}

static bool noop_end_query(struct pipe_context *ctx, struct pipe_query *query)
{
   return true;
}

static boolean noop_get_query_result(struct pipe_context *ctx,
                                     struct pipe_query *query,
                                     boolean wait,
                                     union pipe_query_result *vresult)
{
   uint64_t *result = (uint64_t*)vresult;

   *result = 0;
   return TRUE;
}

static void
noop_set_active_query_state(struct pipe_context *pipe, boolean enable)
{
}


/*
 * resource
 */
struct noop_resource {
   struct pipe_resource	base;
   unsigned		size;
   char			*data;
   struct sw_displaytarget	*dt;
};

static struct pipe_resource *noop_resource_create(struct pipe_screen *screen,
                                                  const struct pipe_resource *templ)
{
   struct noop_resource *nresource;
   unsigned stride;

   nresource = CALLOC_STRUCT(noop_resource);
   if (!nresource)
      return NULL;

   stride = util_format_get_stride(templ->format, templ->width0);
   nresource->base = *templ;
   nresource->base.screen = screen;
   nresource->size = stride * templ->height0 * templ->depth0;
   nresource->data = MALLOC(nresource->size);
   pipe_reference_init(&nresource->base.reference, 1);
   if (nresource->data == NULL) {
      FREE(nresource);
      return NULL;
   }
   return &nresource->base;
}

static struct pipe_resource *noop_resource_from_handle(struct pipe_screen *screen,
                                                       const struct pipe_resource *templ,
                                                       struct winsys_handle *handle,
                                                       unsigned usage)
{
   struct noop_pipe_screen *noop_screen = (struct noop_pipe_screen*)screen;
   struct pipe_screen *oscreen = noop_screen->oscreen;
   struct pipe_resource *result;
   struct pipe_resource *noop_resource;

   result = oscreen->resource_from_handle(oscreen, templ, handle, usage);
   noop_resource = noop_resource_create(screen, result);
   pipe_resource_reference(&result, NULL);
   return noop_resource;
}

static boolean noop_resource_get_handle(struct pipe_screen *pscreen,
                                        struct pipe_context *ctx,
                                        struct pipe_resource *resource,
                                        struct winsys_handle *handle,
                                        unsigned usage)
{
   struct noop_pipe_screen *noop_screen = (struct noop_pipe_screen*)pscreen;
   struct pipe_screen *screen = noop_screen->oscreen;
   struct pipe_resource *tex;
   bool result;

   /* resource_get_handle musn't fail. Just create something and return it. */
   tex = screen->resource_create(screen, resource);
   if (!tex)
      return false;

   result = screen->resource_get_handle(screen, NULL, tex, handle, usage);
   pipe_resource_reference(&tex, NULL);
   return result;
}

static void noop_resource_destroy(struct pipe_screen *screen,
                                  struct pipe_resource *resource)
{
   struct noop_resource *nresource = (struct noop_resource *)resource;

   FREE(nresource->data);
   FREE(resource);
}


/*
 * transfer
 */
static void *noop_transfer_map(struct pipe_context *pipe,
                               struct pipe_resource *resource,
                               unsigned level,
                               enum pipe_transfer_usage usage,
                               const struct pipe_box *box,
                               struct pipe_transfer **ptransfer)
{
   struct pipe_transfer *transfer;
   struct noop_resource *nresource = (struct noop_resource *)resource;

   transfer = CALLOC_STRUCT(pipe_transfer);
   if (!transfer)
      return NULL;
   pipe_resource_reference(&transfer->resource, resource);
   transfer->level = level;
   transfer->usage = usage;
   transfer->box = *box;
   transfer->stride = 1;
   transfer->layer_stride = 1;
   *ptransfer = transfer;

   return nresource->data;
}

static void noop_transfer_flush_region(struct pipe_context *pipe,
                                       struct pipe_transfer *transfer,
                                       const struct pipe_box *box)
{
}

static void noop_transfer_unmap(struct pipe_context *pipe,
                                struct pipe_transfer *transfer)
{
   pipe_resource_reference(&transfer->resource, NULL);
   FREE(transfer);
}

static void noop_buffer_subdata(struct pipe_context *pipe,
                                struct pipe_resource *resource,
                                unsigned usage, unsigned offset,
                                unsigned size, const void *data)
{
}

static void noop_texture_subdata(struct pipe_context *pipe,
                                 struct pipe_resource *resource,
                                 unsigned level,
                                 unsigned usage,
                                 const struct pipe_box *box,
                                 const void *data,
                                 unsigned stride,
                                 unsigned layer_stride)
{
}


/*
 * clear/copy
 */
static void noop_clear(struct pipe_context *ctx, unsigned buffers,
                       const union pipe_color_union *color, double depth, unsigned stencil)
{
}

static void noop_clear_render_target(struct pipe_context *ctx,
                                     struct pipe_surface *dst,
                                     const union pipe_color_union *color,
                                     unsigned dstx, unsigned dsty,
                                     unsigned width, unsigned height,
                                     bool render_condition_enabled)
{
}

static void noop_clear_depth_stencil(struct pipe_context *ctx,
                                     struct pipe_surface *dst,
                                     unsigned clear_flags,
                                     double depth,
                                     unsigned stencil,
                                     unsigned dstx, unsigned dsty,
                                     unsigned width, unsigned height,
                                     bool render_condition_enabled)
{
}

static void noop_resource_copy_region(struct pipe_context *ctx,
                                      struct pipe_resource *dst,
                                      unsigned dst_level,
                                      unsigned dstx, unsigned dsty, unsigned dstz,
                                      struct pipe_resource *src,
                                      unsigned src_level,
                                      const struct pipe_box *src_box)
{
}


static void noop_blit(struct pipe_context *ctx,
                      const struct pipe_blit_info *info)
{
}


static void
noop_flush_resource(struct pipe_context *ctx,
                    struct pipe_resource *resource)
{
}


/*
 * context
 */
static void noop_flush(struct pipe_context *ctx,
                       struct pipe_fence_handle **fence,
                       unsigned flags)
{
   if (fence)
      *fence = NULL;
}

static void noop_destroy_context(struct pipe_context *ctx)
{
   if (ctx->stream_uploader)
      u_upload_destroy(ctx->stream_uploader);

   FREE(ctx);
}

static boolean noop_generate_mipmap(struct pipe_context *ctx,
                                    struct pipe_resource *resource,
                                    enum pipe_format format,
                                    unsigned base_level,
                                    unsigned last_level,
                                    unsigned first_layer,
                                    unsigned last_layer)
{
   return true;
}

static struct pipe_context *noop_create_context(struct pipe_screen *screen,
                                                void *priv, unsigned flags)
{
   struct pipe_context *ctx = CALLOC_STRUCT(pipe_context);

   if (!ctx)
      return NULL;

   ctx->screen = screen;
   ctx->priv = priv;

   ctx->stream_uploader = u_upload_create_default(ctx);
   if (!ctx->stream_uploader) {
      FREE(ctx);
      return NULL;
   }
   ctx->const_uploader = ctx->stream_uploader;

   ctx->destroy = noop_destroy_context;
   ctx->flush = noop_flush;
   ctx->clear = noop_clear;
   ctx->clear_render_target = noop_clear_render_target;
   ctx->clear_depth_stencil = noop_clear_depth_stencil;
   ctx->resource_copy_region = noop_resource_copy_region;
   ctx->generate_mipmap = noop_generate_mipmap;
   ctx->blit = noop_blit;
   ctx->flush_resource = noop_flush_resource;
   ctx->create_query = noop_create_query;
   ctx->destroy_query = noop_destroy_query;
   ctx->begin_query = noop_begin_query;
   ctx->end_query = noop_end_query;
   ctx->get_query_result = noop_get_query_result;
   ctx->set_active_query_state = noop_set_active_query_state;
   ctx->transfer_map = noop_transfer_map;
   ctx->transfer_flush_region = noop_transfer_flush_region;
   ctx->transfer_unmap = noop_transfer_unmap;
   ctx->buffer_subdata = noop_buffer_subdata;
   ctx->texture_subdata = noop_texture_subdata;
   noop_init_state_functions(ctx);

   return ctx;
}


/*
 * pipe_screen
 */
static void noop_flush_frontbuffer(struct pipe_screen *_screen,
                                   struct pipe_resource *resource,
                                   unsigned level, unsigned layer,
                                   void *context_private, struct pipe_box *box)
{
}

static const char *noop_get_vendor(struct pipe_screen* pscreen)
{
   return "X.Org";
}

static const char *noop_get_device_vendor(struct pipe_screen* pscreen)
{
   return "NONE";
}

static const char *noop_get_name(struct pipe_screen* pscreen)
{
   return "NOOP";
}

static int noop_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
{
   struct pipe_screen *screen = ((struct noop_pipe_screen*)pscreen)->oscreen;

   return screen->get_param(screen, param);
}

static float noop_get_paramf(struct pipe_screen* pscreen,
                             enum pipe_capf param)
{
   struct pipe_screen *screen = ((struct noop_pipe_screen*)pscreen)->oscreen;

   return screen->get_paramf(screen, param);
}

static int noop_get_shader_param(struct pipe_screen* pscreen,
                                 enum pipe_shader_type shader,
                                 enum pipe_shader_cap param)
{
   struct pipe_screen *screen = ((struct noop_pipe_screen*)pscreen)->oscreen;

   return screen->get_shader_param(screen, shader, param);
}

static int noop_get_compute_param(struct pipe_screen *pscreen,
                                  enum pipe_shader_ir ir_type,
                                  enum pipe_compute_cap param,
                                  void *ret)
{
   struct pipe_screen *screen = ((struct noop_pipe_screen*)pscreen)->oscreen;

   return screen->get_compute_param(screen, ir_type, param, ret);
}

static boolean noop_is_format_supported(struct pipe_screen* pscreen,
                                        enum pipe_format format,
                                        enum pipe_texture_target target,
                                        unsigned sample_count,
                                        unsigned usage)
{
   struct pipe_screen *screen = ((struct noop_pipe_screen*)pscreen)->oscreen;

   return screen->is_format_supported(screen, format, target, sample_count, usage);
}

static uint64_t noop_get_timestamp(struct pipe_screen *pscreen)
{
   return 0;
}

static void noop_destroy_screen(struct pipe_screen *screen)
{
   struct noop_pipe_screen *noop_screen = (struct noop_pipe_screen*)screen;
   struct pipe_screen *oscreen = noop_screen->oscreen;

   oscreen->destroy(oscreen);
   FREE(screen);
}

static void noop_fence_reference(struct pipe_screen *screen,
                          struct pipe_fence_handle **ptr,
                          struct pipe_fence_handle *fence)
{
}

static boolean noop_fence_finish(struct pipe_screen *screen,
                                 struct pipe_context *ctx,
                                 struct pipe_fence_handle *fence,
                                 uint64_t timeout)
{
   return true;
}

static void noop_query_memory_info(struct pipe_screen *pscreen,
                                   struct pipe_memory_info *info)
{
   struct noop_pipe_screen *noop_screen = (struct noop_pipe_screen*)pscreen;
   struct pipe_screen *screen = noop_screen->oscreen;

   screen->query_memory_info(screen, info);
}

struct pipe_screen *noop_screen_create(struct pipe_screen *oscreen)
{
   struct noop_pipe_screen *noop_screen;
   struct pipe_screen *screen;

   if (!debug_get_option_noop()) {
      return oscreen;
   }

   noop_screen = CALLOC_STRUCT(noop_pipe_screen);
   if (!noop_screen) {
      return NULL;
   }
   noop_screen->oscreen = oscreen;
   screen = &noop_screen->pscreen;

   screen->destroy = noop_destroy_screen;
   screen->get_name = noop_get_name;
   screen->get_vendor = noop_get_vendor;
   screen->get_device_vendor = noop_get_device_vendor;
   screen->get_param = noop_get_param;
   screen->get_shader_param = noop_get_shader_param;
   screen->get_compute_param = noop_get_compute_param;
   screen->get_paramf = noop_get_paramf;
   screen->is_format_supported = noop_is_format_supported;
   screen->context_create = noop_create_context;
   screen->resource_create = noop_resource_create;
   screen->resource_from_handle = noop_resource_from_handle;
   screen->resource_get_handle = noop_resource_get_handle;
   screen->resource_destroy = noop_resource_destroy;
   screen->flush_frontbuffer = noop_flush_frontbuffer;
   screen->get_timestamp = noop_get_timestamp;
   screen->fence_reference = noop_fence_reference;
   screen->fence_finish = noop_fence_finish;
   screen->query_memory_info = noop_query_memory_info;

   return screen;
}
