GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
ARGBや YCBCR や Grayscale 等、PixelFormat を動的に変えたくて、DisplayBase::Graphics_Read_Setting() を呼び出していたんですが、同じレイヤーで複数回呼び出すとエラーが発生して呼べなくて土日はまりました。
じっくりソースを追っていくと、内部的にリソースを管理していて、そのリソースの解放が出来ずに状態不一致を起こしている様です。
管理しているリソースを開放しそうな唯一の関数 DisplayBase::Graphics_Stop() を呼んでみましたが、やはり同じでした。
そのリソースを開放しているのは、とさらに潜ってみたのですがdrivers\vdc\src\r_vdc.c の R_VDC_ReleaseDataControl() という関数で開放しているのが、名前的にもリソースの開放箇所なのかと思ったのですが、 grep した限り誰も呼んでいないようです。(共通ソースなのでおそらく Peach や Lychee も同じかと思います。)
どこかに設計通りになっていない部分や抜けがないか、確認いただけませんでしょうか?
修正が正しいかはわかりませんが、下記の赤字箇所の様にStopを呼んだときに強引に状態を書き換えると、複数回呼び出せて設定を切り替えることができる様になりました。
vdc_error_t R_VDC_StopProcess (const vdc_channel_t ch, const vdc_layer_id_t layer_id){ vdc_error_t ret; vdc_resource_state_t rsrc_state; ret = VDC_OK;#ifdef R_VDC_CHECK_PARAMETERS ret = VDC_StopProcessCheckPrm(ch, layer_id);#endif /* R_VDC_CHECK_PARAMETERS */ if (ret == VDC_OK) { /* Resource checks */ if (layer_id != VDC_LAYER_ID_ALL) { rsrc_state = VDC_ShrdPrmGetRwProcEnabled(layer_id); if (rsrc_state == VDC_RESOURCE_ST_INVALID) { /* The specified layer is invalid. */ ret = VDC_ERR_RESOURCE_LAYER; } } } if (ret == VDC_OK) { /* Setting VDC registers */ VDC_StopProcess(layer_id);#if 1 // TakSanFixed start VDC_ShrdPrmSetRwProcDisable(layer_id); VDC_ShrdPrmSetLayerResource(layer_id, VDC_RESOURCE_ST_INVALID);#endif // TakSanFixed end } return ret;} /* End of function R_VDC_StopSurface() */